در این بخش خواهیم دید که چطور میتوان به فیلد های 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);
}