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