正确的REST响应“您必须在执行任何其他操作之前在此处发布”

时间:2012-04-25 10:32:17

标签: rest

我们有一个登录REST服务:

POST /sessions

当用户密码过期时,必须发生的下一件事是客户端应用程序将显示更改对话框窗口,然后通过以下方式更改用户密码:

PUT /users/_ID_/password

将此意图传达给客户的最佳方式是什么?首先,我希望POST /sessions返回See Other (303)。但这会导致GET /users/_ID_/password。我可以返回一个Multiple Choices (300)响应,客户端不会自动启动,或者我可以在返回的JSON会话对象中返回OK (200)和标记。

2 个答案:

答案 0 :(得分:4)

看一下HTTP status code definitions,我认为以下是最合适的:

  

409冲突

     

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

与会话资源的当前状态存在冲突,因为用户需要在能够创建会话之前更改其密码。您可以将URL返回到此响应中的更改密码屏幕,以便客户端知道应该在何处修复冲突。

答案 1 :(得分:1)

  

首先,我希望POST /sessions返回See Other (303)

这不正确。它本质上是说“不要POST这里的会话,POST会话就在那里。”你将依赖带外信息并且很难 - 编码行为,以识别情况并非如此,您实际上应该POST新密码。

  

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

但你没有提供多种选择。

  

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

POST未成功,因此您不应回复200

真的要求“正确的REST响应”,或者您是否在询问如何使用HTTP实现特定效果?因为看起来你正在寻找漏洞而不是正确的设计。

如果请求进入且授权失败,则使用401 UnauthorizedWWW-Authenticate标头进行回复。然后使用自定义身份验证方案,指示用户需要更改其密码。