REST API问题,即如何在仍符合REST原则的同时如何尽可能有效地处理集合

问题描述

| 我对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?假设我的图书馆有1万本书,而我想获取图书馆中每本书的详细信息。我真的应该为ѭ2given中给出的每个ID强制向
/library/book/<id>
发出http调用吗?还是应该启用多个ID作为参数?
/library/book/<id1>,<id2>...
,是否喜欢一次以100个ID批量获取? REST原则对这种情况有何看法?您对此有何看法? 再次感谢。     

解决方法

        严格地说,这是设计问题。 我可以定义一个
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长度限制的问题,该标准未设置任何限制。但是浏览器可能有所不同...请看此S.O.话题 为了更严格地实现RESTful,可以通过HTTP标头指定查询参数,但是我想要传达的基本思想没有改变。 希望这看起来适合您...     ,        上面看起来不错,但我将改为复数名称,它读起来更好:
/users/{username}/books/{bookId}
我不明白的是传递用逗号分隔的ID列表的用例。问题是您如何获得ID?我想id列表的后面有语义,即它们表示过滤器的结果。因此,除了传递ID之外,我还会使用搜索API。简单的例子:
/users/dave/books?puchasedAfter=2011-01-01
如果要遍历10K书籍集,请使用分页参数。     ,        这只是我的看法:
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)
    ,        您可以使用分页器 一些宁静的API与分页器一起工作以获取大量资源,例如:
http://example.org/api/books?page=2
服务器每页传送例如100条记录(在本例中为书籍)。然后,您可以在get请求中使用ѭ15排序书籍。通过上述请求,您将获得101-200本书(如果数据库中有很多书籍)。响应可以告诉您有关书籍数量和页面数量的信息,什么是下一页和上一页,但是随后您将进一步了解HATEOAS。 否则,如果您想获取特定的ID,我会这样做:
http://example.org/books?id=[]2&id=[]5&id=[]7&id=[]21
一个带有id \(id = [2,7,21])数组的get请求,该请求返回具有相应id \     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...