在休息URI中的第一级之后使用超媒体?

时间:2013-10-16 03:58:02

标签: rest

我想你有没有像这样的UriTemplates:

http://myapi.com/cage/12/pigs/23 - 给我12只笼子里的猪23

我认为标准版或REST API通常不会粘贴在/ pigs / 23上。我想你只是将所有东西保持在一个水平,所以如果我想要那只猪,它会从Pig服务中获得它and by sending a request to /pigs/23

换句话说,你永远不会看到这样的网址进入RESTful API:

http://myapi.com/cage/12/pigs/23

因为你在处理猪服务中的特定方法时如何处理?你会从pig服务的GetByCage(int id,int cageId)中删除12的cageId吗?

我认为这会变得太复杂,因为我可以在给定的资源中看到大量的这类BySomething方法,如果你考虑在API中执行此操作的所有资源,这些方法可能会变得不一致或不可维护。

如果我不是不正确,我相信人们只将它保留到[资源] / [id] - 一个级别意味着你永远不会超越Uri中的初始资源或id,你就会停在那里。然后在响应中使用超媒体为消费者提供另一个Uri以获取其他资源。

所以在http://myapi.com/cage/12/pigs/23的情况下,它应该永远不会那样。它应该是对/ cage / 12的调用,你得到那个笼子表示。然后在笼子json对象中你会看到一个属性可能像http://myapi.com/pigs/23并再打一次电话?这是2次调用,可能很重,而不是以某种方式通过将子资源放入Uri中来进行一次调用(猪是笼子的子资源)。所以你把sub resoure作为超媒体(主要资源中的链接)放在那里,然后停在那里,这意味着在REST API中你永远不会超出你请求的第一个资源,你不会在url本身列出子资源,而是使用超媒体相反,并将其嵌入第一个资源......对吗?

不知道,但我也发现了这个: http://stateless.co/hal_specification.html

2 个答案:

答案 0 :(得分:2)

没有错
myapi.com/cage/12/pigs/34

如果在您返回的资源的上下文中有意义。如果pig 34仅在cage 12的上下文中有意义,并且与pig 34中的cage 09不同,那么这尤其正确,那么这将是正确的方法它。如果您的客户想要使用URL myapi.com/cage/12/pigs查询笼子12中的所有猪,这也是有意义的,这应该返回该笼子中所有猪的URL。

通常不要强调URL在您的服务器上解析的难度,几乎每种用于Web开发的语言都有库来帮助解决这个问题。想一想与资源表示有关的内容。

答案 1 :(得分:0)

我已经找到了自己的解决方案。那就是使用超媒体作为管理资源链接(关系)的手段,而不是处理并让您的用户处理更复杂的URI。

无论如何,看着这个,你就明白了,他说得很完美。

https://www.youtube.com/watch?feature=player_embedded&v=5WXYw4J4QOU