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

时间:2014-06-17 21:44:55

标签: 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状态代码的服务器响应。响应标头表示它正在发送text / html作为内容类型。但是,我知道内容实际上是格式化的JSON数据。问题是服务器未配置为接受JSONP请求(我无法更改它)。我正在使用JSONP方法来解决跨域相关的问题。我得到的错误状态是“parseerror”,因为它不被识别为JSON。有没有办法覆盖负责解析数据的函数,以便我可以强制它被视为JSON?可能使用eval()?

1 个答案:

答案 0 :(得分:3)

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

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


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

  1. 修复服务器发送的数据为100%合法JSON。
  2. 将数据作为文本接受并将其修改为合法的JSON,或者以某种方式自行解析,以接受它的方式。
  3. 在任何一种情况下,第一步可能是console.log()正在发送的文本,并准确理解为什么它不被接受为合法的JSON。然后,您将更好地了解您的选择。如果您需要帮助来理解这一点,请在问题中添加确切的服务器响应。