Rest “正确的休息响应”;在做任何其他事情之前,您必须在此处发布”;

Rest “正确的休息响应”;在做任何其他事情之前,您必须在此处发布”;,rest,Rest,我们有一个登录REST服务: POST /sessions 当用户密码过期时,接下来必须发生的事情是客户端应用程序将显示一个更改对话框窗口,然后通过以下方式更改用户密码: PUT /users/_ID_/password 向客户传达此意图的最佳方式是什么?起初我想让POST/sessionsreturnSee Other(303)。但这会导致在/users/\u ID\u/password上出现GET。我可以返回一个multiplechoices(300)响应,客户机不会自动启动,或者我可以

我们有一个登录REST服务:

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

PUT /users/_ID_/password
向客户传达此意图的最佳方式是什么?起初我想让
POST/sessions
return
See Other(303)
。但这会导致在
/users/\u ID\u/password
上出现
GET
。我可以返回一个
multiplechoices(300)
响应,客户机不会自动启动,或者我可以返回一个
OK(200)
并在返回的JSON会话对象中添加标记。

查看后,我认为以下是最合适的:

409冲突

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

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

起初我想让
POST/sessions
return
See Other(303)

这是不对的。它本质上是说“不要在这里发布一个会话,
POST
在那里发布一个会话。”你将依靠带外信息和硬编码行为来认识到情况并非如此,你实际上应该在那里发布一个新密码

我可以返回一个
multiplechoices(300)
响应,客户机不会自动进入

但你没有提供多种选择

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

帖子没有成功,所以你不应该回复
200

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


如果请求进入且授权失败,则使用
401 Unauthorized
WWW-Authenticate
标题进行响应。然后使用自定义身份验证方案,表明用户需要更改密码。

除非我对情况的理解不正确,否则用户并没有严格地通过身份验证。他们的密码是正确的,但是,现在需要在继续之前更改密码。我同意Aaron的观点,我不认为身份验证失败。但是客户需要做点什么(这就是为什么我认为30X是最好的选择)。鉴于这两种反应都是在40倍的路线上,我承认我错了。我目前倾向于选择409而不是401,但如果有任何进一步的建议,我将不胜感激。