8

我对 REST 很陌生,但据我所知,我了解以下 URL 符合 REST 原则。资源分布如下:

/user/<username>/library/book/<id>/tags
          ^         ^           ^   ^
          |---------|-----------|---|- user resource with username as a variable
                    |-----------|---|- many to one collection (books)
                                |---|- book id 
                                    |- many to one collection (tags)


GET /user/dave/library/book             //retrieves a list of books id's
GET /user/dave/library/book/1           //retrieves info on book id=1
GET /user/dave/library/book/1/tags      //retrieves tags collection (book id=1)

但是,如何优化这个示例 API?例如,我的图书馆中有 10K 本书,我想获取图书馆中每本书的详细信息。/library/book/<id>我真的应该对给定的每个 id强制进行 http 调用/library/book吗?或者我应该启用多个 id 作为参数?/library/book/<id1>,<id2>...并且喜欢一次批量获取 100 个 id 吗?

REST 原则对这种情况有什么看法?你的意见是什么?

再次感谢。

4

4 回答 4

5

这是严格的设计问题。

我可以定义一个bookc资源并像这样使用它:

GET /user/dave/library/book?bookList=...

您如何进一步指定bookList参数实际上取决于您设想该资源的使用方式。你可以有,例如:

GET /user/dave/library/book?bookList=1-10
GET /user/dave/library/book?bookList=1,2,5,20-25

或者您可以简单地翻阅所有书籍:

GET /user/dave/library/book?page=7&pagesize=50

但在我看来,尤其是带有一长串“随机”ID 的表单似乎非常不合适。也许我会改为定义一个filter参数,以便我可以指定:

GET /user/dave/library/book?filter=key,value&filter=key,value

至于您关于 HTTP URL 长度限制的问题,标准没有设置任何内容。但是浏览器可能会有所不同......看看这个SO主题

为了更严格的 RESTful,可以通过 HTTP 标头指定查询参数,但我想传达的总体思想没有改变。

希望这看起来适合你...

于 2011-05-31T16:07:59.493 回答
5

上面看起来不错,但我会改为复数名称,它读起来更好:


/users/{username}/books/{bookId}

我不明白的是传递逗号分隔的 id 列表的用例。问题是您如何获得ID?我猜在 id 列表后面有语义,即它们代表过滤器的结果。因此,我不会传递 id,而是使用搜索 api。简单的例子:


/users/dave/books?puchasedAfter=2011-01-01
 

如果您想遍历您的 10K 书籍集合,请使用分页参数

于 2011-05-31T20:08:18.807 回答
0

这只是我的看法:

GET /user/dave/library/book/IDList      //retrieves a list of books id's
or
GET /user/dave/library/bookID           //retrieves a list of books id's

GET /user/dave/library/book             //retrieves a list of books
GET /user/dave/library/book/1           //retrieves info on book id=1
GET /user/dave/library/book/1-3         //retrieves info on book id>=1 and id <=3
GET /user/dave/library/book/1/tags      //retrieves tags collection (book id=1)
于 2011-05-31T16:08:17.713 回答
0

您可以使用分页器

一些宁静的 API 与分页器一起工作,以获取大量资源,例如:

http://example.org/api/books?page=2

例如,服务器每页提供 100 条记录(在本例中为书籍)。sortby您可以在获取请求中使用 a 对书籍进行排序。通过上述请求,您将获得 101-200 本书(如果数据库中有这么多)。响应可以告诉您有关书籍数量和页数的信息,下一页和上一页是什么,但是您会更多地去 HATEOAS。

否则,如果您想获得某些 id,我会这样做:

http://example.org/books?id=[]2&id=[]5&id=[]7&id=[]21

带有 id 数组 (id = [2,5,7,21]) 的 get 请求,它返回具有相应 id 的书籍

于 2014-04-30T16:08:31.683 回答