【问题标题】:Designing restful APIs path - for returning filtered resource and for returning trimmed properties of a resource设计 restful API 路径 - 用于返回过滤的资源和返回资源的修剪属性
【发布时间】:2018-05-17 06:53:18
【问题描述】:

我不是在问What is the difference between @PathParam and @QueryParam 已经问过的问题

这个问题与围绕 restful 约定的“最佳实践”有关。

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

 [  
       {  
          "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. 以算法的技巧返回问题。

我认为没有标准的惯例。有没有?但是,我想听听人们如何为上述用例设计 REST API。我也很想听听这种做法背后的原因。

感谢这里的领导。

【问题讨论】:

  • 我投票结束这个问题,因为在为您的 API 设计 URI 时没有对错。答案将仅反映有意见的建议。此外,在 REST 生态系统中,URI 的结构方式甚至都无关紧要,因为客户端将使用有意义的关系名称(如 next、prev、self、first 或 last)来推断无论如何,URI。像部分资源表示这样的东西应该通过内容协商或部分 GET 请求进行通信(尽管客户端事先已经有一些知识;~ ANTI-REST)

标签: java rest jax-rs spring-restcontroller


【解决方案1】:

正如你提到的,没有标准的方法来做到这一点。

我认为这两个是过滤器:

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

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

这可能看起来像这样:

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

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

要只返回问题的标题,人们可能会争辩说这可以是一个单独的标题资源。

例如:

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

如果您使用自定义媒体类型,您还可以为此资源定义简化的媒体类型并通过Accept-Header 请求此类型: 例如

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

或者您可以使用额外的查询参数为调用者提供更多控制权: 例如:

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

【讨论】:

  • 我不同意/questions?output=reduced。我建议为此使用内容协商并请求例如InfoObject 被缩减
  • 谢谢,这是有道理的。但是,我不确定您提到的两种获取问题标题的方法的优缺点是什么。
  • @HerrDerb 我同意output=reduced 不是最佳选择。我还添加了一种使用 Accept 标头的方法。
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
相关资源
最近更新 更多