یکی از خطای های متداول در REST خطای 405 یا Request Method Not Supported است که در این بخش به علل شایع روی دادن این خطا و مدیریت آن میپردازیم
در نظر بگیرید که متد های کنترلری در MVC پایه ای ترین عملیاتی هستند که به درخواست ها رسیدگی میکنند مثلا متد هایی برای واکشی اطلاعات یا حذف و یا ثبت آنها
RequestMapping@ مشخص کننده روش هایی است که درخواست ها روی آن ها عملیاتی را نیاز دارند (PUT,GET,POST,DELETE,PATCH,HEAD,OPTIONS,TRACE) و Spring همه این روشها را تحت ابجکت Enum بنام RequestMethod تعریف میکند Spring DispatcherServlet تمامی آنها را ساپورت میکند به جز OPTIONS و TRACE
RequestMapping@ به کمک RequestMethod مشخص میکند که کدام روش درخواست باید اعمال شود
کد زیر کلیه روش های درخواست را پوشش میدهد چون نوع دقیق مورد نیاز را عنوان نکردیم :
@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(); } }
و در جواب مثلا لیست Employee ها را برمیگرداند :
$ 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"}]
حال اگر روش دریافت درخواست را تعیین کرده بودیم و درخواست از نوع دیگری بود کد وضعیت 405 را دریافت خواهیم کرد :
@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"}
برای حل این مسئله میتوانیم روش درخواست اضافی را هم اضافه کنیم :
@RequestMapping( value = "/employees", produces = "application/json", method = {RequestMethod.GET, RequestMethod.PUT}) ...
یا حتی متد دیگری را برای روش درخواست اضافه تعیین کنیم :
@RequestMapping(value = "/employees", produces = "application/json", method=RequestMethod.PUT) public List<Employee> postEmployees() ...