Anforderungsmethode im Frühling nicht unterstützt (405)

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

1. Überblick

Dieser kurze Artikel befasst sich mit einem häufigen Fehler - "Anforderungsmethode nicht unterstützt - 405" -, dem Entwickler ausgesetzt sind, 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 und zunächst etwas über Spring MVC lernen, sollten Sie zunächst einen guten Prozentsatz (t0) festlegen.

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

In stark vereinfachter Form sind MVC-HTTP-Methoden grundlegende Vorgänge, die eine Anforderung auf dem Server auslösen kann. Zum Beispiel sind einige Methodenfetchdie Daten vom Server, einigesubmitdie Daten zum Server, einigedeletedie Daten usw.

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

Spring deklariert alle unterstützten Anforderungsmethoden unter einer AufzählungRequestMethod; es gibt die Standardverben vonGET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACEan.

Spring DispatcherServlet unterstützt standardmäßig alle außerOPTIONS undTRACE; @RequestMapping etztRequestMethod enum ein, 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 im Beispiel die MethodefindEmployee()deklariert wird. 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, zum Beispiel mit curl:

$ curl --request POST http://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 einfachencurl-Befehl, Postman, AJAX usw.

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

4. Problemszenario - das HTTP 405

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

T405 Method Not Allowed ’ist einer der häufigsten Fehler, die wir bei der Arbeit mit Spring-Anfragen beobachten.

Schauen wir uns an, 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 http://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

Was wir in diesem vorherigen Szenario erhalten, ist die HTTP-Antwort mit dem 405-Statuscode -a client error that indicates that the server doesn’t support the method/verb sent in the request.

Wie der Name schon sagt, 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 ein explizites Mapping 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. 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 fürover on GitHub verfügbar.