将ID发布到REST API

时间:2013-03-14 17:05:44

标签: rest

我正在设计一个REST API,用于将记录插入“solutions”表。 “解决方案”具有solverID,problemID。我有两种不同的设计:

POST /solutions

并使用解决方案的内容传递JSON中的solverID和problemID。或者将solverID和problemID放在URI中:

POST /users/:solver_id/problems/:problem_id/solutions 

哪种设计更好?

3 个答案:

答案 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