如果POST到URL,我如何告诉客户端查看响应的片段?

时间:2009-09-07 13:58:38

标签: http rest

我想按如下方式发布实体

POST /example.org/MyEntity/100

基于传递的实体,服务器希望使用片段标识符将用户的注意力吸引到响应的特定部分。 e.g。

/example.org/MyEntity/100#InterestingPart

如何将此新URL返回给客户端。我假设我可以使用3XX响应代码进行某种形式的重定向,但实际上我不希望客户端执行另一个请求,因为两个URL之间的唯一区别是片段。目前似乎307返回代码是最合适的,因为根据规范,您不应该自动重定向POST。

有更好的方法吗?

更新:我的客户端不仅限于网络浏览器的限制。我只是从HTTP的角度看这个。

Update2:基于我对RFC2616的阅读,我看到没有什么能阻止我返回包含片段标识符的200和Location头。有人知道我不能这样做的原因吗?

4 个答案:

答案 0 :(得分:2)

我认为唯一明智的解决方案是让action URL具有静态片段标识符,例如<form method="post" action="/action#anchored">,然后在生成页面时将用户放在任何位置放置锚点。

但是,回答Update2:不,没有理由避免它。

答案 1 :(得分:1)

我倾向于返回201 - 并且位置标题指向您希望客户端获取的URI。

我没看,但是IIRC没有说明位置标题指向创建的资源,因此它应该是规范合法的。

答案 2 :(得分:0)

您通常应该重定向每个POST,以避免刷新页面和使用后退按钮时出现问题。这称为PRG(POST Redirect Get)模式:

http://blog.httpwatch.com/2007/10/03/60-of-web-users-can%E2%80%99t-be-wrong-%E2%80%93-don%E2%80%99t-break-the-back-button/

虽然这确实会导致另一次往返服务器的成本,但它会使您的Web应用程序更加用户友好。

然后,您可以将片段添加到重定向的网址上。

此页面上有一个带有片段的PRG示例:

http://www.httpwatch.com/httpgallery/redirection/

答案 3 :(得分:0)

发布到URI:

http://example.org/MyEntity/100

对我来说意味着已经存在名为“100”的MyEntity资源。如果是这样的话,为什么不使用PUT呢?这是更新还是创建操作?

替代方案可能是:

POST http://example.org/MyEntities

现在,您的服务可以选择至少两种可能性:

  1. 返回201创建。将Location标头设置为您希望客户端使用的URI(例如:http://example.org/MyEntities/100#InterestingPart)。将新资源的表示添加到正文中。
  2. 返回204无内容。与上面相同,但没有身体。此选项需要后续GET来获取表示,这听起来就像您要避免的那样。
  3. 这两种方法都不需要重定向,并且两者都可以根据需要返回特定的URI。

    我很好奇,为什么#InterestingPart很重要?为什么不在Location头中返回整个表示及其URI http://example.org/MyEntities/100 - 让客户自己决定什么是有趣的?如果答案与请求期间感兴趣(或被修改)的资源的一小部分有关,那么将MyResource分解为主资源和一个或多个下级资源有多可行?例如:

    • /为MyResources / 100 / CoolThings
    • /为MyResources / 100 / CoolThings / 42
    • /为MyResources / 100 / InterestingThings
    • /为MyResources / 100 / InterestingThings / 109