我有以下代码调用API,并缓存结果(因此可以多次使用):
var requestCache = {};
function LoadDataFromApi(apiUrl) {
if (!requestCache[apiUrl]) {
requestCache[apiUrl] = $.ajax({
type: 'GET',
url: apiUrl,
dataType: "json"
});
}
return requestCache[apiUrl];
}
有时,API会引发异常,我正在尝试捕获并显示该异常。根据Firefox调试器的说法,当发生异常时,响应数据如下所示:
{
"Message":"An error has occurred.",
"ExceptionMessage":"Invalid object name 'Foo_Bar'.",
"ExceptionType":"System.Data.SqlClient.SqlException",
}
从JQuery documentation中,我看到statusCode
中有一个$.ajax
对象,但是我无法成功实现它。 answer here已关闭,但实际上未检索到异常消息。
从今天的各种搜索来看,我已经走了很远,但是JSON无法解析,而且我不知道问题出在哪里,因为在其他地方使用JSON可以解析
function LoadDataFromApi(apiUrl) {
if (!requestCache[apiUrl]) {
requestCache[apiUrl] = $.ajax({
type: 'GET',
url: apiUrl,
dataType: "json",
statusCode: {
500: function (json) {
var j = JSON.parse(json);
alert(j.Message);
}
}
});
}
return requestCache[apiUrl];
}
如果有人能在我的代码中发现问题,我将不胜感激?
答案 0 :(得分:0)
我们可以过去吗
public class theException
{
public string Message { get; set; }
public string ExceptionMessage { get; set; }
public string ExceptionType { get; set; }
}
public class EvilDrController : ApiController
{
public theException GetContrivedException()
{
var exception = new theException
{
ExceptionMessage = "Invalid object name 'Foo_Bar'.",
ExceptionType = "System.Data.SqlClient.SqlException",
Message = "An error has occured"
};
return exception;
}
}
html文件或cshtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>EvilDr</title>
</head>
<body>
<div>
<h2>Parse JSON</h2>
</div>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
//or whatever uri you want
var uri = 'api/evildr';
$(document).ready(function () {
// Send an AJAX request
$.getJSON(uri)
.done(function (data) {
var j = JSON.stringify(data)
alert(j)
});
});
</script>
</body>
</html>
答案 1 :(得分:0)
经过{@ 3}}的反复搜索,终于找到了答案。
问题出在这里
500: function (json) {
事实证明,尽管API返回JSON数据,但JQuery将此数据包装在this answer中,该属性具有许多属性。
我期望的JSON数据包含在jqXHR对象的responseText
属性内,因此需要首先进行解析。因此,完整的解决方案是:
function LoadDataFromApi(apiUrl) {
if (!requestCache[apiUrl]) {
var result = $.ajax({
type: 'GET',
url: apiUrl,
dataType: "json",
statusCode: {
// JQuery now has an jqXHR containing all the data we need regarding any success/failures (as we can address multiple status codes here)
500: function (xhr) {
// Parse the JSON data we expected
var err = JSON.parse(xhr.responseText);
// Display the error data
console.log('Message:' + err.Message);
console.log('ExceptionMessage:' + err.ExceptionMessage);
console.log('ExceptionType:' + err.ExceptionType);
},
200: function (xhr) {
// console.log('success');
// var goodData = JSON.parse(xhr.responseText);
}
}
});
// This line would generally go in success, but I need to re-use the data regardless of the status code
requestCache[apiUrl] = result;
}
return requestCache[apiUrl];
}