这是我的设置:
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状态代码,没有服务器错误消息等。
答案 0 :(得分:1)
我的问题是: 我如何从JQuery的Ajax POST获取错误的详细信息(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) && 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")
});
});
答案 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为真