Phương thức yêu cầu không được hỗ trợ (405) trong mùa xuân

1. Khái quát chung

Bài viết nhanh này tập trung vào một lỗi phổ biến - 'Phương thức yêu cầu không được hỗ trợ - 405' - mà các nhà phát triển gặp phải khi tiết lộ API của họ cho các động từ HTTP cụ thể, với Spring MVC.

Đương nhiên, chúng ta cũng sẽ thảo luận về các nguyên nhân phổ biến của lỗi này.

2. Kiến thức cơ bản về phương thức yêu cầu

Trước khi chuyển sang vấn đề chung, nếu bạn mới bắt đầu tìm hiểu về Spring MVC, đây là một bài giới thiệu hay để bắt đầu.

Chúng ta cũng hãy xem nhanh những điều cơ bản - và hiểu các phương thức yêu cầu được hỗ trợ bởi Spring và một số lớp phổ biến được quan tâm ở đây.

Theo cách đơn giản hóa cao, các phương thức MVC HTTP là các hoạt động cơ bản mà một yêu cầu có thể kích hoạt trên máy chủ. Ví dụ: một số phương pháp tìm nạp dữ liệu từ máy chủ, một số gửi dữ liệu đến máy chủ, một số phương pháp có thể xóa dữ liệu, v.v.

Các chú thích @RequestMapping quy định cụ thể các phương pháp hỗ trợ cho yêu cầu.

Spring khai báo tất cả các phương thức yêu cầu được hỗ trợ trong một enum RequestMethod ; nó chỉ định các động từ GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE tiêu chuẩn .

Spring DispatcherServlet hỗ trợ tất cả chúng theo mặc định ngoại trừ OPTIONSTRACE ; @RequestMapping sử dụng enum RequestMethod để chỉ định phương thức nào được hỗ trợ.

3. Kịch bản MVC đơn giản

Bây giờ, chúng ta hãy xem xét một ví dụ mã ánh xạ tất cả các phương thức 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(); } }

Chú ý cách ví dụ khai báo phương thức findEaffee () . Nó không chỉ định bất kỳ phương thức yêu cầu cụ thể nào, có nghĩa là URL này hỗ trợ tất cả các phương thức mặc định.

Chúng tôi có thể yêu cầu API bằng các phương pháp được hỗ trợ khác nhau, chẳng hạn như sử dụng curl:

$ curl --request POST //localhost:8080/api/employees [{"id":100,"name":"Steve Martin","contactNumber":"333-777-999"}, {"id":200,"name":"Adam Schawn","contactNumber":"444-111-777"}]

Đương nhiên, chúng tôi có thể gửi yêu cầu theo nhiều cách - thông qua một lệnh curl đơn giản , Postman, AJAX, v.v.

Và tất nhiên, chúng tôi mong đợi nhận được phản hồi 200 OK , nếu yêu cầu được ánh xạ chính xác và thành công.

4. Tình huống sự cố - HTTP 405

Tuy nhiên, những gì chúng ta đang thảo luận ở đây - tất nhiên - là các tình huống khi yêu cầu sẽ không thành công.

' 405 Method Not Allowed ' là một trong những lỗi phổ biến nhất mà chúng tôi quan sát thấy khi làm việc với các yêu cầu Spring.

Hãy xem điều gì sẽ xảy ra nếu chúng tôi xác định và xử lý cụ thể các yêu cầu GET trong Spring MVC, như sau:

@RequestMapping( value = "/employees", produces = "application/json", method = RequestMethod.GET) public List findEmployees() { ... } // send the PUT request using CURL $ curl --request PUT //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 Không hỗ trợ - Lý do, Giải pháp

Những gì chúng ta nhận được trong tình huống trước này là phản hồi HTTP với Mã trạng thái 405 - một lỗi máy khách cho biết rằng máy chủ không hỗ trợ phương thức / động từ được gửi trong yêu cầu.

Như tên gợi ý ở đây, lý do cho lỗi này là gửi yêu cầu bằng một phương thức không được hỗ trợ.

Như bạn có thể mong đợi, chúng tôi có thể giải quyết điều này bằng cách xác định ánh xạ rõ ràng cho PUT, trong ánh xạ phương thức hiện có:

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

Ngoài ra, chúng ta có thể xác định riêng phương thức / ánh xạ mới:

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

6. Kết luận

Phương thức / động từ yêu cầu là một khía cạnh quan trọng trong giao tiếp HTTP và chúng tôi cần phải cẩn thận với ngữ nghĩa chính xác của các hoạt động mà chúng tôi xác định ở phía máy chủ và sau đó với các yêu cầu chính xác mà chúng tôi đang gửi.

Và như mọi khi, các ví dụ hiển thị trong bài viết này có sẵn trên GitHub.