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

Springでサポートされていないリクエストメソッド(405)

1. 概要

このクイック記事は、開発者がSpring MVCで特定のHTTP動詞のAPIを公開する際に直面する一般的なエラー「Request Method not Supported-405」に焦点を当てています。

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

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

一般的な問題に進む前に、Spring MVCについて学び始めたばかりの場合は、最初に適切なintro articleを示します。

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

非常に単純化された方法では、MVC HTTPメソッドは、サーバー上で要求がトリガーできる基本操作です。 たとえば、サーバーからのデータをfetchするメソッド、サーバーへのデータをsubmitするメソッド、データをdeleteするメソッドなどがあります。

@RequestMapping annotation は、リクエストでサポートされているメソッドを指定します。

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 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つです。

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

@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サポートなし-理由、解決策

この前のシナリオで取得しているのは、405ステータスコード–a client error that indicates that the server doesn’t support the method/verb sent in the request.を使用したHTTP応答です。

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

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

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

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

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

6. 結論

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

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