http://www.intertwingly.net/wiki/pie/PaceResponseBodyToPostRequests

== Abstract ==

Describes how to use HTTP rather than adding unnecessary constraints.

== Status ==

Open (ThomasBroyer)

== Rationale ==

In response to a POST request, when the server creates a new resource
and respond with a 201 (Created) status code, it's still free (per
HTTP) to return whatever body it wants to: "thank you", some debugging
information, warnings, any representation of the created resource
(eventually using content negotiation), etc.

'''There's no technical reason to restrict the returned entity to be
the Atom Entry Document representation of the created resource.'''

HTTP defines a Content-Location header which identifies the actual
location of the returned entity.
On the other hand, it defines a Location header that should be present
in response to POST requests when a new resource has been created
(using a 201 (Created) status code).
It's pretty easy to understand that if Content-Location and Location
values are equals, it means that the returned entity (identified by
the URL in the Content-Location header) is the one that has been
created (identified by the URL in the Location header).
Conclusion: as we've demonstrated above that there's no reason to
force an Atom Entry Document entity in the response to be a
representation of the one that has been created, '''there's no need to
define a constraint such as "if the response body is an Atom Entry
Document, it SHOULD come with a Content-Location header".'''

To makes things simple for client implementations, without adding any
burden in the client-side, '''let's just a very small constraint: if
servers want clients to consider Location and Content-Location equals,
they should send the exact same value, character-by-character.'''


== Proposal ==

In section 8.1 of draft-atom-protocol-09, replace the paragraph that reads:
{{{
 When the server generates a response with a status code of 201 ("Created"),
 it SHOULD also return a response body, which, if provided, MUST be an Atom
 Entry Document representing the newly-created resource. Clients MUST NOT
 assume that an Atom Entry returned is a full representation of the member
 resource.
}}}
with the following:
{{{
 As clients are likely to issue a GET to the URI given in the Location header
 of 201 ("Created") responses, to retrieve at least some basic information
 such the entry's atom:id, a server might want to return the entry in the
 body of the response. Per [HTTP/1.1], to unambiguously tell the client that
 the response body is a representation of the resource identified by the
 URI in the Location header, the server has to include a Content-Location
 header with the same value. To remove any ambiguity with respect to URI
 normalization and comparison, this specification allows clients to
 OPTIONALLY compare Location and Content-Location values character by
 character. Even in the presence of such a Content-Location header (with the
 same value as the Location response header), clients MUST NOT assume that
 the response body is an Atom Entry Document, as content negotiation might
 have been used. If the response body is an Atom Entry Document, clients
 MUST NOT assume that it is a full representation of the member resource or
 the exact same representation that could be retrieved at the URI given in
 the Location header.
}}}
and remove the paragraph that reads:
{{{
 When the POST request contains an Atom Entry Document, the response from
 the server SHOULD contain a Content-Location header that contains the same
 character-by-character value as the Location header.
}}}

== Impacts ==

By adding less constraints and be closer to HTTP "basics", the
protocol becomes more extensible and accounts for both evolutions of
both the protocol and HTTP.

== Notes ==


--
Thomas Broyer

Reply via email to