代码之家  ›  专栏  ›  技术社区  ›  Darrel Miller

如果发布到一个URL,我如何告诉客户机查看响应的片段?

  •  1
  • Darrel Miller  · 技术社区  · 15 年前

    我想发布一个实体如下

    POST /example.org/MyEntity/100
    

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

    /example.org/MyEntity/100#InterestingPart
    

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

    有更好的方法吗?

    更新:我的客户机不局限于Web浏览器的限制。我只是从HTTP的角度来看这个问题。

    更新2:根据我对rfc2616的阅读,我看不到任何阻止我返回200和包含片段标识符的位置头的内容。有人知道我不能这样做的原因吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Michael Krelin - hacker    15 年前

    我认为唯一合理的解决办法是 action URL具有静态片段标识符,如 <form method="post" action="/action#anchored"> 然后在生成页面时,将锚定在您希望用户查看的任何位置。

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

        2
  •  1
  •   Jon Flanders    15 年前

    我倾向于返回201-并让位置头指向您希望客户机获得的URI。

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

        3
  •  0
  •   HttpWatchSupport    15 年前

    您通常应该重定向每个帖子,以避免刷新页面和使用后退按钮时出现问题。这被称为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应用程序更加用户友好。

    然后可以将片段添加到重定向的URL中。

    本页有一个带片段的prg示例:

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

        4
  •  0
  •   Rich Apodaca    15 年前

    发布到URI:

    http://example.org/MyEntity/100
    

    对我来说,意味着一个称为“100”的髓质资源已经存在。如果是这样的话,为什么不使用Put?这是更新操作还是创建操作?

    另一种选择可能是:

    POST http://example.org/MyEntities
    

    现在,您的服务至少有两种选择:

    1. 返回201已创建。将location header设置为希望客户机使用的URI(例如: http://example.org/MyEntities/100#InterestingPart )将新资源的表示形式添加到主体。
    2. 返回204无内容。同上,但无正文。此选项需要随后的get来获取表示,这听起来像是您试图避免的。

    这两种方法都不需要重定向,并且都可以根据需要返回特定的URI。

    我很好奇,为什么有趣的部分很重要?为什么不返回整个表示和它的URI呢? http://example.org/MyEntities/100 在location header中——让客户自己决定什么是有趣的还是不有趣的?如果答案只与请求期间感兴趣(或被修改)的资源的一小部分有关,那么将myresource分解为一个主资源和一个或多个从属资源是多么可行?例如:

    • /myresources/100/冷却物
    • /myresources/100/冷却物/42
    • /myresources/100/有趣的东西
    • /myresources/100/有趣的东西/109