当前位置:  开发笔记 > 编程语言 > 正文

对HTTP POST请求的正确响应是什么?

如何解决《对HTTPPOST请求的正确响应是什么?》经验,为你挑选了3个好方法。

对于POST方法,W3规范说:

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含描述请求状态的实体,并引用新资源和Location头(请参阅第10.4节).

http://www.ietf.org/internet-drafts/draft-ietf-httpbis-p2-semantics-05.txt(8.5节)

标准响应实际上似乎是将重定向发送到新创建的资源.

我正在使用ASP.NET MVC构建我的站点,并尝试遵循规范,因此创建了一个ResourceCreatedResult类:

public class ResourceCreatedResult : ActionResult
{
    public string Location { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.StatusCode = 201;
        context.HttpContext.Response.ClearHeaders();
        context.HttpContext.Response.AddHeader("Location", Location);
    }
}

我的行为看起来像这样:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateNew(string entityStuff)
{
    Entity newEntity = new Entity(entityStuff);
    IEntityRepository entityRepository = ObjectFactory.GetInstance();
    entityRepository.Add(newEntity);

    ActionResult result = new ResourceCreatedResult()
        { Location = Url.Action("Show", new { id = newEntity.Id }) };
    return result;
}

但是,IE,Firefox和Chrome都无法重定向到新资源.我是否搞砸了生成正确的响应,或者网络浏览器不期望这种类型的响应,而是依靠服务器发送重定向响应?



1> dthrasher..:

明确地说,浏览器(包括像Firefox 3和IE8这样的现代浏览器)不会"接受提示"并HTTP 201: Created使用GET请求跟踪对Location头中提供的URI 的响应.

如果您希望浏览器转到Location标头中提供的URI,则应该发送HTTP 303: See Other状态.


303似乎是为此目的明确的正确代码:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

2> S.Lott..:

post或post/redirect/get之后的重定向是您的应用程序必须做的事情才能使用户友好.

编辑.这超出了HTTP规范.如果我们在POST后返回201,则浏览器后退按钮表现不佳.

请注意,Web服务请求(不响应浏览器)完全遵循标准,并且不会在发布后重定向.

它的工作原理如下.

    浏览器POSTS数据.

    您的应用程序验证数据.如果它无效,您可以使用表单进行响应,以便他们可以修复它并发布POST.

    您的应用程序使用重定向进行响应.

    浏览器获取重定向并执行GET.

    您的应用程序会看到GET并做出响应.

现在 - 嘿presto! - 后退按钮有效.


这不回答这个问题.我理解这个机制,我想知道为什么它与HTTP规范有根本的不同?

3> Greg Inozemt..:

我的解决方案是回复一个'201 Created',其中包含一个带有新资源链接的简单页面,以及一个使用location.replace()的javascript重定向.

这使得相同的代码可以用于API和浏览器请求,可以很好地使用"后退"和"刷新"按钮,并在旧浏览器中优雅地降级.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有