如何在type设置为JSON时检查AJAX响应字符串

时间:2016-03-28 15:33:54

标签: javascript json ajax

我正在使用ajax从网页获取JSON数据。所以我将responseType设置为json。如果网页成功处理数据,它会返回一个有效的JSON字符串,这很好。

但是如果网页失败,会返回一个带有错误消息的JSON字符串,(对不起有误),它返回一个错误字符串,而不是一个json字符串,因此JavaScript无法识别它作为有效的JSON字符串。因此,如果我检查response,则为空。在这种情况下,我想查看响应字符串并检查错误消息是什么。

var xhr = new XMLHttpRequest();
xhr.responseType = "json";
xhr.open("POST", "/someEndpoint");
xhr.send();
xhr.onload = function() {
    console.log(xhr.response);
}

Fiddle to reproduce the issue。)

如果/someEndpoint返回有效的JSON,xhr.response是一个JavaScript对象。但是,如果它不是有效的JSON(当端点响应错误消息时),那么我在xhr.response中得到一个空对象。我无法访问invalid-JSON错误响应,因为访问xhr.responseText会出现错误:

  

未捕获的DOMException:无法从'XMLHttpRequest'读取'responseText'属性:只有当对象的'responseType'为''或'text'('json')时,才能访问该值

我在使用responseType="json"运行请求后,不知道如何阅读原始HTTP响应,因为无法访问responseText

1 个答案:

答案 0 :(得分:3)

使用您当前的代码,这将无效,因为错误消息直接指示:

  

未捕获的InvalidStateError:无法读取' responseText'属性   来自' XMLHttpRequest':只有对象可以访问该值   '的responseType'是''''或者' text' (是' json')。

正如您可以看到以下证据:

var xhr = new XMLHttpRequest();
//xhr.responseType = "json";

xhr.open("POST", "/echo/json/");
xhr.send("hello world");

xhr.onload = function() {
    console.log(xhr.response);
    console.log(xhr.responseText);
}

当您将responseType设置为JSON时,您将无法在该对象上获得responseText属性。您不希望设置responseType并将响应(parseJSON)评估为文本字符串。如果您有响应的错误消息,那么您的eval将无法正确解析JSON。这有点像jQuery在幕后所做的那样,以及那个话题......

为什么要使用本机XMLHttpRequest浏览器对象进行不可能的任务。 jQuery花了数年时间在浏览器中标准化AJAX并标准化API。该API始终具有'回电,完全符合您的需求。

TLDR 为此使用jQuery并保存令人头疼的问题。