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.