In Is HTTP 303 acceptable for other HTTP methods? we established that HTTP 303 can be used for other HTTP methods.
The Post/Redirect/Get pattern requires the server to carry out an operation before returning HTTP 303
. Is the same true for HTTP PUT
and DELETE
for this and other types of redirects? Is the server required to carry out the operation before redirection? Or can it assume that the client will repeat the request on the canonical URL as necessary?
This becomes even more interesting when you consider the fact that redirection is often used for load-balancing.
Quoting RESTful Web Services page 378:
303 ("See Other")
The request has been processed, but instead of the server sending a response document, it’s sending the client the URI of a response document. This may be the URI to a static status message, or the URI to some more interesting resource.
A few pages later...
307 (“Temporary Redirect”)
The request has not been processed, because the requested resource is not home: it’s located at some other URI. The client should resubmit the request to another URI. For
GET
requests, where the only thing being requested is that the server send a representation, this status code is identicalto 303 (“See Other”)
. A typical case where307
is a good response to aGET
is when the server wants to send a client to a mirror site. But forPOST, PUT, and DELETE
requests, where the server is expected to take some action in response to the request, this status code is significantly different from303
. A303
in response to aPOST, PUT, or DELETE
means that the operation has succeeded but that the response entity-body is not being sent along with this request. If the client wants the response entity-body, it needs to make aGET
request to another URI. A307
in response to aPOST, PUT, or DELETE
means that the server has not even tried to perform the operation. The client needs to resubmit the entire request to the URI in theLocation
header.An analogy may help. You go to a pharmacy with a prescription to be filled. A
303
is the pharmacist saying “We’ve filled your prescription. Go to the next window to pick up your medicine.” A307
is the pharmacist saying “We can’t fill that prescription. Go to the pharmacy next door.”