Передача ответов об ошибках JSON через HTTPD
Команда, с которой я работаю, создает интерфейс API для своего приложения, чтобы предоставить данные веб-сайту, который в этом нуждается. Они отправляют запросы и ответы в формате JSON, но в настоящее время заблокированы по следующей проблеме.
Они написали свой API для ответа на запрос, в котором отсутствуют необходимые данные, с кодом ошибки 422:
422 Unprocessable Entity (WebDAV; RFC 4918) - Запрос был правильно сформирован, но не мог быть выполнен из-за семантических ошибок.
Запрос обрабатывается, и с сервера приложений возвращается действительный объект ответа JSON, но HTTPD-сервер в настоящее время перехватывает ответ и помещает общий ErrorDocument для ошибки 422.
Хотел посмотреть есть ли способ:
- Отключите перехват ErrorDocument и просто прозрачно верните JSON-ответ от сервера приложений через сервер Apache
Используйте обработчик ErrorDocument, но вставьте тело ответа в возвращаемое сообщение - т.е.
ErrorDocument 422 $ {RESPONSE_BODY}
Любые другие предложения будут приветствоваться. Наше временное решение - просто вернуть ответ 200 и определить код ошибки в ответе, но по возможности использовать коды ошибок HTTP.
1 ответ
Не зная структуры URL вашего API, я бы предложил нечто похожее на то, что я использую в JSON API, который я создал, который использует PHP для фреймворка. Поместите это в .htaccess
файл в корневом каталоге вашего сервера или веб-приложения.
ErrorDocument 422 /error/422
Что это делает, это отправить любой 422
ошибка в пути URL /error/422
, Это при условии, что у вас есть настройки вашего сервера следующим образом:
http://api.mygreatserver.net/error/422
У меня тоже есть правило в моем .htaccess
какие маршруты трафика так:
RewriteRule ^([a-z_-]+)/([0-9]+)/?$ index.php?controller=$1&id=$2 [QSA]
Так что в основном /error/422
превращается в index.php?controller=error&id=422
за кулисами. Сценарий PHP направляется к error
а потом error
действует на 422
… И вуаля!
И если каким-то образом сам API расположен как путь к домену, вот так:
http://www.mygreatserver.net/api/error/422
Тогда это может быть что-то вроде этого:
ErrorDocument 422 /api/error/422
Общая цель - отправить 422
на заранее определенный путь в вашем контроле. И затем внутри этого контроллера вы отправляете любой пользовательский контент, который пожелаете.