Verzoekmethode niet ondersteund (405) in het voorjaar

1. Overzicht

Dit korte artikel is gericht op een veelvoorkomende fout - ‘Request Method not Supported - 405 '- waarmee ontwikkelaars worden geconfronteerd bij het tonen van hun API's voor specifieke HTTP-werkwoorden, met Spring MVC.

Uiteraard bespreken we ook de meest voorkomende oorzaken van deze fout.

2. Verzoek Method Basics

Voordat je naar het veelvoorkomende probleem gaat, als je net begint te leren over Spring MVC, is hier een goed intro-artikel om mee te beginnen.

Laten we ook een snelle blik werpen op de basisprincipes - en de aanvraagmethoden die door Spring worden ondersteund en enkele van de algemene klassen die hier van belang zijn, begrijpen.

Op een sterk vereenvoudigde manier zijn MVC HTTP-methoden basisbewerkingen die een verzoek op de server kan activeren. Sommige methoden halen de gegevens van de server, sommige indienen gegevens naar de server, sommigen misschien verwijderen de gegevens etc.

De @RequestMapping annotatie specificeert de ondersteunde methoden voor het verzoek.

Spring declareert alle ondersteunde verzoekmethoden onder een enum RequestMethod; het specificeert de norm GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE werkwoorden.

De lente DispatcherServlet ondersteunt ze allemaal standaard behalve OPTIES en SPOOR; @RequestMapping gebruikt de RequestMethod enum om aan te geven welke methoden worden ondersteund.

3. Eenvoudig MVC-scenario

Laten we nu eens kijken naar een codevoorbeeld dat alle HTTP-methoden in kaart brengt:

@RestController @RequestMapping (value = "/ api") openbare klasse RequestMethodController {@Autowired privé EmployeeService-service; @RequestMapping (value = "/ workers", produce = "application / json") openbare lijst findEmployees () genereert InvalidRequestException {return service.getEmployeeList (); }}

Merk op hoe het voorbeeld verklaart findEmployee () methode. Het specificeert geen specifieke verzoekmethode, wat betekent dat deze URL alle standaardmethoden ondersteunt.

We kunnen de API opvragen met behulp van verschillende ondersteunde methoden, bijvoorbeeld met curl:

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

Uiteraard kunnen we het verzoek op meerdere manieren versturen - via een simple krullen commando, Postman, AJAX, etc.

En natuurlijk verwachten we de 200 OK antwoord, als het verzoek correct is toegewezen en succesvol is.

4. Probleemscenario - de HTTP 405

Maar wat we hier bespreken, zijn natuurlijk de scenario's waarin het verzoek niet zal slagen.

405-methode niet toegestaan’Is een van de meest voorkomende fouten die we tegenkomen bij het werken met Spring-verzoeken.

Laten we eens kijken wat er gebeurt als we GET-verzoeken specifiek definiëren en afhandelen in Spring MVC, zoals dit:

@RequestMapping (value = "/ workers", produce = "application / json", method = RequestMethod.GET) openbare lijst findEmployees () {...} // verzend het PUT-verzoek met CURL $ curl --request PUT // localhost: 8080 / api / medewerkers {"timestamp": 1539720588712, "status": 405, "error": "Methode niet toegestaan", "exception": "org.springframework.web.HttpRequestMethodNotSupportedException", "message": "Verzoek methode 'PUT' niet ondersteund "," path ":" / api / workers "} 

5. 405 Geen ondersteuning - reden, oplossing

Wat we in dit vorige scenario krijgen, is het HTTP-antwoord met de 405-statuscode - een clientfout die aangeeft dat de server de methode / het werkwoord dat in het verzoek is verzonden niet ondersteunt.

Zoals de naam hier suggereert, is de reden voor deze fout het verzenden van het verzoek met een niet-ondersteunde methode.

Zoals je kunt verwachten, kunnen we dit oplossen door een expliciete mapping voor PUT te definiëren, in de bestaande method mapping:

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

Als alternatief kunnen we de nieuwe methode / mapping afzonderlijk definiëren:

@RequestMapping (value = "/ workers", produce = "application / json", method = RequestMethod.PUT) openbare lijst postEmployees () ... 

6. Conclusie

De verzoekmethode / het werkwoord is een kritiek aspect in HTTP-communicatie en we moeten voorzichtig zijn met de exacte semantiek van de bewerkingen die we aan de serverzijde definiëren, en vervolgens met de exacte verzoeken die we verzenden.

En zoals altijd zijn de voorbeelden in dit artikel beschikbaar op GitHub.