$.ajax (…) ОТПРАВЛЯЕТ на веб-сервис Джерси, не удается вернуть сведения об ошибке HTTP (код состояния и т.д.)

#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")
    }); 
});
  

jsfiddle http://jsfiddle.net/guest271314/yC6Uu /

Комментарии:

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