2

We have a login REST service:

POST /sessions

When the users password has expired the next thing that must happen is that the client application will present a change dialog window and then change the users password via:

PUT /users/_ID_/password

What is the best way to communicate this intent to the client? At first I wanted to have POST /sessions return See Other (303). But this causes a GET on /users/_ID_/password. I could return a Multiple Choices (300) response which the client does not do an automatic get on, or I could return an OK (200) and tag in the JSON session object returned.

4

2 回答 2

4

查看HTTP 状态代码定义,我认为以下是最合适的:

409 冲突

由于与资源的当前状态冲突,无法完成请求。仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。响应正文应该包含足够的信息让用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题

与会话资源的当前状态存在冲突,因为用户需要更改密码才能创建会话。您可以在此响应中将 url 返回到更改密码屏幕,以便客户端知道去哪里解决冲突。

于 2012-04-25T10:53:27.187 回答
1

起初我想要POST /sessionsreturn See Other (303)

这是不正确的。它本质上是在说“不要POST在这里POST开会,在那边开会”。 您将依赖带外信息和硬编码行为来识别情况并非如此,您实际上应该POST在那里使用新密码。

我可以返回Multiple Choices (300)客户端不自动启动的响应

但是您没有提供多种选择。

或者我可以OK (200)在返回的 JSON 会话对象中返回一个 and 标记。

POST 不成功,因此您不应使用200.

是真的在要求“正确的 REST 响应”,还是在问如何使用 HTTP 实现特定的效果?因为您似乎在寻找漏洞而不是正确的设计。

如果一个请求进来并且授权失败,那么用401 Unauthorized一个WWW-Authenticateheader 来响应。然后使用指示用户需要更改密码的自定义身份验证方案。

于 2012-04-25T11:17:10.007 回答