RESTful服务设计:调用获取所有资源端点

时间:2015-04-23 13:20:54

标签: java spring rest restful-architecture

寻找一些建议来帮助我设计一个宁静的服务。

  1. 获取所有产品:当客户尝试获取所有产品/products时会发生什么。我应该退回所有产品还是50?
  2. 如果服务将返回前50或前100,那么我应该在哪里写分页逻辑?我应该用相同的getAllProducts()方法编写吗?
  3. 我计划拥有sortsearch功能。这两个人会去哪儿?
  4. 这是我的假设:

    @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) {
    

2 个答案:

答案 0 :(得分:1)

正如您所建议的那样,常规练习是使用参数。
根据您的要求,您可以使用其中一个:

  1. ?page=$pagenumber(由您定义的页面大小)
  2. ?page=$pagenumber?per_page=$pagesize(由客户定义的页面大小)(这就是GitHubs的做法)
  3. ?start=$idOfFirstElement?per_page=$idOfLastElement(没有“人工”页面,更接近数据库)
  4. 当然,您可以(或可能应该)限制变体2和3的输入,如果结果很大,则返回#4XX响应代码。

      
        
    1. 获取所有产品:当客户尝试获取所有产品/products时会发生什么。我应该退回所有产品还是50?
    2.   

    常规和预期的RESTful行为将是获取所有产品,而在真实环境中通常是不可能的。 (想想有10k产品的“小型”网上商店)。
    基本上你有两种设计选择:

    1. 没有分页信息的HTTP请求很糟糕。提出#4XX回复。
    2. 没有分页信息的HTTP请求使用默认值。 (例如,第一页和每页50个产品)
    3. 我建议使用第一个,因为它看起来更清洁,并且不会给客户造成混淆。

        
          
      1. 我计划拥有sortsearch功能。这两个人会去哪儿?
      2.   

      与页面参数相同。只需将它们添加到URI即可。 例如
      ?sortBy="price" ?sort="ASC" ?sort="DESC" ?searchFor="lalalala"

        
          
      1. 如果服务将返回前50或前100,那么我应该在哪里写分页逻辑?我应该用相同的getAllProducts()方法编写吗?
      2.   

      遗憾的是,我们无法用您的少量给定代码对此进行评论。 ......而且Code Review

      并非如此

答案 1 :(得分:1)

我建议的是保持查询字符串的语义简单,API的使用者可以轻松遵循的字词,这些查询参数的分页可以是offsetlimit,通过这种方式,客户端可以控制要检索的内容,例如:

我可能只对偏移量为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左右的分页,你希望快进的情况。

希望它有所帮助,

何塞路易斯