Anforderungsmethode wird im Frühjahr nicht unterstützt (405)

1. Übersicht

Dieser kurze Artikel konzentriert sich auf einen häufigen Fehler - "Anforderungsmethode nicht unterstützt - 405" -, mit dem Entwickler konfrontiert werden, wenn sie ihre APIs für bestimmte HTTP-Verben mit Spring MVC verfügbar machen.

Natürlich werden wir auch die häufigsten Ursachen für diesen Fehler diskutieren.

2. Grundlagen der Anforderungsmethode

Bevor Sie sich dem allgemeinen Problem zuwenden, sollten Sie zunächst einen guten Intro-Artikel lesen, bevor Sie sich mit Spring MVC vertraut machen.

Lassen Sie uns auch einen kurzen Blick auf die Grundlagen werfen - und die von Spring unterstützten Anforderungsmethoden und einige der hier gängigen Klassen von Interesse verstehen.

In stark vereinfachter Weise sind MVC-HTTP-Methoden grundlegende Vorgänge, die eine Anforderung auf dem Server auslösen kann. Beispielsweise rufen einige Methoden die Daten vom Server ab, andere senden Daten an den Server, andere löschen möglicherweise die Daten usw.

Die Annotation @RequestMapping gibt die unterstützten Methoden für die Anforderung an.

Spring deklariert alle unterstützten Anforderungsmethoden unter einer Aufzählung RequestMethod . Es gibt die Standardverben GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS und TRACE an .

Das Spring DispatcherServlet unterstützt standardmäßig alle außer OPTIONS und TRACE . @RequestMapping verwendet die RequestMethod-Enumeration, um anzugeben, welche Methoden unterstützt werden.

3. Einfaches MVC-Szenario

Schauen wir uns nun ein Codebeispiel an, das alle HTTP-Methoden abbildet:

@RestController @RequestMapping(value="/api") public class RequestMethodController { @Autowired private EmployeeService service; @RequestMapping(value = "/employees", produces = "application/json") public List findEmployees() throws InvalidRequestException { return service.getEmployeeList(); } }

Beachten Sie, wie das Beispiel die Methode findEmployee () deklariert . Es wird keine bestimmte Anforderungsmethode angegeben. Dies bedeutet, dass diese URL alle Standardmethoden unterstützt.

Wir können die API mit verschiedenen unterstützten Methoden anfordern, z. B. mit curl:

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

Natürlich können wir die Anfrage auf verschiedene Arten senden - über einen einfachen Curl- Befehl, Postman, AJAX usw.

Und natürlich erwarten wir die Antwort 200 OK , wenn die Anforderung korrekt zugeordnet und erfolgreich ist.

4. Problemszenario - das HTTP 405

Aber wir diskutieren hier natürlich die Szenarien, in denen die Anfrage nicht erfolgreich sein wird.

' 405-Methode nicht zulässig ' ist einer der häufigsten Fehler, die bei der Arbeit mit Spring-Anforderungen auftreten.

Lassen Sie uns einen Blick darauf werfen, was passiert, wenn wir GET-Anforderungen in Spring MVC wie folgt definieren und verarbeiten:

@RequestMapping( value = "/employees", produces = "application/json", method = RequestMethod.GET) public List findEmployees() { ... } // send the PUT request using CURL $ curl --request PUT //localhost:8080/api/employees {"timestamp":1539720588712,"status":405,"error":"Method Not Allowed", "exception":"org.springframework.web.HttpRequestMethodNotSupportedException", "message":"Request method 'PUT' not supported","path":"/api/employees"} 

5. 405 Nicht unterstützen - Grund, Lösung

In diesem vorherigen Szenario erhalten wir die HTTP-Antwort mit dem 405-Statuscode - ein Clientfehler, der darauf hinweist, dass der Server die in der Anforderung gesendete Methode / das Verb nicht unterstützt.

Wie der Name hier andeutet, ist der Grund für diesen Fehler das Senden der Anforderung mit einer nicht unterstützten Methode.

Wie zu erwarten ist, können wir dieses Problem lösen, indem wir in der vorhandenen Methodenzuordnung eine explizite Zuordnung für PUT definieren:

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

Alternativ können wir die neue Methode / Zuordnung separat definieren:

@RequestMapping(value = "/employees", produces = "application/json", method=RequestMethod.PUT) public List postEmployees() ... 

6. Fazit

Die Anforderungsmethode / das Verb ist ein kritischer Aspekt in der HTTP-Kommunikation, und wir müssen mit der genauen Semantik der Operationen, die wir auf der Serverseite definieren, und dann mit den genauen Anforderungen, die wir senden, vorsichtig sein.

Und wie immer sind die in diesem Artikel gezeigten Beispiele auf GitHub verfügbar.