Ako čítať hlavičky HTTP na jar v radičoch REST
1. Úvod
V tomto rýchlom výučbe sa pozrieme na to, ako získať prístup k hlavičkám HTTP v Spring Rest Controller.
Najprv použijeme @RequestHeader anotáciu na čítanie hlavičiek jednotlivo aj spolu.
Potom sa podrobnejšie pozrieme na @RequestHeaderAtribúty.
2. Prístup k hlavičkám HTTP
2.1. Individuálne
Ak potrebujeme prístup k konkrétnej hlavičke, môžeme nakonfigurovať @RequestHeader s názvom hlavičky:
@GetMapping ("/ pozdrav") public ResponseEntity pozdrav (@RequestHeader ("accept-language") reťazcový jazyk) {// kód, ktorý používa jazykovú premennú, vráti nový ResponseEntity (pozdrav, HttpStatus.OK); }
Potom môžeme získať prístup k hodnote pomocou premennej odovzdanej do našej metódy. Ak je hlavička pomenovaná prijať jazyk sa v požiadavke nenájde, metóda vráti chybu „400 zlých požiadaviek“.
Naše hlavičky nemusia byť reťazce. Napríklad, ak vieme, že naša hlavička je číslo, môžeme našu premennú vyhlásiť za číselný typ:
@GetMapping ("/ double") public ResponseEntity doubleNumber (@RequestHeader ("my-number") int myNumber) {return new ResponseEntity (String.format ("% d * 2 =% d", myNumber, (myNumber * 2)) ), HttpStatus.OK); }
2.2. Naraz
Ak si nie sme istí, ktoré hlavičky budú prítomné, alebo ich v podpise našej metódy potrebujeme viac, ako by sme chceli, môžeme použiť @RequestHeader anotácia bez konkrétneho názvu.
Pre náš typ premennej máme niekoľko možností: a Mapa, a MultiValueMap alebo a HttpHeaders objekt.
Najprv si vezmeme hlavičky žiadosti ako a Mapa:
@GetMapping ("/ listHeaders") public ResponseEntity listAllHeaders (@RequestHeader Map headers) {headers.forEach ((key, value) -> {LOG.info (String.format ("Header '% s' =% s", kľúč , hodnota));}); vrátiť nové ResponseEntity (String.format ("Zoznam% d hlavičiek", headers.size ()), HttpStatus.OK); }
Ak použijeme a Mapa a jedno z hlavičiek má viac ako jednu hodnotu, dostaneme iba prvú hodnotu. Toto je ekvivalent použitia súboru getFirst metóda na a MultiValueMap.
Ak môžu mať naše hlavičky viac hodnôt, môžeme ich získať ako a MultiValueMap:
@GetMapping ("/ multiValue") verejná ResponseEntity multiValue (@RequestHeader MultiValueMap hlavičky) {headers.forEach ((kľúč, hodnota) -> LOG.info (String.format ("Hlavička '% s' =% s", kľúč, value.stream (). collect (Collectors.joining ("); return new ResponseEntity (String.format (" Listed% d headers ", headers.size ()), HttpStatus.OK);}
Môžeme dostať aj svoje hlavičky ako HttpHeaders objekt:
@GetMapping ("/ getBaseUrl") public ResponseEntity getBaseUrl (hlavičky @RequestHeader HttpHeaders) {InetSocketAddress host = headers.getHost (); Reťazec url = "//" + host.getHostName () + ":" + host.getPort (); návrat new ResponseEntity (String.format ("Base URL =% s", url), HttpStatus.OK); }
The HttpHeaders objekt má prístupové práva pre bežné hlavičky aplikácií.
Keď pristupujeme k hlavičke podľa mena z a Mapa, MultiValueMap alebo HttpHeaders objekt, dostaneme nulový ak nie je prítomný.
3. @RequestHeader Atribúty
Teraz, keď sme si prečítali základné informácie o prístupe k hlavičkám požiadaviek pomocou @RequestHeader anotáciu, pozrime sa bližšie na jej atribúty.
Už sme použili názov alebo hodnotu implicitne, keď sme konkrétne pomenovali našu hlavičku:
verejný pozdrav ResponseEntity (@RequestHeader ("accept-language") reťazcový jazyk) {}
To isté môžeme dosiahnuť pomocou názov atribút:
verejný pozdrav ResponseEntity (@RequestHeader (name = "accept-language") reťazcový jazyk) {}
Ďalej použijeme hodnotu atribút úplne rovnakým spôsobom:
verejný pozdrav ResponseEntity (@RequestHeader (value = "accept-language") reťazcový jazyk) {}
Keď konkrétne pomenujeme hlavičku, štandardne je hlavička povinná. Ak sa hlavička v požiadavke nenájde, radič vráti chybu 400.
Použime požadovaný atribút označujúci, že naša hlavička sa nevyžaduje:
@GetMapping ("/ nonRequiredHeader") verejná ResponseEntity evaluateNonRequiredHeader (@RequestHeader (value = "optional-header", required = false) String optionalHeader) {return new ResponseEntity (String.format ("Bola prítomná voliteľná hlavička?% S!" , (optionalHeader == null? "No": "Yes")), HttpStatus.OK); }
Odkedy naša premenná bude nulový ak hlavička nie je v požiadavke, musíme sa uistiť, že robíme správne nulový kontrola.
Použime predvolená hodnota atribút na poskytnutie predvolenej hodnoty pre našu hlavičku:
@GetMapping ("/ default") public ResponseEntity evaluateDefaultHeaderValue (@RequestHeader (value = "optional-header", defaultValue = "3600") int optionalHeader) {return new ResponseEntity (String.format ("Optional Header is% d", optionalHeader ), HttpStatus.OK); }
4. Záver
V tomto krátkom tutoriáli sme sa naučili, ako získať prístup k hlavičkám požiadaviek v radičoch Spring REST. Najprv sme použili @RequestHeader anotácia na dodanie hlavičiek požiadaviek našim metódam radiča.
Po zoznámení sa so základmi sme sa podrobne pozreli na atribúty súboru @RequestHeader anotácia.
Vzorový kód je k dispozícii na serveri GitHub.