PUT 和 POST - 它们是否依赖于实现?

PUT and POST - are they implementation dependent?

我正在使用 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,有点糊涂

这是关于此的最佳答案:

无论 PUT 被调用多少次,它都应该一遍又一遍地做完全相同的事情。 PUT 响应不可缓存。

POST 允许网络服务器决定如何处理数据。这些请求可以被缓存,假设"the server sets the appropriate Cache-Control and Expires Headers."

还有一个我认为有用的资源:PUT vs. POST in REST

作者在那里很好地总结了何时使用 POST 以及何时使用 PUT。我选择了最简单的:

POST: 用于修改和更新资源。

PUT:用于创建资源,或覆盖它。

Does the idempotence, state change, all those features depend on the developer's implementation?

是的,由开发人员以符合 HTTP 规范的方式实现 PUT 和 POST。如果您不这样做,您的服务可能仍然有效,但您遇到意外问题的可能性很小(例如,当从代理后面访问时,您的服务可能表现得很奇怪)。

If I include a DB operation inside the function, won't the meaning of PUT change?

只要效果是幂等的,就可以在处理PUT请求的时候进行数据库操作。

例如,如果您的服务允许客户端使用 PUT /myfile 等请求创建文件,并在正文中传递所需的内容,则您可以使用执行以下操作的数据库事务来处理每个请求:

  1. 检查命名文件是否已经存在
  2. 如果它已经存在,更新它的内容并返回 200(OK)
  3. 否则,创建文件并返回 201(已创建)

这是幂等的,因为如果第二次发出相同的请求,数据库的状态不会改变。

对于非幂等示例,假设步骤 2 更改为以下内容:

  1. 如果已经存在,将新内容追加到现有内容中

这不是幂等的,因为如果客户端发送相同的请求两次,文件将有两个内容副本。

据我所知,除了概念上的差异和 REST 准则之外,PUTidempotent => 客户端 API 是无论他调用 webapi PUT 方法多少次都期望得到相同的结果,但是作为 webapi 开发人员,您可以做任何您想做的事情,PUT 和 POST(除了 URL 参数)之间没有技术限制。 ..

所以如果我在 POST 中有相同的代码并且 PUT webapi 表现相同?我没有注意到任何区别:

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;
}

public Person Post([FromBody]Person person)
{
    Person dbPerson = Persons.Find((x) => x.Id == person.Id);
    if (dbPerson != null)
    {
        dbPerson = person;
    }
    else
    {
        Persons.Add(dbPerson);
    }
    return dbPerson;
}