Request Method Not Supported (405) trong Spring

Trong bài hướng dẫn ngắn này chúng ta sẽ cùng tìm hiểu nguyên nhân gây ra một lỗi rất phổ biến trong Spring – Request Method not Supported – 405 khi làm việc với Spring RestAPI.

Giả sử chúng ta phát triển một controller dùng để xử lý các client request như sau:

@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();
    }
}

Để ý rằng findEmployees() method không được chỉ định dùng cho các HTTP method nào do đó mặc định nó sẽ hỗ trợ tất cả.

Như vậy chúng ta có thể thực thi bất kỳ một HTTP request nào đến api/employees đều được.

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

Trong phần này mình dùng curl để gửi request, các bạn có thể dùng bất kỳ công cụ hỗ trợ nào ví dụ như Postman để thực thi request.

Kết quả sau khi thực thi HTTP request trên chúng ta sẽ thu về HTTP statuc là 200 nghĩa là request được chấp nhận và xử lý bởi server.

Nhưng nếu mình chỉ định rõ các HTTP method mà findEmployees() hỗ trợ thì việc thực thi các HTTP method khác thì server sẽ trả về lỗi 405 Not suppport.

@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"}

Như cái tên mà mã lỗi thì chúng ta có thể dễ dàng hiểu rằng lỗi này là chúng ta gửi một request với HTTP method không được hỗ trợ.

Nếu đoạn việc xảy ra lỗi ở trên là điều không mong muốn, thì các bạn có thể thêm HTTP PUT method vào để sửa.

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

Hoặc chúng ta cũng có thể tạo ra một API mới hỗ trợ PUT method

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

Tóm lược

Như vậy chúng ta đã cùng nhau tìm ra được nguyên nhân gây ra lỗi 405 Not supported rồi phải không nào. Qua bài viết này mình hy vọng những vì sau các bạn có thể xử lý nó một cách nhanh gọn hơn.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x