リクエストメソッドはサポートされていません(405)

1.概要

このクイック記事は、開発者がSpring MVCで特定のHTTP動詞用にAPIを公開しているときに直面する一般的なエラー - 「リクエストメソッドはサポートされていません - 405」に焦点を当てています。

当然、このエラーの一般的な原因についても説明します。

2.リクエストメソッドの基本

よくある問題に進む前に、Spring MVCについて学び始めたばかりであれば、まずはじめにhttps://www.baeldung.com/spring-mvc-tutorial[intro article]をご覧ください。

基本についても簡単に見てみましょう。そして、Springでサポートされているリクエストメソッドと、ここで興味を引く一般的なクラスについて理解しましょう。

非常に簡単に言うと、MVC HTTPメソッドは、リクエストがサーバー上でトリガーできる基本的な操作です。たとえば、サーバーからデータを取得するメソッド、サーバーにデータを送信するメソッド、データを削除するメソッドなどがあります。

____https://www.baeldung.com/spring-requestmapping[@RequestMapping]注釈は、要求に対してサポートされているメソッドを指定します。

Springはすべてのサポートされているリクエストメソッドをenum RequestMethod の下で宣言しています。標準の GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE 動詞を指定します。

Spring DispatcherServlet OPTIONS TRACE を除いてデフォルトでそれらすべてをサポートします。 __ @ RequestMapping RequestMethod enum__を使用して、サポートされているメソッドを指定します。

3単純MVCシナリオ

それでは、すべてのHTTPメソッドをマッピングするコード例を見てみましょう。

@RestController
@RequestMapping(value="/api")
public class RequestMethodController {

    @Autowired
    private EmployeeService service;

    @RequestMapping(value = "/employees", produces = "application/json")
    public List<Employee> findEmployees()
      throws InvalidRequestException {
        return service.getEmployeeList();
    }
}

例で findEmployee() メソッドがどのように宣言されているかに注目してください。特定のリクエストメソッドは指定されていません。つまり、このURLはすべてのデフォルトメソッドをサポートしています。

サポートされているさまざまな方法、たとえばcurlを使用してAPIをリクエストできます。

$ 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"}]----

当然のことながら、単純な__curl__コマンド、Postman、AJAXなど、さまざまな方法でリクエストを送信できます。

そして、もちろん、リクエストが正しくマッピングされ成功していれば、__200 OK__レスポンスを受け取ることを期待しています。

===  **  4問題のシナリオ -  HTTP 405 **

しかし、ここで説明しているのは、もちろん、要求が成功しなかった場合のシナリオです。

「__405 Method Not Allowed__」は、Springのリクエストを処理している間によく見られるエラーの1つです。

次のように、Spring MVCでGETリクエストを明確に定義して処理するとどうなるかを見てみましょう。

[source,java,gutter:,true]

@RequestMapping( value = "/employees", produces = "application/json", method = RequestMethod.GET) public List<Employee> findEmployees() { …​ } $ 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"}

[[405]]

===  5. 405サポートされていません - 理由、解決策

この前のシナリオで取得しているのは、405ステータスコードのHTTP応答です。** サーバーが要求で送信されたメソッド/動詞をサポートしていないことを示すクライアントエラーです。

名前が示すように、このエラーの理由はサポートされていないメソッドでリクエストを送信していることです。

ご想像のとおり、既存のメソッドマッピングでPUTの明示的マッピングを定義することでこれを解決できます。

[source,java,gutter:,true]

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

あるいは、新しいメソッド/マッピングを別々に定義することもできます。

[source,java,gutter:,true]

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

===  6.まとめ

リクエストメソッド/動詞はHTTP通信において重要な側面です、そして我々は我々がサーバー側で定義する操作の正確な意味論とそれから我々が送信している正確なリクエストに注意する必要があります。

そしていつものように、この記事に示されている例はhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-simple[GitHubで利用可能]で入手可能です。