我正在设计一个REST API,用于将记录插入“solutions”表。 “解决方案”具有solverID,problemID。我有两种不同的设计:
POST /solutions
并使用解决方案的内容传递JSON中的solverID和problemID。或者将solverID和problemID放在URI中:
POST /users/:solver_id/problems/:problem_id/solutions
哪种设计更好?
答案 0 :(得分:1)
选择第一个。我会保持你的网址尽可能简洁明了。这是我头顶的一些其他例子。不确定整个结构。
POST /solutions
GET /solutions?solverid=123 //query solutions by user
GET /users/555/problems // problems for a given user
GET /users/555/solutions // solutions for a given user
GET /problems/987/solutions // solutions for a given problem
答案 1 :(得分:1)
在一致的层次结构中定义资源是一种很好的做法,因此它们易于理解和预测。
假设这是检索问题的网址 -
GET /users/{solverId}/problems/{problemId}
它清楚地表明问题属于{solverId}。
以下网址会清楚地显示我们正在检索{solverId}解决问题的所有解决方案
GET /users/{solverId}/problems/{problemId}/solutions
要为{problemId}创建新解决方案,您可以在
上发帖POST /users/{solverId}/problems/{problemId}/solutions
要检索特定的解决方案,您可以使用
GET /users/{solverId}/problems/{problemId}/solutions/{solutionId}
何时在路径与查询中使用ID?
如果确定需要ID来标识资源,请在路径中使用它。在上面的场景中,由于需要所有三个ID来唯一地标识解决方案,因此所有这些ID都应该在路径中。
假设您要检索在特定日期范围内提供的解决方案,请使用以下
GET /users/{solverId}/problems/{problemId}/solutions?startDate={}&endDate={}
这里startDate和endDate不能唯一地标识资源,它们只是用于过滤结果的参数。
答案 2 :(得分:0)
我想出了一个方案:只有当路由不需要认证时才包含路由中的用户ID,否则,可以从认证信息中找出用户ID,并且上述路由变为:
POST /problems/:problem_id/solutions