【问题标题】:Correct addressing in REST API [closed]REST API 中的正确寻址 [关闭]
【发布时间】:2018-07-06 21:56:02
【问题描述】:

我创建了一个应用程序,您可以在其中提问和回答。关于如何创建地址以添加对问题答案的评估的决定,我有一个小问题。

我有两个想法

POST http://localhost:8080/answers/{answerId}/votes

POST http://localhost:8080/questions/{questionId}/answers/{answerId}/votes

在我看来,第一个地址更合适,因为在网站上我将能够得到答案

AnswerEntity answerEntity = this.answerRepository.getById(answerId);
answerEntity.setVotes(...);

但是,第二个地址的服务看起来像这样

QuestionEntity questionEntity = this.questionRepository.getById(questionId);
for(AnswerEntity answer : questionEntity .getAnswers()) {
     if(answer.getId().equals(answerId) [
          answerEntity = answer;
     }
}
answerEntity.setVotes(...);

因此,在我看来,第一个地址更好,但我想就这个问题征求您的意见。根据 REST API,第一个地址的语法是否正确?

【问题讨论】:

  • 因为answerId 可能是独一无二的,所以使用它。
  • 你的意思是第一个地址吗?根据 REST API,第一个地址的语法是否正确?
  • 为什么不呢?
  • 不知道问你。所以我用第一个地址给答案打分没有问题吗?
  • 请不要破坏您的帖子。

标签: java spring rest spring-mvc spring-boot


【解决方案1】:

这两种路径都对 REST API 有效,但它们具有不同的语义。

第一个路径/answers/{answerId}/votes 应该允许访问系统中任意答案的投票,只需使用唯一答案 ID 作为参考即可。这里没有问题上下文。

第二条路径/questions/{questionId}/answers/{answerId}/votes 限制了可在 URL 中使用的有效答案 ID 集,因为该路径的开头将上下文缩小到特定问题。那么只有针对该特定问题的答案 ID 才可以请求相应的投票。

所以这取决于您想为您的消费者提供什么,即最适合您的消费者需求的东西。

【讨论】:

  • 要从数据库中得到答案,我只需要一个answerId。因此,根本不会使用第二个地址中的questionId。那么为什么为什么要在第二个地址中使用questionId
  • 这是关于你想用 REST API 提供什么语义。当然,您可以通过数据库中的唯一 ID 加载答案,但这真的是您想要作为 API 提供给消费者的吗?如果您想遵循领域驱动设计,则第二条路径更合乎逻辑,因为没有问题就不可能存在答案,对吧?如果你想确保 API 约束消费者只访问他们所属问题的答案的投票,那么你应该选择第二条路径。
猜你喜欢
  • 2023-02-26
  • 2023-03-08
  • 2012-01-08
  • 1970-01-01
  • 2015-12-22
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多