What is the proper REST response code for a valid request but empty data?
api-design, http, rest
Solution
TL;DR: Use `404`
See This Blog. It explains it very well.
Summary of the blog's comments on `204`:
- `204 No Content` is not terribly useful as a response code for a browser (although according to the HTTP spec browsers do need to understand it as a 'don't change the view' response code).
- `204 No Content` is however, very useful for ajax web services which may want to indicate success without having to return something. (Especially in cases like `DELETE` or `POST`s that don't require feedback).
The answer, therefore, to your question is use `404` in your case. `204` is a specialized reponse code that you shouldn't often return to a browser in response to a `GET`.
The other response codes are even less appropriate than `204` and `404`:
- `200` should be returned with the body of whatever you successfully fetched. Not appropriate when the entity you're fetching doesn't exist.
- `202` is used when the server has begun work on an object but the object isn't fully ready yet. Certainly not the case here. You haven't begun, nor will you begin, construction of user 9 in response to a `GET` request. That breaks all sorts of rules.
- `400` is used in response to a poorly formatted HTTP request (for instance malformed http headers, incorrectly ordered segments, etc). This will almost certainly be handled by whatever framework you're using. You shouldn't have to deal with this unless you're writing your own server from scratch. Edit: Newer RFCs now allow for 400 to be used for semantically invalid requests.
Wikipedia's description of the HTTP status codes are particularly helpful. You can also see the definitions in the HTTP/1.1 RFC2616 document at www.w3.org
Problem
For example you run a GET request for `users/9` but there is no user with id #9. Which is the best response code? - 200 OK - 202 Accepted - 204 No Content - 400 Bad Request - 404 Not Found