Metode Permintaan Tidak Didukung (405) di Musim Semi

1. Ikhtisar

Artikel singkat ini difokuskan pada kesalahan umum - 'Metode Permintaan tidak Didukung - 405' - yang dihadapi pengembang saat mengekspos API mereka untuk kata kerja HTTP tertentu, dengan Spring MVC.

Secara alami, kami juga akan membahas penyebab umum kesalahan ini.

2. Dasar-dasar Metode Permintaan

Sebelum beralih ke masalah umum, jika Anda baru mulai mempelajari Spring MVC, berikut adalah artikel pengantar yang bagus untuk memulai.

Mari kita lihat sekilas dasar-dasarnya - dan pahami metode permintaan yang didukung oleh Spring dan beberapa kelas umum yang diminati di sini.

Dengan cara yang sangat disederhanakan, metode HTTP MVC adalah operasi dasar yang dapat dipicu oleh permintaan di server. Misalnya, beberapa metode mengambil data dari server, beberapa mengirimkan data ke server, beberapa mungkin menghapus data, dll.

The penjelasan @RequestMapping menentukan metode didukung untuk permintaan.

Spring mendeklarasikan semua metode permintaan yang didukung di bawah RequestMethod enum ; itu menentukan standar GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE verba.

Spring DispatcherServlet mendukung semuanya secara default kecuali OPTIONS dan TRACE ; @RequestMapping menggunakan enum RequestMethod untuk menentukan metode mana yang didukung.

3. Skenario MVC Sederhana

Sekarang, mari kita lihat contoh kode yang memetakan semua metode 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 mendeklarasikan metode findEmployee () . Itu tidak menentukan metode permintaan khusus, yang berarti URL ini mendukung semua metode default.

Kami dapat meminta API menggunakan metode yang didukung berbeda, 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 alami, kami dapat mengirim permintaan dengan berbagai cara - melalui perintah curl sederhana , Postman, AJAX, dll.

Dan, tentu saja, kami berharap mendapatkan respons 200 OK , jika permintaan dipetakan dengan benar dan berhasil.

4. Skenario Masalah - HTTP 405

Tapi, yang kita bahas di sini - tentu saja - skenario ketika permintaan tidak berhasil.

' 405 Method Not Allowed ' adalah salah satu error paling umum yang kami amati saat menangani permintaan Spring.

Mari kita lihat apa yang terjadi jika kita secara khusus mendefinisikan 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 Mendukung - Alasan, Solusi

Apa yang kami dapatkan dalam skenario sebelumnya ini adalah respons HTTP dengan Kode Status 405 - kesalahan klien yang menunjukkan bahwa server tidak mendukung metode / kata kerja yang dikirim dalam permintaan.

Seperti namanya di sini, alasan kesalahan ini adalah mengirimkan permintaan dengan metode yang tidak didukung.

Seperti yang Anda perkirakan, kami dapat menyelesaikannya dengan menentukan pemetaan eksplisit untuk PUT, dalam pemetaan metode yang ada:

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

Sebagai alternatif, kita dapat menentukan metode / pemetaan baru secara terpisah:

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

6. Kesimpulan

Metode permintaan / kata kerja adalah aspek penting dalam komunikasi HTTP, dan kita perlu berhati-hati dengan semantik yang tepat dari operasi yang kita tentukan di sisi server, dan kemudian dengan permintaan yang tepat yang kita kirimkan.

Dan seperti biasa, contoh yang ditampilkan di artikel ini tersedia di lebih dari GitHub.