我在开发一些REST API的一个十字路口,我发现关于这个问题的少得多的任意一个坚定的防守没有真正的讨论。
这是我的理解,与REST你有/<resource>/<action>
为您的网址
因此,禁用用户你会:
PUT /user/disable
似乎是合理的。 但是,我们有辩论正在进行更多的基本方法:
它应该是:
POST /user (creates a user *implicitly*)
POST /user/create (creates a user *explicitly*)
DELETE /user/:id
DELETE /user/:id/delete
第一个似乎是什么被认为是“标准”,第二个是要明显得多清楚它的意图,并与像/用户/禁用方法一致
也许这个争论激烈的其他地方,但我还没有看到它。 如果你是“宗教”这个,现在是你的机会来武断
有/<resource>/<action>
为您的网址不休息。 REST使用HTTP动词来决定行动,对给定资源执行,还是对资源的集合。 这意味着:
- 创建资源:
POST /users
- 阅读资源:
GET /users/<id>
- 更新(实际上替换)的资源是:
PUT /users/<id>
- 删除资源:
DELETE /users/<id>
这是REST。
对于所有其他方法,你可以用其他的动词,如PATCH
。 禁用用户可以是:
PATCH /users/<id>/disable
这不是纯粹的REST,但它的确定。
编辑:如果你想成为REST标准,禁用用户意味着你要改变他的状态。 换句话说,你想改变其性质类似的一个state
标志。 你可以在“打补丁”的资源:
PATCH /users/<id>?state=disabled
这是REST。 您也可以通过使用替代资源PUT
在注释中的描述。
@Christian邦焦尔诺
您编码的URI具有无关REST的行动。 这是RPC的最清晰的形式。
您需要确定资源,完成对这些资源的行动,在你使用(即HTTP你的情况)底层协议中定义的方法。 HTTP规范定义了这些方法,这样,而不是直接编码行动中的URI必须执行以下语义:
- GET /用户 - 回报用户的名单(有自己的链接,特定用户的每个条目/项)
- GET /用户/:ID - 返回特定用户
- POST /用户 - 在创建/用户资源新用户
- POST /用户/:ID - 编辑用户(或者PATCH方法可以在这里使用的)
- PUT /用户/:ID - 替代用户
- DELETE /用户/:ID - 删除用户
这是你应该如何看待行动。 但是,这是不够的,你需要为了使用媒体格式提供支持,这样的超媒体控件链接(如最低),以能够描述这些动作,例如见:
- HAL - http://stateless.co/hal_specification.html
- Collection.JSON - http://amundsen.com/media-types/collection/format/
- 链接关系的注册表- http://www.iana.org/assignments/link-relations/link-relations.xml
一些快速交互的例子:
***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
在你的URL操作不是休息。
我解决这个方法是定义一个动作子资源。
你可以这样做:
POST /users/123/actions
和请求体为JSON:
{ "type": "reset_password", "current_password": "mypassword", "new_password": "$myNewPass2#" }