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

Forcing a JSONP call to convert text response to JSON

本文关键字:转换 JSON 响应 文本 JSONP 调用 强制      更新时间:2023-09-26

如果我有以下请求

$.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状态码的服务器响应。响应头表示它正在返回文本/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。然后,你会更好地知道你的选择是什么。如果您需要帮助来理解这一点,那么请为您的问题添加确切的服务器响应。