我有一个简单的Web应用程序。
我已经创建了服务器REST API,因此它将返回带有HTTP代码和JSON(或XML)对象的响应,其中包含更多详细信息:应用程序代码(特定于场景,描述发生了什么情况的消息等)。
因此,例如,如果客户端发送注册请求并且密码太短,则响应HTTP代码将为400(错误请求),而响应数据将为:{appCode : 1020 , message :"Password is too short"}。
在jQuery中,我使用" ajax"函数创建POST请求。当服务器返回的内容不同于HTTP代码200(确定)时,jQuery将其定义为"错误"。
错误处理程序可以获取3个参数:jqXHR,textStatus,errorThrown。
我如何获取服务器在错误情况下发送的JSON对象?
编辑:
1)这是我的JS代码:
function register (userName, password) {
var postData = {};
postData["userName"] = userName;
postData["password"] = password;
$.ajax ({
dataType:"json",
type:"POST",
url:"/rest/register",
data: postData,
success: function(data) {
showResultSucceed(data);
hideWaitingDone();
},
error: function (jqXHR, textStatus, errorThrown) {
showResultFailed(jqXHR.responseText);
hideWaitingFail();
}
})
}
2)在查看Firebug控制台时,响应似乎为空。
当使用REST测试工具调用相同的请求时,我得到一个带有JSON对象的响应。
我究竟做错了什么?
如果您没有将其降低到可接受的答案之内; 该代码没有错,问题出在其他地方。
对于其他未来的读者,我也遇到了类似的问题,尽管跨域问题与我的情况完全无关,但事实证明,问题出在服务器端。 (似乎服务器代码已被破坏,以至于HTTP标头(如Accept)的某种组合使其无法在出现400错误时返回正确的响应主体。)
这是有关如何获取错误JSON数据的示例:
$.ajax({
url: '/path/to/script.php',
data: {'my':'data'},
type: 'POST'
}).fail(function($xhr) {
var data = $xhr.responseJSON;
console.log(data);
});
从文档:
If json is specified, the response is parsed using jQuery.parseJSON before being passed, as an object, to the success handler. The parsed JSON object is made available through the responseJSON property of the jqXHR object.
否则,如果responseJSON不可用,则可以尝试$.parseJSON($xhr.responseText)。
" $ .parseJSON($ xhr.responseText)"是关键! 如果不是使用" .fail",则使用错误:function(xmlHTTP,status,httperror){$ .parseJSON(xmlHTTP.responseText);}
直接从文档
The jQuery XMLHttpRequest (jqXHR) object returned by $.ajax() as of
jQuery 1.5 is a superset of the browser's native XMLHttpRequest
object. For example, it contains responseText and responseXML
properties, as well as a getResponseHeader()
因此,请使用jqXRH参数并将其responseText属性关闭。
在上面的链接中,找到标题为
jqXHR对象
我读了 responseText为空
@gdoron添加了链接和部分以查找
@tibo,然后向我们显示您的代码。 出事了。 最好是使用firebug或webkit暂停处理程序中的执行,而只需查看参数的属性即可。 它必须在某个地方...
我刚刚将代码添加到问题中。 你能帮我吗?
没有真正深入,我不确定这一点。 您确定响应主体在Firebug中为空吗? 您确定网址正确吗? 您确定正在调用错误处理程序吗?
这应该是公认的答案-问题中的代码正确。 问题完全超出了所提供信息的范围。
当我使用multipart / form-data时,我也面临同样的问题。起初我以为multipart / form-data会造成混乱,但后来我找到了正确的解决方案。
1)之前的JS代码:
var jersey_url ="http://localhost:8098/final/rest/addItem/upload";
var ans = $.ajax({
type: 'POST',
enctype: 'multipart/form-data',
url: jersey_url,
data: formData,
dataType:"json",
processData: false,
contentType: false
success : funtion(data){
var temp = JSON.parse(data);
console.log("SUCCESS :", temp.message);
}
error : funtion($xhr,textStatus,errorThrown){
console.log("ERROR :", errorThrown);
console.log("ERROR :", $xhr);
console.log("ERROR :", textStatus);
}
});
在这里,当发生错误时,它在控制台中向我显示了这一点:
错误:
错误:{中止:f(e),始终:f(),....,responseJSON:" {"消息":"失败"}"}}
错误:错误
因此,我知道我们必须使用$ xhr.responseJSON来获取我们从rest api发送的字符串消息。
2)修改/工作错误功能:
error : funtion($xhr,textStatus,errorThrown){
var string= $xhr.responseJSON;
var json_object= JSON.parse(string);
console.log("ERROR :", json_object.message);
}
因此将在控制台上输出"错误:失败"。
在解决这个问题上花了很多时间后,我发现了问题。
该页面位于URL下:www.mydomain.com/register
REST api在URL下:server.mydomain.com/rest
似乎这种POST并不是那么简单。
我将搜索更多信息以更好地理解此问题(如果您有更多信息,请与我分享)。
将REST API放在www.mydomain.com/rest下时-一切正常。
您可以接受其他答案之一。