如果我要将现有的 Restful Web 服务尽可能地转换为 HATEOS,我已经阅读了很多关于潜在好处的信息。我理解在有效负载中提供链接以减轻消费者记住下一个有效可用操作的负担的重要性。然而,我似乎无法理解它将如何在现实中帮助我的 Restful Web 服务的消费者。
为了说明,我从关于制作咖啡订单的Rest In Practice书中举了这个例子:-
<order xmlns="http://schemas.restbucks.com">
<location>takeAway</location>
<item>
<name>latte</name>
<quantity>1</quantity>
<milk>whole</milk>
<size>small</size>
</item>
<cost>2.0</cost>
<status>payment-expected</status>
<link rel="payment" href="https://restbucks.com/payment/1234" />
</order>
基本上,这允许消费者进行由<link>
标签定义的付款。然而,实际上,消费者仍然需要知道该 Web 服务调用的所有语义,例如,使用什么方法(POST 或 PUT)、在有效负载中使用什么请求参数以进行支付等。 .. 换句话说,消费者仍然需要依赖 WADL 文档才能知道如何成功调用此 Web 服务。如果这些标签都在一个特定项目上使用 GET,则它们可能更有意义。否则,我真的看不到在这里定义链接有什么好处……除了消费者知道他们接下来可以调用什么动作,然后参考 WADL 来确定如何正确调用它。
我的下一个担忧是最终可能会导致带有所有<link>
标签的非常重的有效负载。例如,如果 /projects/1/users 上的 GET 返回属于项目 1 的所有用户信息,我假设我最终会得到以下标签:-
<project>
<users>
<user id="12" name="mike" ... />
<user id="23" name="kurt" ... />
<user id="65" name="corey" ... />
</user>
<links>
<link rel="self" href="http://server/projects/1/users"/>
<link rel="create_user" href="http://server/projects/1/users"/>
<link rel="get_user_mike" href="http://server/projects/1/users/12"/>
<link rel="get_user_kurt" href="http://server/projects/1/users/23"/>
<link rel="get_user_corey" href="http://server/projects/1/users/65"/>
...
</links>
</project>
如果一个项目包含 500 个用户……我不会在有效负载中有 500 个用户链接吗?否则,重新设计我的 Web 服务以处理这种情况的最佳方法是什么?或者这在现实世界中是否可以接受?
任何想法或建议都非常感谢这里。谢谢你。