6

我正处于开发一些 REST API 的十字路口,我发现没有关于这个主题的真正讨论,更不用说对任何一个的坚定辩护了。

据我了解,使用 REST/<resource>/<action>作为您的 URL

因此,要禁用用户,您将拥有:

PUT /user/disable

似乎有道理。但是,我们正在讨论更基本的方法:

应该是:

POST /user  (creates a user *implicitly*)
POST /user/create (creates a user *explicitly*)

DELETE /user/:id
DELETE /user/:id/delete

第一个似乎被认为是“标准”,第二个显然在意图上更加清晰,并且与 /user/disable 等方法一致

也许这场辩论已经在其他地方肆虐,但我没有看到它。如果您对此持“宗教信仰”,那么现在是您进行教皇的机会

4

3 回答 3

5

/<resource>/<action>作为您的 URL 不是 REST 。REST 使用 HTTP 动词来确定要对给定资源或资源集合执行的操作。这意味着:

  • 创建资源是:POST /users
  • 阅读资源是:GET /users/<id>
  • 更新(实际替换)资源是:PUT /users/<id>
  • 删除资源是:DELETE /users/<id>

那就是休息。

对于所有其他方法,您可以使用其他动词,例如PATCH. 禁用用户可能是:

PATCH /users/<id>/disable

这不是纯 REST,但没关系。

编辑:如果你想符合 REST,禁用用户意味着你想改变他的状态。换句话说,你想改变它的一个属性,比如一个state标志。您可以“修补”您的资源:

PATCH /users/<id>?state=disabled

这是 REST。您还可以PUT按照评论中的说明使用替换资源。

于 2012-08-16T07:57:48.727 回答
2

@Christian Bongiorno

您正在对与 REST 无关的 URI 中的操作进行编码。它是最清晰的 RPC 形式。

您需要使用您使用的底层协议中定义的方法(即您的情况下的 HTTP)来识别资源并对这些资源执行操作。HTTP 规范为这些方法定义了语义,因此您必须执行以下操作,而不是直接在 URI 中编码操作:

  • GET /users - 返回用户列表(每个条目/项目都有自己指向特定用户的链接)
  • GET /users/:id - 返回特定用户
  • POST /users - 在 /users 资源下创建新用户
  • POST /users/:id - 编辑用户(也可以在这里使用 PATCH 方法)
  • PUT /users/:id - 替换用户
  • DELETE /users/:id - 删除用户

这就是你应该如何看待行动。但这还不够,您需要使用支持超媒体控件(例如链接)的媒体格式(至少),以便能够描述这些操作,例如:

一些快速交互示例:

***Request***
GET /users HTTP/1.1
Host: service.org
Accept: application/x+json

***Response***
HTTP/1.1 200 OK
Content-Type: application/x+json
Content-Length: ...

[{
  "name": "john",
  "links": {
    "self": "/users/1",
    "edit": "/users/1"
  }
}, {
  "name": "jane",
  "links": {
    "self": "/users/2",
    "edit": "/users/2"
  }
}]

***Request***
GET /users/2 HTTP/1.1
Host: service.org
Accept: application/x+json

***Response***
HTTP/1.1 200 OK
Content-Type: application/x+json
Content-Length: ...
{
  "name": "jane",
  "links": {
    "self": "/users/2",
    "edit": "/users/2"
  }
}

***Request***
DELETE /users/2 HTTP/1.1
Host: service.org

***Response***
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: ...

Resource was destroyed...

***Request***
POST /users/2 HTTP/1.1
Host: service.org
Content-Type: application/x+json
Content-Lenght: ...

{"status": "disabled"}

***Response***
HTTP/1.1 303 See Other
Location: /users/2
于 2012-08-16T07:56:44.093 回答
0

在您的 URL 中执行操作不是 REST。

我解决这个问题的方法是定义一个动作子资源​​。

您可以执行以下操作:

POST /users/123/actions

并请求正文为 json:

{ "type": "reset_password", "current_password": "mypassword", "new_password": "$myNewPass2#" }

于 2018-05-27T17:20:35.137 回答