Не получается http кодов ошибок от остальных звонков
Мне нужно иметь возможность различать код ошибки диапазона 400 и 500 для разных потоков в нашем приложении.
Допустим, у меня есть 3 звонка отдыха,
- Сначала вернется 200,
- второй вернет 401,
- а третий вернется 502
Я начал использовать aurelia-http-client
, где я впервые заметил, что я получаю ошибку http code = 0
в обещании отклонить ответный звонок.
Обновление: Использование aurelia-fetch-client
возвращает только строку в качестве ответа об ошибке, поэтому также не является опцией.
Затем я попытался с помощью ajax call
и основнойXMLHttpRequest
, который дал тот же результат. Для диапазона 200 я получил коды, но все выше, я получил statusCode 0.
Обновление: я использую Chrome версии 63.0.3239.132, если это имеет значение.
Что я пробовал:
Я пробовал около 5 разных вариантов для выборки.
fetch(url, { method: requestMessage.method, headers, body: JSON.stringify(content) }) .then((result) => { resolve(result) }) .catch((error) => { reject(error); });
Выводит строковую ошибку
С помощью aurelia-http-client
this.httpClient.createRequest(url)
.asPut()
.withContent(params)
.send()
.then((response) => {
resolve(response);
},
(error) => {
reject(error);
});
- StatusCode всегда 0 для ошибок
Также (это просто создает динамический запрос XmlHttpRequest):
private retryRequest(): void {
var xhr = this.setupXhr();
xhr.onreadystatechange = () => this.stateChange(xhr);
setTimeout(() => {
xhr.send(JSON.stringify(this.content));
}, 1000);
}
private setupXhr(): XMLHttpRequest {
var xhr = new XMLHttpRequest();
xhr.open(this.method, this.url, true);
xhr = this.addHeaders(xhr);
return xhr;
}
private addHeaders(xhr: XMLHttpRequest): XMLHttpRequest {
for (let key in this.headers) {
if (this.headers.hasOwnProperty(key)) {
xhr.setRequestHeader(this.headers[key].key, this.headers[key].value);
}
}
return xhr;
}
private stateChange(xhr: XMLHttpRequest): void {
logger.debug(' ::>> xhr = ', xhr);
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 400) {
this.resolve(JSON.parse(xhr.response));
} else if (xhr.status >= 500) {
this.retryRequest();
} else {
// this.retryRequest();
this.reject(xhr.response); // call after a # of fails for this ???
}
}
}
- Который только возвращает 200 кодов состояния http диапазона
Также:
$.ajax({
type: requestMessage.method,
url,
data: JSON.stringify(content),
headers,
success: (data) => {
logger.debug(' ::>> rest call was a success ', data);
resolve(data);
},
statusCode: {
502: (jqXHR) => {
logger.debug(' ::>> received 502 ');
var retryAfter = jqXHR.getResponseHeader('Retry-After');
retryAfter = parseInt(retryAfter, 10);
if (!retryAfter) { retryAfter = 5 };
setTimeout(query, retryAfter * 1000);
}
}
});
- Который никогда не добирается до 502 обратного вызова. Я пробовал и другие коды состояния
Есть ли способ получить коды ошибок, которые я мог бы пропустить? Любая помощь приветствуется
2 ответа
Я изначально думал Harshal Bulsara
Это было то, что решило мою проблему. Это хорошая реализация, но я нашел актуальную проблему.
Я обнаружил, что наш ответ nginx не отправил требуемые заголовки. Добавляя Access-Control-Allow-Origin
заголовок, я получил statusCode.
У меня было похожее требование, и я реализовал это, используя следующий код
$.ajax({
type: "POST",
url: urlAjax,
dataType: 'json',
headers: headerValue,
data: _dataValue,
crossDomain: true,
beforeSend: function () {
//any operation
},
complete: function () {
// any after operation
},
success: function (data) {
// All 2XX will reach here
},
error: function (jqXHR, textStatus, error) {
var Check = JSON.parse(jqXHR['responseText']);
// In above array you will get whole error response
}
}).done(function (rs, textStatus, xhr) {
// on finished
});
В jqXHR
, textstatus
а также errror
params вы получите всю информацию об ошибках и кодах, связанных с ней.
Надеюсь, это поможет.