Način zahtjeva nije podržan (405) u proljeće

1. Pregled

Ovaj je kratki članak usredotočen na uobičajenu pogrešku - "Metoda zahtjeva nije podržana - 405" - s kojom se programeri suočavaju dok izlažu svoje API-je za određene HTTP glagole, s Spring MVC-om.

Naravno, razgovarat ćemo i o uobičajenim uzrocima ove pogreške.

2. Osnove metode zahtjeva

Prije nego što krenete prema uobičajenom problemu, ako tek počinjete učiti o Spring MVC-u, evo dobrog uvodnog članka za početak.

Idemo također vrlo brzo pogledati osnove - i razumjeti metode zahtjeva koje podržava Spring i neke od uobičajenih klasa od interesa ovdje.

Na vrlo pojednostavljen način, MVC HTTP metode su osnovne operacije koje zahtjev može pokrenuti na poslužitelju. Na primjer, neke metode donijeti podatke s poslužitelja, neke podnijeti podatke na poslužitelj, neki bi mogli izbrisati podaci itd.

The Bilješka @RequestMapping određuje podržane metode za zahtjev.

Spring deklarira sve podržane metode zahtjeva pod enumom RequestMethod; određuje standard GET, HEAD, POST, STAVITE, PATCH, DELETE, OPTIONS, TRACE glagoli.

Proljeće DispatcherServlet podržava ih sve prema zadanim postavkama, osim OPCIJE i TRAG; @RequestMapping koristi Nabrajanje RequestMethod za određivanje podržanih metoda.

3. Jednostavan MVC scenarij

Sada, pogledajmo primjer koda koji preslikava sve HTTP metode:

@RestController @RequestMapping (value = "/ api") javna klasa RequestMethodController {@Autowired privatna usluga EmployeeService; @RequestMapping (value = "/ zaposlenici", proizvodi = "application / json") javni popis findEfficiees () baca InvalidRequestException {return service.getEfficieeList (); }}

Primijetite kako primjer izjavljuje findEfficiee () metoda. Ne navodi nijednu specifičnu metodu zahtjeva, što znači da ovaj URL podržava sve zadane metode.

API možemo zatražiti pomoću različitih podržanih metoda, na primjer, koristeći curl:

$ curl --request POST // localhost: 8080 / api / zaposlenici [{"id": 100, "name": "Steve Martin", "contactNumber": "333-777-999"}, {"id": 200, "name": "Adam Schawn", "contactNumber": "444-111-777"}]

Naravno, zahtjev možemo poslati na više načina - na jednostavan način kovrča zapovjedništvo, poštar, AJAX itd.

I, naravno, očekujemo da ćemo dobiti 200 OK odgovor, ako je zahtjev pravilno mapiran i uspješan.

4. Scenarij problema - HTTP 405

Ali ono o čemu ovdje raspravljamo jesu - naravno - scenariji kada zahtjev neće biti uspješan.

405 Metoda nije dopuštena’Jedna je od najčešćih pogrešaka koje uočavamo tijekom rada s proljetnim zahtjevima.

Pogledajmo što se događa ako posebno definiramo i obrađujemo GET zahtjeve u Spring MVC, ovako:

@RequestMapping (value = "/ zaposlenici", proizvodi = "application / json", method = RequestMethod.GET) javni popis findEfficiees () {...} // pošaljite zahtjev za PUT pomoću CURL $ curl --request PUT // localhost: 8080 / api / zaposlenici {"timestamp": 1539720588712, "status": 405, "error": "Metoda nije dopuštena", "iznimka": "org.springframework.web.HttpRequestMethodNotSupportedException", "message": "Zahtjev metoda 'PUT' nije podržana "," put ":" / api / zaposlenici "} 

5. 405 Nije podrška - razlog, rješenje

U ovom prethodnom scenariju dobivamo HTTP odgovor sa statusnim kodom 405 - greška klijenta koja ukazuje da poslužitelj ne podržava metodu / glagol poslan u zahtjevu.

Kao što ime sugerira ovdje, razlog ove pogreške je slanje zahtjeva nepodržanom metodom.

Kao što možete očekivati, to možemo riješiti definiranjem eksplicitnog mapiranja za PUT, u postojećem mapiranju metode:

@RequestMapping (value = "/ zaposlenici", proizvodi = "application / json", method = {RequestMethod.GET, RequestMethod.PUT}) ...

Alternativno, novu metodu / mapiranje možemo definirati odvojeno:

@RequestMapping (value = "/ zaposlenici", proizvodi = "application / json", method = RequestMethod.PUT) javni popis postE Employees () ... 

6. Zaključak

Metoda zahtjeva / glagol je presudan aspekt u HTTP komunikaciji i moramo biti oprezni s točnom semantikom operacija koje definiramo na strani poslužitelja, a zatim s točnim zahtjevima koje šaljemo.

Kao i uvijek, primjeri prikazani u ovom članku dostupni su na više od GitHub-a.