在 Spring 中,我应该在什么情况下使用 RequestMethod.PUT?
在 Spring 中,我应该在什么情况下使用 RequestMethod.PUT?
这个问题已经在这里有答案:
在阅读 PUT
和 POST
的区别时,在这个回答中我看到了这样的说法:
HTTP中的PUT应该接受请求的主体,然后将其存储在由URI标识的资源中。
HTTP POST更加通用。它应该在服务器上启动一个动作。该动作可以是将请求数体存储在由URI标识的资源中,也可以是一个不同的URI,或者是一个不同的操作。
现在,在阅读这个教程时,我发现了以下内容:
@RequestMapping(value = EmpRestURIConstants.DELETE_EMP, method = RequestMethod.PUT) public @ResponseBody Employee deleteEmployee(@PathVariable("id") int empId) { logger.info("Start deleteEmployee."); Employee emp = empData.get(empId); empData.remove(empId); return emp; }
我之前认为如果使用PUT
,就应该使用@RequestBody
。但实际情况并非如此。而上述方法似乎非常像GET
,对吧?还是我漏看了什么?
Q1. 这些方法的确切目的是什么,或者至少在什么情况下某些方法不能使用?
Q2. 是否正确理解,如果我使用GET
,那么我不能使用@RequestBody
,因为GET
请求中没有请求主体,我只能使用@RequestParam
和@PathVariable
。而PUT
和POST
可以使用所有这些吗?而且不管使用哪种方法,都可以返回@ResponseBody
。如果我所有的猜测都是正确的,那么是否有官方文档解释所有这些限制,包括其他方法?
所以我之前从来没有深入思考过这个问题,并且几乎总是使用GET或POST,但是在阅读了这篇博客之后,似乎更清楚了何时使用PUT而非POST。这里我将引用博客中的内容。
PUT方法是做什么的?
PUT方法完全替换目标URL中存在的任何内容为其他内容。利用此方法,您可以创建新的资源或覆盖现有的资源,只要您知道确切的请求URI即可。PUT方法用于创建新资源的示例如下:
PUT /forums/HTTP/2.0 Host: https://yourwebsite.com/
其中x将是线程的实际名称或ID号码。或者,用于覆盖现有资源的PUT方法可能如下所示:
PUT /forums/HTTP/2.0 Host: https://yourwebsite.com/
简而言之,PUT方法用于在客户端已知的特定URL处创建或覆盖资源。
POST方法是做什么的?
HTTP POST方法用于将用户生成的数据发送到Web服务器。例如,当用户在论坛上发表评论或上传个人资料图片时,使用POST方法。如果您不知道新创建的资源应该驻留在哪个特定URL上,则还应使用POST方法。换句话说,如果创建了新的论坛线程但未指定线程路径,则可以使用以下内容之类的东西:
POST /forums HTTP/2.0 Host: https://yourwebsite.com/
结论
在阅读这篇文章并查看你的示例后,你为什么要使用PUT而不是POST就有了很清楚的解释,这与你的URL有关。因为你使用了一个@PathVariable
,这意味着你完全了解确切的请求URI。否则,使用POST更合理。