我们有一个登录REST服务:
POST /sessions
当用户密码过期时,必须发生的下一件事是客户端应用程序将显示更改对话框窗口,然后通过以下方式更改用户密码:
PUT /users/_ID_/password
将此意图传达给客户的最佳方式是什么?首先,我希望POST /sessions
返回See Other (303)
。但这会导致GET
/users/_ID_/password
。我可以返回一个Multiple Choices (300)
响应,客户端不会自动启动,或者我可以在返回的JSON会话对象中返回OK (200)
和标记。
答案 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 Unauthorized
和WWW-Authenticate
标头进行回复。然后使用自定义身份验证方案,指示用户需要更改其密码。