代码之家  ›  专栏  ›  技术社区  ›  Greg Beech

响应等量HTTP POST请求

  •  6
  • Greg Beech  · 技术社区  · 14 年前

    RESTfulAPI的一部分将允许用户使用序列号注册项目。由于序列号不是全局唯一的,它不能用作资源的标识符,因此我们将使用到父资源的post来生成标识符,例如。

    POST /my/items
    
    <item serial-number="ABCDEF" />
    

    在项目尚未注册的情况下,HTTP语义定义良好。我们返回一个位置标题,并将注册项作为实体体,例如

    HTTP 201 Created
    Location: /my/items/1234    
    
    <item id="1234" serial-number="ABCDEF" />
    

    但是,如果该项已经注册,则API应该是等幂的,返回以前注册的项,而不创建新的项。我的最佳猜测是,然后它应该返回一个200 OK状态代码,并使用Content-location头来指示项目的实际来源,例如。

    HTTP 200 OK
    Content-Location: /my/items/1234    
    
    <item id="1234" serial-number="ABCDEF" />
    

    这看起来合理吗?在第二种情况下,我不完全清楚位置或内容位置是否更适合。

    2 回复  |  直到 12 年前
        1
  •  7
  •   Ruben Bartelink    12 年前

    我最近也有类似的要求。对于等幂运算,Put是最好的方法。您是对的,外部ID和内部ID不匹配。我通过为外部ID目标创建专用资源来解决它:

    PUT /api-user/{username}/items/{serialNumber}
    

    在内部,我将其解析为一个创建,以防没有“username”和“abcdef”序列号项,或者在执行此操作时进行更新。

    如果它是一个create i return 201的更新200。此外,返回的有效负载还包含本地ID和外部序列号,如您在有效负载中建议的那样。

        2
  •  1
  •   Darrel Miller    14 年前

    Here 是关于两个标题用法的有趣讨论。它声称没有为Put或Post定义内容位置,因此在您的案例中,位置可能是更好的选择。当然还不清楚哪个更好。

    总的来说,我认为你的方法是有道理的。