如何解决如何在超媒体api的更新请求中引用资源?
我做了一些关于REST API如何工作以及如何通过超媒体链接资源的研究。有关链接资源的大多数示例都与服务器的响应有关。但是我不知道在更新某个资源时如何引用其他资源。
让我们以居住在特定位置的人的简单资源为例:
/api/persons/alice
{
"name": "Alice","location": {
"id": 1,"links": {
"self": "/api/locations/1"
}
}
}
现在,我想将该位置更新为另一个现有位置。但是我怎么代表呢? 我可以吗?
- 参考新位置的ID
PUT /api/persons/alice
{
"name": "Alice","location": 2
}
- 引用新位置的URI
PUT /api/persons/alice
{
"name": "Alice","location": "/api/locations/2"
}
- 还有什么?
解决方法
HTTP PUT具有远程创作语义-您应该将有效负载视为文档的新表示形式,并由一些通用的HTTP感知文档编辑器来操纵。
GET /api/persons/alice HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json
{
"name": "Alice","location": {
"id": 1,"links": {
"self": "/api/locations/1"
}
}
}
PUT /api/persons/alice HTTP/1.1
Content-Type: application/json
{
"name": "Alice","location": {
"id": 2,"links": {
"self": "/api/locations/2"
}
}
}
200 OK
这里的假设是您的API使用者熟悉这里的架构,并且了解语义,哪些字段是可选的,哪些字段是必需的,等等。
(要使其长期有效,就意味着要投入大量精力来精心设计架构,选择合理的默认值,等等。)
请仔细观察PUT specification的这一部分:
原始服务器应验证PUT表示是否与服务器对目标资源的任何约束一致,而该约束不能由PUT更改或将不会由...更改。当PUT表示与目标资源不一致时,原始服务器应该通过转换表示形式或更改资源配置来使它们一致。
...
除非成功保存请求的表示数据而未对主体进行任何转换,否则原始服务器不得在成功响应PUT时发送验证程序头字段(第7.2节),例如ETag或Last-Modified字段。 ..
换句话说,服务器不需要按照提供的那样“存储”新的表示形式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。