【问题标题】:Resource paths in a RESTful webserviceRESTful Web 服务中的资源路径
【发布时间】:2023-03-08 17:29:01
【问题描述】:

我正在构建一个遵循 REST 架构风格的 Web 服务。我正在使用 JAX-RS 来简化它。然而,这个问题并不关心技术,而是正确使用资源路径。

我在我的应用程序中创建了一些资源,例如测验、问题和 QuestionFeedback。

我已经创建了路径,例如

/quiz /question/1

等等。现在,我看到了一些暴露路径的 Web 服务 API,例如 /approved/questions/approved。路径的批准部分似乎更像问题可能具有的属性(在这种情况下),我想知道这是否可以,以及将其作为请求参数和像这样的路径的一部分之间的界限在哪里?

是否可以在 Web 服务中公开路径,这些路径以某种方式公开系统中的预期资源之一,例如在本例中为 Question,但是除了普通的 @987654328 之外,还可以通过 /approved 之类的路径@ 小路?规则是什么,这应该是怎样的?

如果没有人问我,我会创建一个类似/questions?type=approved 的路径:GET。

因为已批准不是我系统中的资源。还是可以创建暴露资源的路径...但不要直接使用资源名称。

【问题讨论】:

  • 使用/questions?type=approved。为什么不选择显而易见的方式?
  • 我会像@Tichodroma 建议的那样做。 approvedquestion 的属性,所以它是有意义的。
  • 但我想知道何时以及如何决定这一点。如果我认为是正确的。
  • /questions/1 是对特定资源(“问题 #1”)的引用,因此使用路径对问题的 ID 进行编码是有意义的。调用者将期望此 URL 上的 GET 返回代表问题 1 本身的资源。 /questions?approved=true 是一个查询,它按已批准的问题过滤所有问题的列表。作为调用者,我希望此 URL 上的 GET 能够返回已批准问题的列表。

标签: java web-services rest jakarta-ee jax-rs


【解决方案1】:

您是在询问只能通过附加信息才能理解的路径是否可以。好吧,他们没有,但我不会选择他们。

你的问题是(用我的话来说):

给我所有具有被批准附加功能的问题。

这归结为两个步骤:

第一步

获取所有个问题。

GET /questions

第二步

其中只有那些已经被批准的。

GET /questions?approved=true

这很自然。

相反,为什么第二步会导致/approved?这与/questions 有什么关系?没有明显的方法可以回答这个问题。虽然使用 /pink-elephants 这样的奇怪路径在技术上是可以的,这应该转化为“给我所有批准的问题”,但这不是我推荐的。

【讨论】:

  • 这可能是一个有点奇怪的例子。假设您有一个测验资源/quiz。然后你想要所有被批准的问题,那么你会使用/quiz/questions?type=approved,而不是/quiz/approved,即使它是允许的,但它会产生一个看起来很奇怪的API?对吗?
  • 为此,您将拥有/quizes/42/questions?type=approved:给我所有已批准的测验 42 的问题。是的,我会推荐这个:问题属于一个测验,它们可以被批准。
  • 所以资源是路径,它们可能具有的属性是..payload,不应该在路径中。
  • 您请求的不是 属性,而是具有 属性的资源。这是一个很大的区别。如果您对属性type感兴趣,则可以使用/quizes/42/questions/32/type 来获取问题23 到测验42 的type 属性。但是这不是你想要的,不是吗?
猜你喜欢
  • 2023-04-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多