Kaedah Permintaan Tidak Disokong (405) pada Musim Bunga

1. Gambaran keseluruhan

Artikel ringkas ini difokuskan pada ralat umum - 'Kaedah Permintaan Tidak Disokong - 405' - yang dihadapi oleh pembangun sambil mendedahkan API mereka untuk kata kerja HTTP tertentu, dengan Spring MVC.

Secara semula jadi, kami juga akan membincangkan penyebab umum ralat ini.

2. Asas Kaedah Permintaan

Sebelum beralih ke masalah biasa, jika anda baru mula belajar mengenai Spring MVC, berikut adalah artikel intro yang baik untuk bermula.

Mari kita lihat asasnya dengan cepat - dan fahami kaedah permintaan yang disokong oleh Spring dan beberapa kelas minat umum di sini.

Dengan kaedah yang sangat mudah, kaedah HTTP MVC adalah operasi asas yang boleh dicetuskan oleh permintaan pada pelayan. Contohnya, beberapa kaedah mengambil data dari pelayan, ada yang mengirimkan data ke pelayan, ada yang mungkin menghapus data dll.

The anotasi @RequestMapping menentukan kaedah yang disokong untuk permintaan itu.

Spring menyatakan semua kaedah permintaan yang disokong di bawah enum RequestM Method ; ia menentukan kata kerja standard GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE .

Spring DispatcherServlet menyokong semuanya secara lalai kecuali PILIHAN dan TRACE ; @RequestMapping menggunakan enum RequestMethod untuk menentukan kaedah mana yang disokong.

3. Senario MVC Sederhana

Sekarang, mari kita lihat contoh kod yang memetakan semua kaedah 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(); } }

Perhatikan bagaimana contoh menyatakan kaedah findEm Employee () . Ini tidak menentukan kaedah permintaan khusus, yang bermaksud URL ini menyokong semua kaedah lalai.

Kami boleh meminta API menggunakan kaedah yang berbeza yang disokong, misalnya, menggunakan 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"}]

Secara semula jadi, kita dapat mengirim permintaan dengan pelbagai cara - melalui perintah curl sederhana , Postman, AJAX, dll.

Dan, tentu saja, kami menjangkakan akan mendapat sambutan 200 OK , jika permintaan itu dipetakan dengan betul dan berjaya.

4. Senario Masalah - HTTP 405

Tetapi, apa yang kita bincangkan di sini adalah - tentu saja - senario apabila permintaan itu tidak akan berjaya.

' Kaedah 405 Tidak Dibolehkan ' adalah salah satu kesalahan yang paling biasa kami amati semasa bekerja dengan permintaan Spring.

Mari kita lihat apa yang berlaku jika kita secara spesifik menentukan dan menangani permintaan GET di Spring MVC, seperti ini:

@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 Tidak Menyokong - Sebab, Penyelesaian

Apa yang kita dapat dalam senario sebelumnya adalah tindak balas HTTP dengan Kod Status 405 - ralat klien yang menunjukkan bahawa pelayan tidak menyokong kaedah / kata kerja yang dihantar dalam permintaan.

Seperti namanya di sini, alasan ralat ini adalah menghantar permintaan dengan kaedah yang tidak disokong.

Seperti yang anda jangkakan, kami dapat menyelesaikannya dengan menentukan pemetaan eksplisit untuk PUT, dalam pemetaan kaedah yang ada:

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

Sebagai alternatif, kita dapat menentukan kaedah / pemetaan baru secara berasingan:

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

6. Kesimpulannya

Kaedah / kata kerja permintaan adalah aspek penting dalam komunikasi HTTP, dan kita harus berhati-hati dengan semantik operasi yang kita tentukan di sisi pelayan, dan kemudian dengan permintaan yang tepat yang kita kirimkan.

Seperti biasa, contoh yang ditunjukkan dalam artikel ini terdapat di GitHub.