设计restful API路径 - 用于返回已过滤的资源以及返回资源的已修剪属性

时间:2018-05-17 06:53:19

标签: java rest jax-rs spring-restcontroller

我不会问What is the difference between @PathParam and @QueryParam

中已经提出过的问题

这个问题与关于宁静惯例的“最佳实践”有关。

我有一个带有以下字段的问题资源。

 [  
       {  
          "questionId":6,
          "area":"TECHNICAL",
          "title":"Find the index of first 1 in an infinite sorted array of 0s and 1s",
          "description":"Given an infinite sorted array consisting 0s and 1s. The problem is to find the index of first 1 in that array. As the array is infinite, therefore it is guaranteed that number 1 will be present in the array.",
          "state":"ACTIVE",
          "difficultyLevel":"EASY",
          "skills":[  
             {  
                "skillId":1,
                "skillName":"ALGORITHM"
             },
             {  
                "skillId":2,
                "skillName":"PROGRAMMING"
             }
          ],
          "proposedBy":"agrawalo",
          "noOfTimesUsed":0,
          "examples":null,
          "probes":null,
          "approvedBy":null,
          "addedBy":null,
          "dateCreated":"2018-05-16T19:29:11.113",
          "dateLastUpdated":"2018-05-16T19:29:11.113"
       }, 
       {
        ...
       },
       ...
    ]

我从spring应用程序中暴露了一个休息控制器,使用pathparam“/ questions”

返回所有问题

现在我想为以下案例设计Rest URL(基本上是返回过滤的问题集的URL和返回问题对象部分的URL)。例如:

  1. 仅返回所有问题的标题。
  2. 仅返回所有技术问题的标题。
  3. 以技巧为算法返回问题。
  4. 我不认为有这样做的标准惯例。在那儿?但是,我想知道人们如何为上述用例设计REST API。我也很想知道这种做法背后的原因。

    这里的潜在客户表示赞赏。

1 个答案:

答案 0 :(得分:3)

如你所述,没有标准的方法可以做到这一点。

我认为这两个是过滤器:

  • 返回所有技术问题
  • 以技巧为算法返回问题。

在REST中,过滤器通常使用查询参数来实现。 (路径参数用于标识资源。过滤器不是资源,因此它通常不是路径的一部分)

这可能是这样的:

  • /questions?area=technical
  • /questions?skill=algorithm

如果您需要更高级的过滤器,可以查看RSQL(例如:https://github.com/jirutka/rsql-parser

要仅返回问题标题,可以说这可能是一个单独的标题资源。

例如:

  • /question-titles
  • /question-titles?area=technial

如果您使用自定义媒体类型,您还可以为此资源定义简化媒体类型,并通过Accept - 标题请求此类型: E.g。

GET /questions?area=technial Accept: application/vnd.yourapp.question.short+json

或者您可以使用其他查询参数为调用者提供更多控制权: E.g:

  • /questions?fields=title
  • /questions?output=reduced