javascript - 强制 JSONP 调用将文本响应转换为 JSON

标签 javascript jquery ajax json jsonp

如果我收到以下请求

$.ajax({
    type: "GET",
    dataType: "jsonp",
    jsonp: "callback",
    jsonpCallback: "my_callback",
    url: my_https_url,
    headers:{"Content-Type":"text/html; charset=utf-8"},
    success: function(data) {
        eval("json="+data);
    }
    error: function() {
        console.log("fail");
    }

});

我收到带有 200 状态代码的服务器响应。响应 header 表示它正在发送回 text/html 作为内容类型。但是,我知道内容实际上是格式化的 JSON 数据。问题是服务器未配置为接受 JSONP 请求(并且我无法更改它)。出于与跨域相关的原因,我使用 JSONP 方法。我返回的错误状态是“parseerror”,因为它不被识别为 JSON。有没有办法覆盖负责解析数据的函数,以便我可以强制将其视为 JSON?可能使用 eval()?

最佳答案

如果您的服务器无法创建 JSONP 格式的响应,并且由于同源限制而必须使用 JSONP,那么您就运气不好了。 JSONP 格式的响应采用调用指定回调的可执行脚本的形式。

您通常无法从不同的来源获取 JSON。您要么需要 JSONP,要么需要一个现代浏览器,其服务器配置为允许跨源请求。如果您无法将服务器配置为允许跨源请求,则需要服务器创建 JSONP。如果它不这样做,那么您就无法从中获取数据。 JSONP 是跨源请求的一种解决方法,它需要服务器配合来为响应创建 JSONP 格式的结构。

<小时/>

如果您从服务器获取 JSONP 结构,并且 jQuery 在尝试将响应解析为 JSON 时遇到解析错误,那么这是因为服务器发送的任何内容都不是 JSONP 结构内的合法 JSON。事实上,您收到解析错误意味着 jQuery 正在尝试将其解析为 JSON,并且在尝试这样做时收到错误。如果是这样,那么您有两个选择:

  1. 将服务器发送的数据修复为 100% 合法的 JSON。
  2. 以文本形式接受数据,并将其修复为合法的 JSON,或自行以某种方式解析它,以按原样接受数据。

无论哪种情况,第一步可能是console.log()正在发送的文本,并准确理解为什么它不被接受为合法的 JSON。然后,您会更好地知道您的选择是什么。如果您需要帮助理解这一点,请向您的问题添加准确的服务器响应。

关于javascript - 强制 JSONP 调用将文本响应转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24273813/

相关文章:

javascript - 如何在 Capybara 中重新抓取页面?

javascript - 有没有办法知道元素是在表还是列表中?

javascript - 如果 AJAX 响应为 null,则 jQuery 中断

javascript - 从数据库加载数据而不闪烁 Angular Js

javascript - ie9 中的 Angular js 占位符问题

javascript - for循环中的两个条件

javascript - Prettyphoto 中的照片不要显示两次

javascript - Jquery 验证引擎 onclick

javascript - 如何使用 Javascript 在客户端使用 WebMethod 返回的复杂类型?

javascript - Select2预加载数据