#jquery #ajax #post #http-status-code-404
#jquery #ajax #Публикация #http-status-code-404
Вопрос:
Вот моя настройка:
Веб-сервис Java REST (реализован с помощью Джерси). Я использую jQuery для получения HTTP-данных и отправки сообщений в этом направлении.
Моя конфигурация jQuery AJAX выглядит следующим образом:
$.ajaxSetup ({
cache: false,
error: function(jqXHR, textStatus, errorThrown) {
console.log("=== error function ===");
console.log("jqXHR.status=" jqXHR.status);
console.log("jqXHR.responseText=" jqXHR.responseText);
console.log("textStatus=" textStatus);
console.log("errorThrown=" errorThrown);
}
});
$(document).ajaxError(function(event, jqXHR, settings, exception ) {
console.log("=== ajaxError function ===");
console.log("settings.url=" settings.url);
console.log("jqXHR.status=" jqXHR.status);
console.log("jqXHR.responseText=" jqXHR.responseText);
console.log("exception=" exception);
});
Если я выполняю HTTP, получаю неверный URL:
$.getJSON("http://validServer/invalidAddress",
requestJSON,
function(responseJSON) {
//...
});
Я получаю приятные сведения об ошибке как из конфигураций «error», так и «ajaxError»:
=== error function ===
jqXHR.status=404
jqXHR.responseText=[web server 404 message]
textStatus=error
errorThrown=Not Found
=== ajaxError function ===
settings.url=http://validServer/invalidAddress
jqXHR.status=404
jqXHR.responseText=[web server 404 message]
exception=Not Found
Кроме того, если я посмотрю на вкладку Network inspector в Chrome, я увижу, что был выполнен (неудачный) HTTP GET.
Если я отправляю HTTP-сообщение на недопустимый URL:
$.ajax({
url: "http://validServer/invalidAddress",
type: "POST",
data: JSON.stringify(requestJSON),
dataType: "text",
headers: {
"content-type": "application/json",
"Accept": "application/json"
},
success: function(responseJSON){
//...
}
});
Во-первых, довольно странно, что когда я смотрю в консоль Chrome, я вижу, что на самом деле были выполнены (неудачные) HTTP-НАСТРОЙКИ. Я заметил, что даже при действительных сообщениях jQuery ajax HTTP консоль Chrome сообщает, что сначала были созданы HTTP OPTIONS, а затем HTTP POST.. Такое поведение является нормальным, поскольку я подписываю межсайтовые запросы.
Однако моя главная проблема заключается в том, что теперь вывод вышеупомянутого кода обработки ошибок почти не содержит подробностей об ошибке:
=== error function ===
jqXHR.status=0
jqXHR.responseText=
textStatus=error
errorThrown=
=== ajaxError function ===
settings.url=http://validServer/invalidAddress
jqXHR.status=0
jqXHR.responseText=
exception=
Мой вопрос:
Как мне получить из сообщения Ajax jQuery сведения об ошибке (код состояния HTTP, сообщение и т.д.), Как я делаю, когда выполняю Ajax GET?
Обновить
Я должен упомянуть, что возможность передачи функции ошибки немедленно, когда я создаю сообщение Ajax, имеет ту же проблему. Если я сделаю это следующим образом:
$.ajax({
url: "http://validServer/invalidAddress",
type: "POST",
data: JSON.stringify(requestJSON),
dataType: "text",
headers: {
"content-type": "application/json",
"Accept": "application/json"
},
success: function(responseJSON){
//...
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR.status);
console.log(textStatus);
console.log(errorThrown);
}
});
Вывод на консоль для приведенного выше кода такой же, как в моем первом примере, нет кода состояния HTTP, нет сообщения об ошибке сервера и т.д.
Ответ №1:
Мой вопрос таков: Как мне получить из Ajax POST jQuery сведения об ошибке (код статуса HTTP, сообщение и т.д.), Как я делаю, когда выполняю Ajax GET?
Попробуйте этот шаблон (с использованием $.getJSON()
, $.post()
, beforeSend
, statusCode
, jqxhr
объекта)
$(function () {
var urls = ["/echo/jsons/", "/echo/json/"];
var callback = function (j, s, e, name) {
if (j.status === (403 || 404) amp;amp; s === "error") {
console.log(j.state()
, name
, j.status
, s
, e
, "nn");
alert(j._url
"n" j.status
"n"
s
"n"
JSON.stringify(j, s, e));
request(false, urls[1]);
};
};
$.ajaxSetup({
beforeSend: function(jqxhr, settings) {
jqxhr._url = settings.url;
settings.headers = {
"Content-Type": "application/json",
"Accept": "application/json"
};
jqxhr._headers = settings.headers;
},
statusCode : {
// `success` callback
200 : function(data, textStatus, jqxhr) {
alert(jqxhr._url
"n" jqxhr.status
"n" textStatus
"n" data.abc);
},
// `error` callback
403 : function(jqxhr, textStatus, errorThrown) {
callback(jqxhr, textStatus, errorThrown, String(jqxhr.status ' "callback"'));
},
404 : function(jqxhr, textStatus, errorThrown) {
callback(jqxhr, textStatus, errorThrown, String(jqxhr.status ' "callback"'));
}
}
});
var request =
function(_getJSON, url) {
var _request = (_getJSON === true ? $.getJSON(url) : $.post(url, {
json: JSON.stringify({"abc":123})
}, "text")
);
_request.then(
// `success` callback
function (data, textStatus, jqxhr) {
if (textStatus === "success" amp;amp; jqxhr.responseJSON) {
console.log(jqxhr.state()
, jqxhr._url
, jqxhr.status
, textStatus
, jqxhr._headers
, JSON.parse(JSON.stringify(data))
, data.abc
, jqxhr
, "n");
};
}
// `error` callback
, function (jqxhr, textStatus, errorThrown) {
console.log(jqxhr.state()
, jqxhr._url
, jqxhr.status
, textStatus
, errorThrown
, jqxhr._headers
, jqxhr
, "nn");
return jqxhr.promise().state();
});
return _request.promise().state()
};
$.when(request(true, urls[0]), request(false, urls[0]))
.always(function(a, b) {
console.log(a, b, "n")
});
});
Комментарии:
1. Спасибо за усилия. Это не решило мою проблему полностью, но вывело меня на правильный путь.
Ответ №2:
Просто добавьте обратный вызов ошибки в ajax-запрос и обработайте ответ
$.ajax({
url: "http://validServer/invalidAddress",
type: "POST",
data: JSON.stringify(requestJSON),
dataType: "text",
headers: {
"content-type": "application/json",
"Accept": "application/json"
},
success: function(responseJSON){
//...
},
error: function(reserr){
console.log(reserr);
}
});
reserr
поставляется в формате JSON, там вы можете получить вывод кода ошибки http reserr.status
на консоль.
Вы можете обратиться к документации jQuery Ajax API для получения более подробной информации.
Ответ №3:
В вашем Java-действии / скрипте добавьте это в ответ:
response.addHeader("Access-Control-Allow-Origin", "*");
Это позволит вам отправлять сообщения с другого домена. В основном, потому что вы отправляете сообщение из другого домена, серверная сторона блокирует вас, даже не выдав ошибку.
Комментарии:
1. Спасибо, но я уже это сделал. Я действительно думаю, что проблема на уровне jQuery, а не на уровне сервера или HTTP: если я проверяю HTTP-трафик (например, через сетевую консоль Chrome), я вижу, что при отправке сообщения на недопустимый URL из jQuery сначала создаются параметры HTTP, сервер возвращает HTTP статус 404 и сообщение об ошибке в HTTP ответе, но затем я не могу «добраться» до них в jQuery (например, через сетевую консоль Chrome). Объект jqXHR имеет пустой HTTP-статус, объект error содержит только строку «error» и т.д.).
2. Если первый запрос является
OPTIONS
запросом, вы имеете дело сCORS
.OPTIONS
Запрос вызываетсяpreflight request
. Проверьте вкладку «Сеть» и убедитесь, что вы используете допустимую конечную точку. Если вы получите 404, это никогда не сработает, потому что конечная точка не найдена. Скопируйте ссылку со вкладки сеть в свою адресную строку и проверьте результат.
Ответ №4:
Вы должны сделать запрос jsonp вместо запроса json. и разрешить междоменный true