gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:02:57 28 4
gpt4 key购买 nike

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

  1. 始终是资源的完整结构?
  2. 总是资源结构的子部分(发生变化的部分)?
  3. 两者的结合?

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

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>

假设我想在狗群中添加一只狗(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

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

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

最佳答案

是的,始终发送资源的完整表示。否则,您将(根据 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 方法就越有意义。也许你甚至可以为所有的狗提供一个/packs/p1/dogs/资源,与狗群分开。然后,您可以将所有者信息等内容放入/packs/p1,通过/packs/p1/dogs/获取所有狗的列表(其中应包含列表中每只狗的 URL pack,例如/packs/p1/dogs/1234,参见 HATEOAS ),通过 POST 到/packs/p1/dogs/向包中添加一条新狗,并通过 DELETEing/packs/p1/dogs/1235 删除一条狗.每只狗可以是完整的代表,甚至可以重定向到/dogs/1234 等,或者在这个包的上下文中代表不同的狗,但同样带有指向“完整”狗的链接。取决于您希望如何表示狗群中的一只狗,这当然也会影响您实际 POST 到/packs/p1/dogs/的什么。 Full dog 感觉不对,真的应该只是我上面显示的一个 ID,也许还有关于与包的关系的额外数据。

关于http - 在 REST API 中使用 PUT 进行更新时,我是否应该允许发送完整的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com