【问题标题】:How to check AJAX Response String when type is set to JSON类型设置为 JSON 时如何检查 AJAX 响应字符串
【发布时间】:2016-03-28 15:33:53
【问题描述】:

我正在使用 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”为“”或“文本”(为“json”)时才可访问

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

【问题讨论】:

  • 分享你的代码或小提琴
  • 你试过用JSON.parse(responseText)吗?
  • 您的错误是 JSON 格式吗?如果是,当然可以解析它。否则,您必须将其作为文本阅读(这也是可能的)
  • "它返回一个json字符串,里面有错误信息,所以javascript不能把它识别为有效的json字符串" 呃? JSON 是 JSON。如果 JavaScript 无法解析它,那么它一开始就是无效的 JSON。也许您的意思是响应只包含原始错误消息?
  • @FelixKling 我冒昧地编辑了一个代码示例,我认为它可以捕捉到 OP 的问题

标签: javascript json ajax


【解决方案1】:

使用您的代码当前的方式将无法正常工作,因为错误消息直接表明:

未捕获的 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 来解决这个问题。

【讨论】:

  • 或者,使用文本并自己解析。
  • 加载 jQuery (230.67 KB) 以仅解决 AJAX 请求没有意义。最好至少使用更轻量级的库,例如 Axios (13.9 KB)。
  • @JérémieBoulay 是的,有各种库可以处理 AJAX 请求。 jQuery 是一个非常常见的库,已经在大多数框架(如 bootstrap 和 Wordpress)中找到,并且具有出色的文档和庞大的支持社区。我一般建议基于这些因素而不是库的大小。此外,如果有更好的选项可用或更喜欢,最好为问题添加答案,而不是对已接受的答案投反对票并发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多