web服务-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万本书,我想获取图书馆里每本书的详细信息。我真的应该为/library/book中给定的每个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

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

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

希望这似乎适合你。。。

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


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

我不理解的是传递以逗号分隔的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)

您可以使用分页器

一些restful API使用分页器为巨大的资源工作,如:

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

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

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

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

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

最新更新