So instead of
GET /api/v1/employee/100
Accept: application/json
You sent GetEmployee /1000
X-API-VERSION: 1
Accept: application/json
Then if the actual procedure name was "get_employees", the correct response to this request would be 501, and /1000 referring to a non-existent employee would be a 404.If making an RPC and restricting yourself to the known HTTP methods, the closest is
GET /api/v1/employee?id=100
Accept: application/json
which would return 404 only if the controller endpoint didn't exist, and would return whatever the application wanted if userid=100 didn't exist, such as 422 or 200 with a response indicating non-existence. It would be just like a local procedure call that could return a false value, or throw an exception instead of returning a value.Sure, you might want information in addition to that provided by the status code. And, again, rather than reinventing the wheel with some ad hoc mechanism, you can follow the HTTP spec for a solution: almost all HTTP status codes support a response body to communicate additional detail.
> Instead, I'd change the default from 404 to 501.
5xx errors indicate server problems, not request problems. If you wanted a different status code for “that path isn't structured in a way I understand” vs “I understand how I would look up something with that path but can't find it“, 400 or 421 for the former would be better than anything that is not a 4xx since they each (1) are in the correct class and reports a client error, and (2) have a definition which arguably fits the scenario, even if 404 arguably fits better.
The main "issue" is that 404 is the normalized response for web servers when an endpoint doesn't exist. So it feels like one is breaking the established paradigm by using something else, but I think it's absolutely worth doing.
Certainly a bigger fan of defaulting to returning a 409 than making my API consumers parse all my response bodies.
If you hit an endpoint and get a 404... did you do it wrong? Is my documentation outdated?
Even better: What recourse do you have? how do you figure out the answer?
Your only recourse is to email me. Send me cURL commands and screenshots and sit on your thumbs until I write back.
IMHO the REST folk were blinded by the existing 404 normalcy set up by web servers.
...
personally I think OP's idea isn't great. I think returning 200 and making me parse the response and hoping it's consistent between services is too much work compared to the simplicity of the HTTP response.
Instead, I'd change the default from 404 to 501.