在REST中放置与POST

根据HTTP / 1.1规范:

POST方法用于请求源服务器接受请求中包含的实体作为Request-Line Request-URI标识的资源的新下属

换句话说, POST用于创建

PUT方法要求封闭实体存储在提供的Request-URI 。 如果Request-URI指向一个已经存在的资源,那么封闭的实体应该被认为是驻留在原始服务器上的修改版本。 如果Request-URI不指向现有资源,并且该URI可以被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源。“

也就是说, PUT用于创建或更新

那么,应该使用哪一个来创建资源? 或者需要支持两者?


总体:

PUT和POST都可以用于创建。

你必须问:“你在做什么?” 区分你应该使用什么。 假设您正在设计一个提问问题的API。 如果你想使用POST,那么你会这样做的问题列表。 如果你想使用PUT,那么你会对特定的问题做到这一点。

这两个都可以使用,所以我应该在我的RESTful设计中使用哪一个:

您不需要同时支持PUT和POST。

使用的是留给你的。 但请记住根据您在请求中引用的对象来使用正确的对象。

一些考虑:

  • 你是否明确指定了你创建的URL对象,或者让服务器决定? 如果你命名他们,然后使用PUT。 如果你让服务器决定然后使用POST。
  • PUT是幂等的,所以如果你把一个对象放两次,它就没有效果。 这是一个很好的属性,所以我会尽可能使用PUT。
  • 您可以使用相同的对象URL更新或创建带有PUT的资源
  • 通过POST,您可以同时对2个请求进行修改,并且可以更新对象的不同部分。
  • 一个例子:

    我写了以下内容作为关于这个SO的另一个答案的一部分:

    POST:

    用于修改和更新资源

    POST /questions/<existing_question> HTTP/1.1
    Host: www.example.com/
    

    请注意,以下是一个错误:

    POST /questions/<new_question> HTTP/1.1
    Host: www.example.com/
    

    如果URL尚未创建,则在指定名称时不应使用POST创建它。 这应该会导致“资源未找到”错误,因为<new_question>尚不存在。 您应该首先在服务器上放置<new_question>资源。

    你可以通过POST来创建一个资源:

    POST /questions HTTP/1.1
    Host: www.example.com/
    

    请注意,在这种情况下,资源名称未指定,新对象URL路径将返回给您。

    放:

    用于创建资源或覆盖它。 当你指定资源新的URL时。

    对于新资源:

    PUT /questions/<new_question> HTTP/1.1
    Host: www.example.com/
    

    要覆盖现有资源:

    PUT /questions/<existing_question> HTTP/1.1
    Host: www.example.com/
    

    你可以在网上找到说的断言

  • 应该使用POST来创建资源,并且应该使用PUT来修改一个资源
  • 应该使用PUT来创建资源,并且应该使用POST来修改它
  • 这两个都不对。


    更好的是基于动作的幂等性在PUT和POST之间进行选择。

    PUT意味着放置一个资源 - 用一个不同的东西完全替代给定URL中的可用资源。 根据定义,PUT是幂等的。 随心所欲地做多次,结果是一样的。 x=5是幂等的。 无论以前是否存在资源(例如创建或更新),您都可以放入资源!

    POST更新资源,添加辅助资源或导致更改。 POST不是幂等的,因为x++不是幂等的。


    通过这个参数,PUT用于创建当你知道你要创建的东西的URL。 当您知道要创建的事物类别的“工厂”或经理的URL时,可以使用POST创建。

    所以:

    POST /expense-report
    

    要么:

    PUT  /expense-report/10929
    

  • POST到URL 在服务器定义的URL处创建子资源
  • PUT到URL 在客户端定义的URL处创建/替换整个资源
  • 对URL的补丁 更新该客户端定义的URL的部分资源
  • PUT和POST的相关规范是RFC 2616§9.5ff。

    POST会创建一个子资源 ,因此POST到/items会创建一个位于/items资源下的资源。 例如。 /items/1 。 两次发送相同的post数据包将创建两个资源。

    PUT用于在客户端已知URL上创建或替换资源。

    因此: PUT仅仅是CREATE的候选者,其中客户端在创建资源之前已经知道url。 例如。 /blogs/nigel/entry/when_to_use_post_vs_put作为标题用作资源键

    如果已知的URL已经存在, PUT将替换资源,因此两次发送相同请求不起作用。 换句话说, 对PUT的调用是幂等的

    RFC的读法是这样的:

    POST和PUT请求之间的根本区别反映在请求URI的不同含义中。 POST请求中的URI标识将处理封闭实体的资源。 该资源可能是数据接受过程,其他协议的入口或接受注释的独立实体。 相比之下,PUT请求中的URI标识请求附带的实体 - 用户代理知道URI的目标是什么,服务器不能尝试将请求应用于其他资源。 如果服务器希望将请求应用于不同的URI,

    注意: PUT主要用于更新资源(通过全部替换它们),但最近出现了使用PATCH更新现有资源的趋势,因为PUT指定它替换整个资源。 RFC 5789。

    链接地址: http://www.djcxy.com/p/93.html

    上一篇: PUT vs. POST in REST

    下一篇: What are metaclasses in Python?