【发布时间】:2018-10-11 14:17:05
【问题描述】:
我有以下代码调用 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,我看到$.ajax 中有一个statusCode 对象,但我无法成功实现它。 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];
}
如果有人能在我的代码中发现问题,我将不胜感激?
【问题讨论】:
-
当您的 API 返回错误 JSON 时,它会返回什么 HTTP 状态代码? 200好吗?还是 500 服务器错误或其他一些状态代码?如果它返回 HTTP 200 OK 但带有“错误” JSON 有效负载,那么您只需检查您返回的数据并查看它是否具有指示它是错误响应的相关数组键,并处理相应地。
-
无论如何它都会返回 JSON,但错误返回 500,成功返回 200。
-
如果您使用
$.ajax的基于promise 的接口,那么您可以使用Promise.catch()定义您的错误处理程序——例如$.ajax({...}).catch(function() { /* whatever you want to do with the error */ });