我正在使用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
。
答案 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并保存令人头疼的问题。