A kérési módszer nem támogatott (405) tavasszal
1. Áttekintés
Ez a rövid cikk egy gyakori hibára összpontosít - ‘A kérési módszer nem támogatott - 405’ -, amellyel a fejlesztők szembesülnek, miközben a Spring MVC-vel teszik közzé API-kat bizonyos HTTP-igékhez.
Természetesen megvitatjuk a hiba gyakori okait is.
2. A módszer kérésének alapjai
Mielőtt továbblépne a gyakori probléma felé, ha még csak most kezdi megismerni a Spring MVC-t, itt van egy jó bevezető cikk, amellyel kezdhetem.
Vessünk egy nagyon gyors pillantást az alapokra - és ismerjük meg a Spring által támogatott kérési módszereket és az itt található általános osztályokat.
Nagyon egyszerűsítve az MVC HTTP metódusok olyan alapvető műveletek, amelyeket egy kérés kiválthat a szerveren. Például néhány módszer elhozni a szerverről származó adatokat, néhányat Beküldés adatokat a szerverre, néhányan talán töröl az adatok stb.
A @RequestMapping kommentár meghatározza a kérelem támogatott módszereit.
Spring az összes támogatott kérési módszert felsorolja RequestMethod; meghatározza a szabványt GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE igék.
A tavasz DispatcherServlet alapértelmezés szerint mindegyiket támogatja, kivéve OPCIÓK és NYOM; @RequestMapping használja a RequestMethod enum a támogatott módszerek meghatározásához.
3. Egyszerű MVC-forgatókönyv
Most nézzünk meg egy kódpéldát, amely az összes HTTP metódust feltérképezi:
@RestController @RequestMapping (value = "/ api") public class RequestMethodController {@Autowired private EmployeeService szolgáltatás; @RequestMapping (érték = "/ alkalmazottak", termel = "alkalmazás / json") nyilvános lista findEmployees () dobja InvalidRequestException {return service.getEmployeeList (); }}
Figyelje meg, hogyan deklarálja a példa findEmployee () módszer. Nem határoz meg külön kérési módszert, ami azt jelenti, hogy ez az URL támogatja az összes alapértelmezett módszert.
Kérhetjük az API-t különböző támogatott módszerekkel, például curl használatával:
$ curl --request POST // localhost: 8080 / api / alkalmazottak [{"id": 100, "name": "Steve Martin", "contactNumber": "333-777-999"}, {"id": 200, "név": "Adam Schawn", "contactNumber": "444-111-777"}]
Természetesen többféle módon is elküldhetjük a kérést - egyszerű módon becsavar parancs, Postás, AJAX stb.
És természetesen arra számítunk, hogy megszerezzük 200 OK válasz, ha a kérés helyesen van feltérképezve és sikeres.
4. Probléma forgatókönyv - a HTTP 405
De amiről itt beszélünk, az természetesen azok a forgatókönyvek, amikor a kérés nem lesz sikeres.
‘405 A módszer nem engedélyezett’Az egyik leggyakoribb hiba, amelyet a tavaszi kérésekkel való munka során észlelünk.
Vizsgáljuk meg, mi történik, ha a GET-kéréseket kifejezetten meghatározzuk és kezeljük a Spring MVC-ben, így:
@RequestMapping (érték = "/ alkalmazottak", termel = "alkalmazás / json", módszer = RequestMethod.GET) nyilvános lista findEmployees () {...} // küldje el a PUT kérést a CURL $ curl használatával - kérelem localhost: 8080 / api / alkalmazottak {"időbélyeg": 1539720588712, "állapot": 405, "hiba": "A módszer nem engedélyezett", "kivétel": "org.springframework.web.HttpRequestMethodNotSupportedException", "message": "Kérés "PUT" módszer nem támogatott "," elérési út ":" / api / alkalmazottak "}
5. 405 Nem támogatott - ok, megoldás
Amit ebben az előző forgatókönyvben kapunk, az a 405-ös állapotkóddal ellátott HTTP-válasz - kliens hiba, amely azt jelzi, hogy a szerver nem támogatja a kérelemben elküldött metódust / igét.
Amint a neve itt sugallja, a hiba oka a kérés nem támogatott módszerrel történő elküldése.
Ahogy számítani lehet rá, megoldhatjuk ezt úgy, hogy definiáljuk a PUT explicit leképezését a meglévő módszer-leképezésben:
@RequestMapping (érték = "/ alkalmazottak", = = alkalmazás / json, módszer = {RequestMethod.GET, RequestMethod.PUT}) ...
Alternatív megoldásként külön definiálhatjuk az új módszert / leképezést:
@RequestMapping (érték = "/ alkalmazottak", = = alkalmazás / json, módszer = RequestMethod.PUT) public list PostEmployees () ...
6. Következtetés
A request metódus / ige kritikus szempont a HTTP kommunikációban, és vigyáznunk kell a szerver oldalon definiált műveletek pontos szemantikájára, majd a pontos kérésekre, amelyeket küldünk.
És mint mindig, az ebben a cikkben bemutatott példák a GitHubon keresztül elérhetők.