在REST API中使用PUT进行更新时,我是否应该允许发送完整的结构?

daf*_*tal 3 rest http http-put

我正在设计REST API,我想知道处理资源更新的推荐方法是什么.更具体地说,我将允许通过PUT资源进行更新,但我应该在PUT请求正文中允许什么?

  1. 始终是资源的完整结构?
  2. 始终是资源结构的子部分(已更改)?
  3. 两者结合?

例如,获取资源http://example.org/api/v1/dogs/packs/p1.GET此资源上的A 将提供以下内容:

Request:
GET http://example.org/api/v1/dogs/packs/p1
Accept: application/xml

Response:
<pack>
  <owner>David</owner>
  <dogs>
    <dog>
      <name>Woofer</name>
      <breed>Basset Hound</breed>
    </dog>
    <dog>
      <name>Mr. Bones</name>
      <breed>Basset Hound</breed>
    </dog>
  </dogs>
</pack>
Run Code Online (Sandbox Code Playgroud)

假设我想要添加一只狗(Sniffers the Basset Hound),我会支持:

Request:
PUT http://example.org/api/v1/dogs/packs/p1
<dog>
  <name>Sniffers</name>
  <breed>Basset Hound</breed>
</dog>

Response:
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)

要么

Request:
PUT http://example.org/api/v1/dogs/packs/p1
<pack>
  <owner>David</owner>
  <dogs>
    <dog>
      <name>Woofer</name>
      <breed>Basset Hound</breed>
    </dog>
    <dog>
      <name>Mr. Bones</name>
      <breed>Basset Hound</breed>
    </dog>
    <dog>
      <name>Sniffers</name>
      <breed>Basset Hound</breed>
    </dog>
  </dogs>
</pack>

Response:
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)

或两者?如果建议通过结构的子部分支持更新,我将如何处理删除(例如狗死亡时)?通过查询参数?

dzu*_*lke 7

是的,始终发送资源的完整表示.否则,你会(根据普通定义和PUT的用法)用这只狗替换包装.

但是,您可能需要考虑以下事项:

  • 在URL路径之外使用XML命名空间或其他版本控制方法(例如?version = 2)
  • 将要添加的狗发布到/ dogs/packs/p1.根据定义,POST会创建一个从属资源,这样就可以将狗添加到包中.
  • 稍微翻新您的网址.在我看来你真的想要/ dogs/1234,/ dogs/1235等等,然后/ packs/p1,/ packs/p2.然后你也可以简单地POST <dog id="1">到包.

请记住,REST要求您正确识别资源.包不是真正的狗的下属资源,每只狗应该有某种独特的标识符.然后,当访问/ packs/p1/1234时,您可能想要重定向到/ dogs/1234.或者,您也可以不提供该URL,尽管接受将下级资源POST到相应的包.

我越是想到它,POST方法就越有意义.也许你甚至可以为所有狗提供/ pack/p1/dogs/resource,与包装分开.然后,您可以将所有者信息等内容输入/ pack/p1,通过/ packs/p1/dogs /获取所有狗的列表(其中应包含每个狗的URL列表,例如/ packs/p1/dogs/1234,见HATEOAS),通过POST到/ packs/p1/dogs /添加一只新狗,并通过DELETEing/packs/p1/dogs/1235删除一只狗.每只狗都可以是完整的代表,甚至可能是重定向到/ dogs/1234等,或者在这个背包中的狗的不同表现形式,但是再次带有"完整"狗的链接.取决于你要如何表示在一包有一只狗,当然这也将影响到什么,你居然POST到/包/ P1 /狗/.满狗感觉不对,应该只是我上面显示的ID,可能还有关于与包的关系的其他数据.