Код состояния HTTP для внешней зависимости

Каков правильный код состояния HTTP для возврата, когда сервер сталкивается с проблемами, связанными с внешним API?

Скажите, что клиент отправляет действительный запрос на мой сервер A, A затем запрашивает API сервера B, чтобы что-то сделать. Однако B API в настоящее время бросает 500 или как-то недостижимо, какой код состояния должен возвращать клиенту? Ошибка 5 * не кажется правильной, потому что сервер A работает так, как должен, и ошибка 4 * не кажется правильной, потому что клиент отправляет действительный запрос в A.

Ответ 1

Поскольку API полагается на то, что недоступно, его служба также недоступна.

Я бы подумал, что код состояния 503: Service Unavailable наилучшим образом подходит для вашей ситуации. Из описания RFC:

В настоящее время сервер не может обработать запрос из-за временной перегрузки или обслуживания сервера. Подразумевается, что это временное условие, которое будет смягчено после некоторой задержки. Если известно, длина задержки МОЖЕТ указываться в заголовке Retry-After. Если параметр Retry-After не задан, клиент ДОЛЖЕН обрабатывать ответ, как это было бы для ответа 500.

Конечно, описание подразумевает, что этот код состояния должен применяться для ошибок на самом сервере (и не сигнализировать о проблеме с внешней зависимостью). Однако это лучше всего подходит для кодов статуса RFC, и я бы не предложил использовать какие-либо пользовательские коды состояния, чтобы каждый мог их понять.

В качестве альтернативы, если ваш API поддерживает способ передачи ошибок (например, чтобы сообщить пользователю, что идентификатор, который он поставил неверно), вы можете использовать этот метод, чтобы сообщить пользователю, что зависимость недоступна. Это может быть немного более дружелюбным и может избежать некоторых ошибок поиска на стороне пользователя, так как по крайней мере некоторые из пользователей не будут знакомы с кодами статуса, кроме 403, 404 и, возможно, 500, в зависимости от вашей аудитории.

Ответ 2

Вы рассматривали коды состояния 502 и 504?

502 – The server while acting as a gateway or a proxy, 
received an invalid response from the upstream server it accessed
in attempting to fulfill the request.

504 – The server, while acting as a gateway or proxy, 
did not receive a timely response from the upstream server 
specified by the URI (e.g. HTTP, FTP, LDAP) 
or some other auxiliary server (e.g. DNS) it needed to access 
in attempting to complete the request.

Конечно, для этого потребуется широкая интерпретация "шлюза" (реализация интерфейса A, требующая вызова интерфейса B), применяемого к прикладному уровню. Но это может быть хорошим способом сказать: "Я не могу ответить, но это не моя вина или ваша".