The HTTP specification (RFC 2616) has a number of recommendations that are applicable. Here is my interpretation:
- HTTP status code
200 OK
for a successful PUT of an update to an
existing resource. No response body needed. (Per Section 9.6,204 No Content
is even more appropriate.) - HTTP status code
201 Created
for a successful PUT of a new
resource, with the most specific URI for the new resource returned in the Location header field and any other relevant URIs and metadata of the resource echoed in the response body. (RFC 2616 Section 10.2.2) - HTTP status code
409 Conflict
for a PUT that is unsuccessful due
to a 3rd-party modification, with a list of differences
between the attempted update and the current resource in the response
body. (RFC 2616 Section 10.4.10) - HTTP status code
400 Bad Request
for an unsuccessful
PUT, with natural-language text (such as English) in the response body
that explains why the PUT failed. (RFC 2616 Section 10.4)