Correct HTTP status code for existent resource, bu

2019-04-19 16:05发布

问题:

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?

回答1:

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.



回答2:

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.



回答3:

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.