寻找一些建议来帮助我设计一个宁静的服务。
/products
时会发生什么。我应该退回所有产品还是50?getAllProducts()
方法编写吗?sort
和search
功能。这两个人会去哪儿?这是我的假设:
@RequestMapping("/products")
public String getAllProducts(@QueryParam(value="page") int page, @QueryParam(value="sort") String orderBy) {
@RequestMapping("/search/products")
public String findProducts(@QueryParam(value="q") String searchCriteria) {
答案 0 :(得分:1)
正如您所建议的那样,常规练习是使用参数。
根据您的要求,您可以使用其中一个:
?page=$pagenumber
(由您定义的页面大小)?page=$pagenumber?per_page=$pagesize
(由客户定义的页面大小)(这就是GitHubs的做法) ?start=$idOfFirstElement?per_page=$idOfLastElement
(没有“人工”页面,更接近数据库)当然,您可以(或可能应该)限制变体2和3的输入,如果结果很大,则返回#4XX
响应代码。
- 获取所有产品:当客户尝试获取所有产品
醇>/products
时会发生什么。我应该退回所有产品还是50?
常规和预期的RESTful行为将是获取所有产品,而在真实环境中通常是不可能的。 (想想有10k产品的“小型”网上商店)。
基本上你有两种设计选择:
#4XX
回复。我建议使用第一个,因为它看起来更清洁,并且不会给客户造成混淆。
- 我计划拥有
醇>sort
和search
功能。这两个人会去哪儿?
与页面参数相同。只需将它们添加到URI即可。
例如
?sortBy="price"
?sort="ASC"
?sort="DESC"
?searchFor="lalalala"
- 如果服务将返回前50或前100,那么我应该在哪里写分页逻辑?我应该用相同的
醇>getAllProducts()
方法编写吗?
遗憾的是,我们无法用您的少量给定代码对此进行评论。 ......而且Code Review
并非如此答案 1 :(得分:1)
我建议的是保持查询字符串的语义简单,API的使用者可以轻松遵循的字词,这些查询参数的分页可以是offset
和limit
,通过这种方式,客户端可以控制要检索的内容,例如:
我可能只对偏移量为100的前2个元素感兴趣,这比每次检索固定量时都要好。请记住,虽然客户端可以设置限制,但您应该在服务器端具有最大限制值,这样您就不会最终检索所有对象并降低应用程序的速度。
使用偏移和限制分页的URL表示将是:
GET /products?offset=10,limit=50
关于搜索,您还希望使用该方法,您必须定义资源的哪些属性是可查询的和顺序等。此外,您可能希望定义一个从所有可查询属性查询的参数(例如q
)因此,对您的收藏集的请求如下:
GET /products?offset=10,limit=50,name=*rest*&description=*rest*
或
GET /products?offset=10,limit=50,q=rest
另外,我建议你查看这个关于Designing REST + JSON APIs的视频(我在Stormpath工作的完全披露,但我确实认为这是一个宝贵的资源),Les谈到1:00:00左右的分页,你希望快进的情况。
希望它有所帮助,
何塞路易斯