جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی


در این بخش خواهیم دید که چطور میتوان به فیلد های Http Header در Spring REST Controller دسترسی پیدا کرد و مقادیر آنها را دریافت کرد



خواندن مقادیر توسط RequestHeader@ :


اگر نام خاصی از هدر ها را در نظر داریم میتوان صراحتا آنرا پاس داد و در متغییر String مربوطه مقدار انرا دریافت کرد 

@GetMapping("/greeting")
public ResponseEntity<String> greeting(@RequestHeader("accept-language") String language) {
    // code that uses the language variable
    return new ResponseEntity<String>(greeting, HttpStatus.OK);
}

اگر مقدار فیلدی از نوع عددی بود میتوان بجای String از نوع اعداد استفاده کرد :

@GetMapping("/double")
public ResponseEntity<String> doubleNumber(@RequestHeader("my-number") int myNumber) {
    return new ResponseEntity<String>(String.format("%d * 2 = %d", 
      myNumber, (myNumber * 2)), HttpStatus.OK);
}


دریافت کردن کلیه فیلد ها بصورت Map : 

@GetMapping("/listHeaders")
public ResponseEntity<String> listAllHeaders(
  @RequestHeader Map<String, String> headers) {
    headers.forEach((key, value) -> {
        LOG.info(String.format("Header '%s' = %s", key, value));
    });
 
    return new ResponseEntity<String>(
      String.format("Listed %d headers", headers.size()), HttpStatus.OK);
}


اگر مقادیر را در قالب Map دریافت کنیم و یکی از فیلد ها دارای چندین مقدار باشد چگونه باید آنرا دریافت کنیم ؟ 

جواب استفاده از MultiValueMap است :

@GetMapping("/multiValue")
public ResponseEntity<String> multiValue(
  @RequestHeader MultiValueMap<String, String> headers) {
    headers.forEach((key, value) -> {
        LOG.info(String.format(
          "Header '%s' = %s", key, value.stream().collect(Collectors.joining("|"))));
    });
         
    return new ResponseEntity<String>(
      String.format("Listed %d headers", headers.size()), HttpStatus.OK);
}


همچنین میتوان کلیه Header ها را در قالب ابجکت HttpHeaders دریافت کرد:

@GetMapping("/getBaseUrl")
public ResponseEntity<String> getBaseUrl(@RequestHeader HttpHeaders headers) {
    InetSocketAddress host = headers.getHost();
    String url = "http://" + host.getHostName() + ":" + host.getPort();
    return new ResponseEntity<String>(String.format("Base URL = %s", url), HttpStatus.OK);
}

ابجکت HttpHeaders برای سایر اپلیکیشن ها هم بصورت استاندارد قابل استفاده است 


* در هر سه صورت استفاده از Map , MultiValueMap و HttpHeaders اگر مقدار فیلدی null بود نشان دهنده آن است که آن فیلد موجود نیست



در بالا دیدیم که میتوان توسط کد زیر مقادیری را از header استخراج کنیم :

public ResponseEntity<String> greeting(@RequestHeader("accept-language") String language) {}

و همچنین میتوانیم صراحتا از name برای مشخص کردن نام فیلد هم استفاده کنیم :

public ResponseEntity<String> greeting(
  @RequestHeader(name = "accept-language") String language) {}

از value هم میتوان استفاده کرد که مشابه name است :

public ResponseEntity<String> greeting(
  @RequestHeader(value = "accept-language") String language) {}



وقتی ما نام header ای را مشخص میکنم آن فیلد بودنش بصورت پیش فرض اجباری است و اگر نبود کد وضعیت 400 برگشت داده میشود که میتوانیم آنرا false کنیم :

در این حالت نیاز است که null بودن انرا در صورتی که آن فیلد موجود نبود بررسی شود

@GetMapping("/nonRequiredHeader")
public ResponseEntity<String> evaluateNonRequiredHeader(
  @RequestHeader(value = "optional-header", required = false) String optionalHeader) {
    return new ResponseEntity<String>(String.format(
      "Was the optional header present? %s!",
        (optionalHeader == null ? "No" : "Yes")),HttpStatus.OK);
}



میتوانیم در صورتی که ان فیلد مقداری نداشت یا null بود یک مقدار پیش فرض بدهیم :

@GetMapping("/default")
public ResponseEntity<String> evaluateDefaultHeaderValue(
  @RequestHeader(value = "optional-header", defaultValue = "3600") int optionalHeader) {
    return new ResponseEntity<String>(
      String.format("Optional Header is %d", optionalHeader), HttpStatus.OK);
}







نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی