Anmodningsmetode understøttes ikke (405) om foråret

1. Oversigt

Denne hurtige artikel er fokuseret på en almindelig fejl - 'Anmodningsmetode understøttes ikke - 405' - som udviklere står over for, mens de udsætter deres API'er for specifikke HTTP-verber med Spring MVC.

Naturligvis vil vi også diskutere de almindelige årsager til denne fejl.

2. Grundlæggende om anmodningsmetode

Før du går hen imod det almindelige problem, hvis du lige er begyndt at lære om Spring MVC, er her en god introduktionsartikel til at begynde med.

Lad os også se meget hurtigt på det grundlæggende - og forstå de anmodningsmetoder, der understøttes af Spring og nogle af de almindelige klasser af interesse her.

På en meget forenklet måde er MVC HTTP-metoder grundlæggende operationer, som en anmodning kan udløse på serveren. For eksempel nogle metoder hente dataene fra serveren, nogle Indsend data til serveren, nogle måske slet data osv.

Det @RequestMapping-kommentar angiver de understøttede metoder til anmodningen.

Spring erklærer alle de understøttede anmodningsmetoder under en enum RequestMethod; det specificerer standarden FÅ, HOVED, POST, PUT, PATCH, SLET, INDSTILLINGER, SPOR verb.

Foråret DispatcherServlet understøtter dem alle som standard undtagen MULIGHEDER og SPOR; @RequestMapping bruger RequestMethode enum til angiver, hvilke metoder der understøttes.

3. Simpelt MVC-scenario

Lad os nu se på et kodeeksempel, der kortlægger alle HTTP-metoder:

@RestController @RequestMapping (værdi = "/ api") offentlig klasse RequestMethodController {@Autowired private EmployeeService service; @RequestMapping (værdi = "/ medarbejdere", producerer = "applikation / json") offentlig Liste findEmployees () kaster InvalidRequestException {return service.getEmployeeList (); }}

Bemærk hvordan eksemplet erklærer findEmployee () metode. Det specificerer ikke nogen specifik anmodningsmetode, hvilket betyder, at denne URL understøtter alle standardmetoder.

Vi kan anmode om API ved hjælp af forskellige understøttede metoder, for eksempel ved hjælp af curl:

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

Naturligvis kan vi sende anmodningen på flere måder - via en simpel krølle kommando, postbud, AJAX osv.

Og selvfølgelig forventer vi at få 200 OK svar, hvis anmodningen er korrekt kortlagt og vellykket.

4. Problemscenarie - HTTP 405

Men hvad vi diskuterer her er - naturligvis - scenarierne, når anmodningen ikke bliver vellykket.

405 Metode ikke tilladt”Er en af ​​de mest almindelige fejl, vi observerer, når vi arbejder med forespørgsler fra foråret.

Lad os se på, hvad der sker, hvis vi specifikt definerer og håndterer GET-anmodninger i Spring MVC, som denne:

@RequestMapping (værdi = "/ medarbejdere", producerer = "applikation / json", metode = RequestMethod.GET) offentlig liste findMedarbejdere () {...} // send PUT-anmodningen ved hjælp af CURL $ curl - anmodning PUT // localhost: 8080 / api / ansatte {"tidsstempel": 1539720588712, "status": 405, "error": "Metode ikke tilladt", "undtagelse": "org.springframework.web.HttpRequestMethodNotSupportedException", "meddelelse": "Request metode 'PUT' understøttes ikke "," path ":" / api / ansatte "} 

5. 405 Ikke understøttet - Årsag, løsning

Hvad vi får i dette tidligere scenarie er HTTP-svaret med 405-statuskoden - en klientfejl, der indikerer, at serveren ikke understøtter metoden / verbet, der sendes i anmodningen.

Som navnet antyder her, er årsagen til denne fejl at sende anmodningen med en ikke-understøttet metode.

Som du kan forvente, kan vi løse dette ved at definere en eksplicit kortlægning for PUT i den eksisterende metode kortlægning:

@RequestMapping (værdi = "/ medarbejdere", producerer = "applikation / json", metode = {RequestMethod.GET, RequestMethod.PUT}) ...

Alternativt kan vi definere den nye metode / kortlægning separat:

@RequestMapping (værdi = "/ medarbejdere", producerer = "applikation / json", metode = RequestMethod.PUT) offentlig Liste post Medarbejdere () ... 

6. Konklusion

Anmodningsmetoden / verbet er et kritisk aspekt i HTTP-kommunikation, og vi skal være forsigtige med den nøjagtige semantik af de operationer, vi definerer på serversiden, og derefter med de nøjagtige anmodninger, vi sender ind.

Og som altid er eksemplerne vist i denne artikel tilgængelige på over på GitHub.