30

POST メソッドの場合、W3 仕様は次のように述べています。

リソースがオリジンサーバーで作成されている場合、応答は 201 (Created) であり、要求のステータスを記述し、新しいリソースを参照するエンティティと、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<IEntityRepository>();
    entityRepository.Add(newEntity);

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

ただし、IE、Firefox、および Chrome はすべて、新しいリソースへのリダイレクトに失敗します。正しい応答を生成するのに失敗したのでしょうか、それとも Web ブラウザーがこのタイプの応答を予期せず、代わりにサーバーに依存してリダイレクト応答を送信するのでしょうか?

4

5 に答える 5

6

私の解決策は、新しいリソースへのリンクを含む単純なページと、location.replace() を使用した JavaScript リダイレクトを含む「201 Created」で応答することです。

これにより、API とブラウザのリクエストに対して同じコードが機能し、[戻る] ボタンと [更新] ボタンで適切に機能し、古いブラウザで適切に機能が低下します。

于 2009-08-27T04:42:03.003 に答える
1

仕様に記載されているように、応答はリダイレクト付きの HTTP 201 である必要があります。したがって、ブラウザー ベンダーが正しい答えを実装することは必須ではありません...

30x コードに変更して、正しくリダイレ​​クトされるかどうかを確認してください。もしそうなら、それはブラウザの問題です。それ以外の場合は、コードに由来する可能性があります(ASP.NETについて何も知らないので、コードを「検証」できません)

于 2009-01-07T13:25:41.017 に答える
0

それは何かが「作成された」ときだけカウントされるべきではないので、アクションへの単純なリダイレクトで本当に十分なはずです。

于 2009-08-27T04:57:59.087 に答える