Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the correct response to an HTTP POST request?

For a POST method, the W3 specs say:

If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header (see Section 10.4).

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

The standard response actually seems to be to send a Redirect to the newly created resource.

I'm building my site with ASP.NET MVC, and tried to follow the spec, so created a ResourceCreatedResult class:

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);     } } 

And my action looks something like this:

[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; } 

However, IE, Firefox and Chrome all fail to redirect to the new resource. Have I messed up generating the correct response, or do web browsers not expect this type of response, instead relying on servers to send a Redirect response?

like image 419
Giraffe Avatar asked Jan 07 '09 12:01

Giraffe


People also ask

Should 201 response have body?

It is perfectly acceptable to specify a response body and use the Location header at the same time. When using the Location header with a 201 response, you're not redirecting the client, you're just telling it where it can find the resource in future. Redirects only apply to 3xx responses.

What happens after a POST request?

In computing, POST is a request method supported by HTTP used by the World Wide Web. By design, the POST request method requests that a web server accept the data enclosed in the body of the request message, most likely for storing it. It is often used when uploading a file or when submitting a completed web form.

Does HTTP POST return data?

The HTTP POST method sends data to the server. The type of the body of the request is indicated by the Content-Type header.

What is a HTTP response?

An HTTP response is made by a server to a client. The aim of the response is to provide the client with the resource it requested, or inform the client that the action it requested has been carried out; or else to inform the client that an error occurred in processing its request.


2 Answers

To be explicit, browsers (including modern browsers like Firefox 3 and IE8) do not "take the hint" and follow up an HTTP 201: Created response with a GET request to the URI supplied in the Location header.

If you want browsers to go to the URI supplied in the Location header, you should send an HTTP 303: See Other status instead.

like image 136
dthrasher Avatar answered Sep 29 '22 02:09

dthrasher


Redirect after post or post/redirect/get is something your application must do to be user friendly.

Edit. This is above and beyond the HTTP specifications. If we simply return a 201 after a POST, the browser back button behaves badly.

Note that Web Services requests (which do NOT respond to a browser) follow the standard completely and do NOT redirect after post.

It works like this.

  1. The browser POSTS the data.

  2. Your application validates the data. If it's invalid, you respond with the form so they can fix it and POST.

  3. Your application responds with a redirect.

  4. The browser gets the redirect and does a GET.

  5. Your application sees the GET and responds.

Now -- hey presto! -- the back button works.

like image 36
S.Lott Avatar answered Sep 29 '22 01:09

S.Lott