1. 概要

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

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

2. リクエスト方法の基本

一般的な問題に進む前に、Spring MVCについて学び始めたばかりの場合は、最初に紹介記事を紹介します。

また、基本について簡単に説明し、Springでサポートされているリクエストメソッドと、ここで関心のある一般的なクラスのいくつかを理解しましょう。

非常に単純化された方法で、MVC HTTPメソッドは、リクエストがサーバー上でトリガーできる基本的な操作です。 たとえば、サーバーからデータをフェッチするメソッド、サーバーにデータを送信するメソッド、データを削除するメソッドなどがあります。

@RequestMappingアノテーションは、リクエストでサポートされるメソッドを指定します。

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

Spring DispatcherServlet は、OPTIONSTRACEを除くすべてをデフォルトでサポートします。 @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などを使用します。

そしてもちろん、リクエストが正しくマッピングされて成功した場合、 200OK応答が返されることを期待しています。

4. 問題のシナリオ– HTTP 405

ただし、ここで説明しているのは、もちろん、リクエストが成功しないシナリオです。

405メソッドは許可されていません」は、Springリクエストの処理中に観察される最も一般的なエラーの1つです。

次のように、SpringMVCでGETリクエストを具体的に定義して処理するとどうなるか見てみましょう。

@RequestMapping(
  value = "/employees", 
  produces = "application/json", 
  method = RequestMethod.GET)
public List<Employee> 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サポートされていません–理由、解決策

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

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

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

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

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

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

6. 結論

リクエストメソッド/動詞はHTTP通信の重要な側面であり、サーバー側で定義する操作の正確なセマンティクスに注意する必要があります。次に、送信する正確なリクエストに注意する必要があります。

そしていつものように、この記事に示されている例は、GitHubで利用できます。