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

时间:2017-10-11 19:04:45

标签: java post put

我正在使用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,有点困惑。

3 个答案:

答案 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等请求创建文件,并在正文中传递所需内容,则可以使用执行以下操作的数据库事务处理每个请求:

  1. 检查指定文件是否已存在
  2. 如果已存在,请更新其内容并以200(确定)
  3. 回复
  4. 否则,创建文件并使用201(已创建)
  5. 进行回复

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

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

    1. 如果已存在,请将新内容附加到现有内容
    2. 这不是幂等的,因为如果客户端发送两次相同的请求,则该文件将包含两个内容副本。