内容简介:翻译自:https://stackoverflow.com/questions/30981727/link-to-another-resource-in-a-rest-api-by-its-id-or-by-its-url
创建一些API,因此使用的语言是JSON.
我们假设我需要代表这个资源:
{ "id" : 9, "name" : "test", "customer_id" : 12, "user_id" : 1, "store_id" : 3, "notes" : "Lorem ipsum example long text" }
通过ID(12,1,3)引用其他资源是否正确,或者我应该指定这些资源的URL(即/ customers / 12,/ users / 1,/ stores / 3)?
我没有使用HATEOAS,我有点困惑.
个实体URI(例如/ customers / 12或甚至http://www.example.com/customers/12).
不要在响应中仅包含实体的ID(例如12),因为这样会迫使客户自己组合资源URI.为了做到这一点,他们需要事先知道有什么URI,并且你失去了对服务器端URI空间的控制.
(如果服务器指示客户端如何,例如通过发送 URI template 以及ID,则客户端将URI组合在一起;但如果它这样做,它也可以发送生成的URI.)
也可以看看:
> Article “REST APIs must be hypertext-driven” by Roy T. Fielding (REST的创始人).特别注意这两个要点:
- “A REST API should be entered with no prior knowledge beyond the initial URI (bookmark).”
- “A REST API must not define fixed resource names or hierarchies (an obvious coupling of client and server). Servers must have the freedom to control their own namespace. Instead, allow servers to instruct clients on how to construct appropriate URIs[.]”
> HAL ,它指定了将相关资源的链接放入响应的标准方法.
> JSON API – “使用JSON构建API的规范”
>以上建议不仅适用于其他资源的ID(即您的customer_id等“外键”);你也将资源自己的id变成了所谓的“自我链接”;见 SO question “What is the importance of the self link in hypermedia APIs?” .
例:
您的原始资源可以按如下方式重新设计:
{ "type": "foobar", "id": "9", "links": { "self": "//example.com/foobars/9" }, "cashier": { "type": "user", "id": "1", "links": { "self": "//example.com/users/1" } }, "customer": { "type": "customer", "id": "12", "links": { "self": "//example.com/customers/12" } }, "name" : "test", "notes" : "Lorem ipsum example long text", "store": { "type": "store", "id": "3", "links": { "self": "//example.com/stores/3" } } }
有几点需要注意:
>每个资源(正在传输的主要对象,还有子资源)都附加了一些自描述元数据,例如type,id,links.
>子资源可以包括部分或完整数据.只要有自我链接,客户端就知道从哪里获得完整的资源.
>这种类型似乎有点减少;通常,你隐含地知道期望什么样的对象.此属性可以帮助验证,并且还使您有机会区分对象类型和角色(例如,出纳员是上例中的用户).
翻译自:https://stackoverflow.com/questions/30981727/link-to-another-resource-in-a-rest-api-by-its-id-or-by-its-url
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 通过Xcode 10链接libstdc++来深入分析tbd文件
- 前端工程师通过nodejs链接linux,并上传代码进行半自动化更新,省去ssh+ftp的链接工具
- 静态链接和动态链接
- linux中硬链接、软链接的建立
- 微信公众号开发C#系列-10、长链接转短链接
- linux – 硬链接或软链接占用文件系统中的任何空间吗?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。