如何以RESTful方式“延迟加载”?
-
06-07-2019 - |
题
根据这项服务获取有关酒店的信息:
> GET /hotel/{id}
< HTTP/1.1 200 OK
< <hotel>
< <a>aaa</a>
< <b>aaa</b>
> <biggie>aaa....I am 300K</biggie >
< </hotel>
问题是 biggie
是300K,我们不希望每次回复都返回它。什么是延迟加载此值的RESTful方法?
我们应该设置两个资源:
> GET /hotel/{id}
< HTTP/1.1 200 OK
< <hotel>
< <a>aaa</a>
< <b>aaa</b>
< </hotel>
和..
> GET /hotel/{id}/biggie
< HTTP/1.1 200 OK
< <biggie>
< <val>aaa....I am 300K</val>
< </biggie>
当您真正需要这些数据时,您只需要 GET / hotel / {id} / biggie
?
这可行..虽然 biggie
没有什么特别之处,只不过它是一个大数据集。我认为将所有属性保存在 hotel
级别更好,因为所有属性实际上只是 hotel
的属性。
解决方案
别忘了,超媒体是你的朋友。
GET /hotel/{id}
HTTP/1.1 200 OK
<hotel Id="99">
<a>aaa</a>
<b>aaa</b>
<biggieLink href="/Hotel/99/Biggie"/>
</hotel>
或者你甚至可以做
GET /hotel/{id}
HTTP/1.1 200 OK
<hotel Id="99">
<a>aaa</a>
<b>aaa</b>
<biggieSynopsis href="/Hotel/99/Biggie">
<title>Here is a a summary of biggie</title>
</biggieSynopsis
</hotel>
其他提示
将其设置为两个资源可行,但如果您不喜欢,可以考虑使用缓存;根据数据的性质,这实际上可能比分割成多个资源节省更多的负担。
我认为您的解决方案很好。没有完美的答案,但有三种可能性:
- 每次都发送所有属性
- 根据要求单独发送属性(
/ {id} / a
,/ {id} / b
,/ {id} / biggie
) - 根据您的建议,发送所有属性,除了不寻常的属性。 醇>
1和2很不错,因为它们是统一的,但是3在你的情况下是有意义的,或者在一个数据需要登录凭证的情况下,例如。
(2还有一个缺点,就是要求与请求者更紧密地联系,他们必须知道每个属性的名称。)
不隶属于 StackOverflow