HttpMediaTypeNotAcceptableException na jar MVC
1. Prehľad
V tomto rýchlom článku sa pozrieme na HttpMediaTypeNotAcceptableException výnimkou a rozumieme prípadom, kedy by sme sa s tým mohli stretnúť.
2. Problém
Pri implementácii koncového bodu API s programom Spring musíme všeobecne špecifikovať spotrebované / vyrobené typy médií (prostredníctvom servera spotrebúva a vyrába parametre). Tým sa zúžia možné formáty, ktoré rozhranie API vráti klientovi pre konkrétnu operáciu.
HTTP má tiež vyhradené "Súhlasiť" hlavička - slúži na špecifikáciu typov médií, ktoré klient rozpozná a môže ich akceptovať. Jednoducho povedané, server pošle späť reprezentáciu prostriedkov pomocou jedného z typov médií, ktoré klient požadoval.
Ak však neexistuje spoločný typ, s ktorým môžu obe strany pracovať, Spring hodí HttpMediaTypeNotAcceptableException výnimkou.
3. Praktický príklad
Vytvorme si jednoduchý príklad, ktorý demonštruje tento scenár.
Budeme používať koncový bod POST - s ktorým je možné pracovať iba „Prihláška /json“ a vráti tiež dáta JSON:
@PostMapping (value = "/ test", consumes = MediaType.APPLICATION_JSON_VALUE, produce = MediaType.APPLICATION_JSON_VALUE) public Map example () {return Collections.singletonMap ("key", "value"); }
Potom pošleme žiadosť pomocou CURL s nerozpoznaným typom obsahu:
curl -X POST --header "Accept: application / pdf" // localhost: 8080 / test -v> POST / test HTTP / 1.1> Host: localhost: 8080> User-Agent: curl / 7.51.0> Accept: application / pdf
Odpoveď, ktorú sme dostali, je:
<HTTP / 1.1 406 <Dĺžka obsahu: 0
4. Riešenie
Existuje iba jeden spôsob riešenia problému - odoslanie / prijatie jedného z podporovaných typov.
Všetko, čo môžeme urobiť, je poskytnúť popisnejšiu správu (štandardne Spring vracia prázdne telo) s zvykom ExceptionHandler upozornenie klienta na všetky prijateľné typy médií.
V našom prípade je to iba „Application / json“:
@ResponseBody @ExceptionHandler (HttpMediaTypeNotAcceptableException.class) public String handleHttpMediaTypeNotAcceptableException () {návrat "prijateľný typ MIME:" + MediaType.APPLICATION_JSON_VALUE; }
5. Záver
V tomto návode sme zvážili HttpMediaTypeNotAcceptableException výnimka vyvolaná Spring MVC, keď existuje nesúlad medzi tým, čo klient požaduje, a tým, čo server môže skutočne vyrobiť.
Útržky kódu uvedené v článku nájdete ako vždy v našom úložisku GitHub.