我正在使用PUT和POST
开发Spring Rest网络服务@RequestMapping(value = "/test", method = RequestMethod.POST)
@Override
public String function(Model model)
{
}
那么,在这种情况下使用PUT和POST有什么区别?
我知道PUT是幂等的,这意味着如果多次调用相同的url,效果应该是相同的。 如果我将请求方法作为PUT提供,并且如果我在函数内部包含DB操作,则PUT的含义不会改变,这意味着如果我多次调用测试URL,则DB值将每次都改变。
我的问题是幂等性,状态变化,所有这些功能是否取决于开发人员的实现?
更好的例子:
@RequestMapping(value = "/test", method=RequestMethod.POST, produces={"application/json"})
public @ResponseBody List<Integer> postData(@RequestParam String name) {
if (name.equalsIgnoreCase("okkk")) {
return returnDataList();
}else {
List<Integer> list = new ArrayList<Integer>();
list.add(12345);
return list;
}
}
@RequestMapping(value = "/test/{name}", method=RequestMethod.PUT, produces={"application/json"})
public @ResponseBody List<Integer> putData(@PathVariable String name) {
if (name.equalsIgnoreCase("okkk")) {
return returnDataList();
}else {
List<Integer> list = new ArrayList<Integer>();
list.add(12345);
return list;
}
我相信这两种方法都是一样的。我只是把PUT和POST,有点困惑。
答案 0 :(得分:1)
以下是有关此问题的最佳答案:What's the difference between a POST and a PUT HTTP REQUEST?
无论PUT被调用多少次,它都应该反复做同样的事情。 PUT响应不可缓存。
POST允许Web服务器决定如何处理数据。这些请求可以缓存,假设&#34;服务器设置适当的Cache-Control和Expires Headers。&#34;
我认为还有另一种资源可以提供帮助:PUT vs. POST in REST
作者总结了很好的何时使用POST以及何时使用PUT。我选择了最简单的方法:
POST:用于修改和更新资源。
PUT:用于创建资源或覆盖它。
答案 1 :(得分:1)
据我了解,除了概念上的区别和REST准则外, PUT 是幂等 =>无论客户端API调用多少次,它都期望相同的结果webapi PUT方法,但是作为webapi开发人员,您可以做任何想做的事情,PUT和POST之间(在URL参数旁边)没有技术限制...
因此,如果我在POST和PUT中具有相同的代码,则webapi的行为是否相同?我没有发现任何区别:
#include<iostream>
#include<vector>
using Graph = std::vector<std::vector<int>>;
void addedge(Graph &graph, const int u, const int v) {
graph[u].push_back(v);
graph[v].push_back(u);
}
void printgraph(const Graph &gph) {
for (int node = 0 ; node < gph.size() ; node++) {
std::cout<<node<<" : ";
for (auto x : gph[node]) {
std::cout << x << " ";
}
std::cout<<std::endl;
}
}
int main() {
Graph gph(8, std::vector<int>());
addedge(gph, 2, 3);
addedge(gph, 6, 7);
addedge(gph, 1, 2);
printgraph(gph);
}
和
public Person Put(int id, [FromBody]Person person)
{
Person dbPerson = Persons.Find((x) => x.Id == id);
if (dbPerson != null)
{
dbPerson = person;
}
else
{
Persons.Add(dbPerson);
}
return dbPerson;
}
答案 2 :(得分:0)
幂等性,状态变化,所有这些功能都取决于开发人员的实现吗?
是的,由开发人员以符合HTTP规范的方式实现PUT和POST。如果您没有这样做,您的服务可能仍会有效,但您遇到意外问题的可能性很小(例如,从代理服务器后面访问时,您的服务可能会表现得很奇怪)。
如果我在函数内部包含DB操作,PUT的含义是否会改变?
只要效果是幂等的,您就可以在处理PUT请求时执行数据库操作。
例如,如果您的服务允许客户端使用PUT /myfile
等请求创建文件,并在正文中传递所需内容,则可以使用执行以下操作的数据库事务处理每个请求:
这是幂等的,因为如果第二次发出相同的请求,数据库的状态将不会改变。
对于非幂等示例,假设步骤2已更改为以下内容:
这不是幂等的,因为如果客户端发送两次相同的请求,则该文件将包含两个内容副本。