Опитвам се да изпратя JSON тяло на отговор, когато моят API обслужва 4xx http код на отговор. Всичко работи добре, когато кодът е 200, но променен на 4xx, не се получава тяло. Пощальонът за Chrome показва реакцията на тялото, но XHR (Chrome, FF) не.
Въобще възможно ли е да получите тялото на отговора вътре в XHR с nginx CORS правилно настроен (настроих го просто да ехо ...Allow-Origin: $http_origin)? Имам nginx като proxy_pass към действителния API сървър на 127.0.0.1:9001. Когато изпратя известни идентификационни данни, CORS и Allow-Origin работят добре с 200 OK. Ако просто използвам лоша парола, виждам кода на състоянието на грешката във Firebug, но XHR обектът (също $.ajax на jQuery) има Статус = 0, въпреки че заявка удря API сървъра.
Като минимум бих искал да мога да взема кода на състоянието 4xx в XHR обекта, за да мога поне да покажа обща информация за определени кодове 4xx вместо общото „не работи“. Това също не е налично и винаги получавам status=0, въпреки че API е засегнат и правилният код на отговор е регистриран в nginx.
Актуализация 3/23 Javascript XHR код:
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://arinna-api/v1/401', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
// do something to response
console.log(this);
};
Възпроизвеждане на рамков код за връщане на състояние 200 OK JSON тип съдържание на отговора:
SimpleResult(
header = ResponseHeader(200, Map(CONTENT_TYPE -> "application/json")),
body = Enumerator("{\"error\":\"invalid grant\"}".getBytes())
)
200 OK работи според очакванията:
Промяната на HTTP кода на 401 кара тялото на отговора да не бъде получено от XMLHttpRequest (xhr.status също е 0 вместо 401):
SimpleResult(
header = ResponseHeader(401, Map(CONTENT_TYPE -> "application/json")),
body = Enumerator("{\"error\":\"invalid grant\"}".getBytes())
)
xhr.send('username=username&password=badpassword&grant_type=password&client_id=mobile_platform');
Пощальон работи според очакванията:
Възможно ли е да получите тяло на отговор 4xx и код на състоянието чрез XHR? Според W3C дефиниции на код за състояние на HTTP 4xx:
Освен когато отговаря на заявка HEAD, сървърът ТРЯБВА да включва обект, съдържащ обяснение на ситуацията с грешка и дали тя е временно или постоянно състояние. Тези кодове на състояние са приложими за всеки метод на заявка. Потребителските агенти ТРЯБВА да показват всеки включен обект на потребителя.
Въпреки това, според тази дискусия:
2) Браузърите не показват тялото на отговора text/html на HTTP 401 отговор, вместо това те просто изскачат диалогов прозорец за модално удостоверяване (докато се натисне „отказ“).
3) Сървърите не изпращат смислено тяло на отговор със статус 401, тъй като браузърите така или иначе не го показват.