Scenario:
A POST
request is sent to process an order that will result in data retrieval from an external datasource.
There are three possible results:
- The datasource returned data for the request
- No data was available for the request (this is viewed as an error)
- The datasource couldn't be accessed (may be down for maintenance)
An obvious response for 1 is 200: OK
or 201: Created
(an entity is created from this request).
What status codes would be appropriate for 2 and 3?
Status codes I have considered:
503: Service Unavailable
when datasource is down500: Internal Server Error
when datasource is down502: Bad Gateway
when "no data available"404: Not Found
when "no data available"403: Forbidden
when "no data available"412: Precondition Failed
when "no data available"
3) I agree with 503 for this
2) Frankly I think a good argument could be made for using 204 in case 2 You can include metainfo in the header to indicate specifically what 'went wrong'. It really depends on how much you consider this case to be 'an error' at the API level.
If the API itself is functioning as intended, and the request was to a valid endpoint, by an authenticated and authorized user and did not cause the server to malfunction, then very few of the 400 or 500 series errors would really seem to apply.
for example, 404 usually means the URI you called does not exist, if it does exist, then using that code is misleading at least IMHO
2) Looking back at this, I agree it should probably be either a 204 No Content or maybe a 200 with a body indicating no records or resources could be found depending on the structure returned. 404's are generally used when the resource URI doesn't exist or a resource in the URI is not found in the case of a restful service.
3) 503 Service Unavailable
The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay. If known, the length of the delay MAY be indicated in a Retry-After header. If no Retry-After is given, the client SHOULD handle the response as it would for a 500 response.
HTTP 404 - With your own error message like "No data found".
Twitter uses 404. Reference: https://developer.twitter.com/en/docs/basics/response-codes.html