$ .ajax(...)POST到Jersey Web Service,无法获取HTTP错误详细信息(状态代码等)

时间:2014-07-04 09:44:03

标签: jquery ajax post http-status-code-404

这是我的设置:

Java REST Web服务(使用Jersey实现)。我使用JQuery来实现HTTP GET和POST。

我的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 GET:

$.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

此外,如果我查看Chrome的网络检查程序标签,我可以看到执行的(不成功的)HTTP GET。

如果我对无效网址进行HTTP POST:

$.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 OPTIONS,这很奇怪。我注意到即使使用有效的JQuery ajax HTTP POST,Chrome的控制台也会报告首先是HTTP OPTIONS,然后然后 HTTP POST。。这种行为是正常的,因为我使用了cross-site requests

但是,我的主要问题是,现在,上述错误处理代码的输出几乎没有提供错误的详细信息:

=== error function ===
jqXHR.status=0
jqXHR.responseText=
textStatus=error
errorThrown=
=== ajaxError function ===
settings.url=http://validServer/invalidAddress
jqXHR.status=0
jqXHR.responseText=
exception= 

我的问题是:

如何从JQuery的Ajax POST获取错误的详细信息(HTTP状态代码,消息等),就像我在进行Ajax GET时一样?

更新

我应该提一下,当我进行Ajax POST时立即传递错误函数的选项有同样的问题。如果我这样做:

$.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状态代码,没有服务器错误消息等。

4 个答案:

答案 0 :(得分:1)

  

我的问题是:        我如何从JQuery的Ajax POST获取错误的详细信息(HTTP状态代码,消息等),就像我在进行Ajax GET时一样?

尝试此模式(使用$.getJSON()$.post()beforeSendstatusCodejqxhr对象)

$(function () {
    var urls = ["/echo/jsons/", "/echo/json/"];

    var callback = function (j, s, e, name) {
        if (j.status === (403 || 404) && s === "error") {
      console.log(j.state()
                  , name
                  , j.status
                  , s
                  , e
                  , "\n\n");
      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" && 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
                    , "\n\n");
        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 :(得分:0)

只需在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 documentation了解更多详情。

答案 2 :(得分:0)

在您的java动作/脚本上将此添加到响应中:

response.addHeader("Access-Control-Allow-Origin", "*");

这将允许您从其他域发布。基本上是因为你是从另一个域发布的,服务器端会阻止你甚至抛出错误。

答案 3 :(得分:0)

您应该使用jsonp请求代替json请求。并允许crossDomain为真