REST API问题,关于如何尽可能有效地处理集合,同时仍然符合REST原则

net*_*ain 6 rest web-services http design-principles

我是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)
Run Code Online (Sandbox Code Playgroud)

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

REST原则对这种情况有何看法?你有什么看法?

再次感谢.

ser*_*gio 5

这完全是设计问题.

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

GET /user/dave/library/book?bookList=...
Run Code Online (Sandbox Code Playgroud)

你如何进一步指定bookList参数实际上是你设想的这种资源的用途.你可以,例如:

GET /user/dave/library/book?bookList=1-10
GET /user/dave/library/book?bookList=1,2,5,20-25
Run Code Online (Sandbox Code Playgroud)

或者您只需翻阅所有书籍:

GET /user/dave/library/book?page=7&pagesize=50
Run Code Online (Sandbox Code Playgroud)

但在我看来,特别是带有一长串"随机"ID的表单似乎很不合适.也许我会改为定义一个filter参数,所以我可以指定:

GET /user/dave/library/book?filter=key,value&filter=key,value
Run Code Online (Sandbox Code Playgroud)

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

更严格地说,RESTful可以通过HTTP头指定查询参数,但我想传达的一般想法不会改变.

希望这似乎适合你......


man*_*ana 5

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


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

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


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

如果您想迭代 10K 藏书,请使用分页参数