Say the client is requesting the following URL:
/user-details?user=123
If /user-details
was a non-existing resource, the correct status code would obviously be 404
.
However if /user-details
does exist, but no user with id 123
exists:
- I've so far returned a
404 Not Found
, but experience has told me that it makes it confusing to not know whether it is the resource, or the entity that was not found;
- I've considered using
400 Bad Request
, but I find it confusing as well, as the request is technically correct, just requesting a non-existing entity.
Is there a more suitable HTTP status code for this purpose?
The 404 is fine because the user-details resource is a conceptual mapping to the user entity in this case to a partial user resource information.
The GET method for user-details is therefore not responsible for differentiating from the two cases: a) The user doesn't exist, b) The user details don't exist.
I would however rewrite the endpoint to something like this:
/user/123/details
Which in my opinion is more expressive.
Try 422 which is used in WebDav? See http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
For me 404 status is ok too (better normed actually), 400 is too vague.
The user
parameter is part of the resource identifier as stated in RFC 3986, section 3.4:
The query component contains non-hierarchical data that, along with
data in the path component (Section 3.3), serves to identify a
resource within the scope of the URI's scheme and naming authority
Hence, 404/Not found
is perfectly fine.