我对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.主题
希望这似乎适合你。。。
上面看起来不错,但我会改为复数名称,读起来更好:
/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的的书籍