我想按如下方式发布实体
POST /example.org/MyEntity/100
基于传递的实体,服务器希望使用片段标识符将用户的注意力吸引到响应的特定部分。 e.g。
/example.org/MyEntity/100#InterestingPart
如何将此新URL返回给客户端。我假设我可以使用3XX响应代码进行某种形式的重定向,但实际上我不希望客户端执行另一个请求,因为两个URL之间的唯一区别是片段。目前似乎307返回代码是最合适的,因为根据规范,您不应该自动重定向POST。
有更好的方法吗?
更新:我的客户端不仅限于网络浏览器的限制。我只是从HTTP的角度看这个。
Update2:基于我对RFC2616的阅读,我看到没有什么能阻止我返回包含片段标识符的200和Location头。有人知道我不能这样做的原因吗?
答案 0 :(得分:2)
我认为唯一明智的解决方案是让action
URL具有静态片段标识符,例如<form method="post" action="/action#anchored">
,然后在生成页面时将用户放在任何位置放置锚点。
但是,回答Update2
:不,没有理由避免它。
答案 1 :(得分:1)
我倾向于返回201 - 并且位置标题指向您希望客户端获取的URI。
我没看,但是IIRC没有说明位置标题指向创建的资源,因此它应该是规范合法的。
答案 2 :(得分:0)
您通常应该重定向每个POST,以避免刷新页面和使用后退按钮时出现问题。这称为PRG(POST Redirect Get)模式:
虽然这确实会导致另一次往返服务器的成本,但它会使您的Web应用程序更加用户友好。
然后,您可以将片段添加到重定向的网址上。
此页面上有一个带有片段的PRG示例:
答案 3 :(得分:0)
发布到URI:
http://example.org/MyEntity/100
对我来说意味着已经存在名为“100”的MyEntity资源。如果是这样的话,为什么不使用PUT呢?这是更新还是创建操作?
替代方案可能是:
POST http://example.org/MyEntities
现在,您的服务可以选择至少两种可能性:
这两种方法都不需要重定向,并且两者都可以根据需要返回特定的URI。
我很好奇,为什么#InterestingPart很重要?为什么不在Location头中返回整个表示及其URI http://example.org/MyEntities/100 - 让客户自己决定什么是有趣的?如果答案与请求期间感兴趣(或被修改)的资源的一小部分有关,那么将MyResource分解为主资源和一个或多个下级资源有多可行?例如: