42

我正在使用以下代码进行跨域 JSONP 调用:

jQuery.ajax({
        async: true,
        url: 'http://mnews.hostoi.com/test.json',
        dataType: 'jsonp',
        method: "GET",
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(textStatus + ': ' + errorThrown);
        },
        success: function (data, textStatus, jqXHR) {
            if (data.Error || data.Response) {
                exists = 0;
            }
        }
    });

在 Firebug 中调试时,出现以下错误:

在此处输入图像描述

SyntaxError: missing ; before statement

但是,当我通过 jsonlint.com 之类的工具传递我的 json 对象(可通过 JQ 代码中的链接获得)时,它说它是有效的 JSON。而且我也没有发现任何异常。它怎么会返回语法错误?是我没有得到的一些 JSONP 细节还是什么?

JSON 示例

{"news":[ {
  "sentences": [
    "Neuroscientists have discovered abnormal neural activity...", 
    "The researchers found that these mice showed many symptoms...", 
    "\"Therefore,\" the study authors say, \"our findings provide a novel.."
  ], 
  "summaryId": "ZJEmY5", 
  "title": "Abnormal neural activity linked to schizophrenia"
}]}

提前致谢。

4

6 回答 6

28

JSONP 不是 JSON。JSONP 响应将由一个 JavaScript 脚本组成,该脚本仅包含一个函数调用(对预定义函数)和一个参数(这是一个符合 JSON 语法的 JavaScript 对象文字)。

您得到的响应是 JSON,而不是 JSONP,因此您将其作为 JSONP 处理的努力失败了。

更改dataType: 'jsonp'dataType: 'json'(或完全删除该行,服务器发出正确的内容类型,因此您无需覆盖它)。

由于您的脚本运行在与 JSON 不同的来源上,因此您还需要采取措施(大多数但不是全部要求您控制提供 JSON 的主机)来解决相同的来源策略

于 2013-10-18T18:03:22.997 回答
7

错误是因为它返回的是 JSON 而不是 JSONP。

JSONP 应该看起来像

someCallBackString({ The Object });
于 2013-10-18T18:02:36.303 回答
4

这是工作示例

$.ajax({
 type: 'GET',
 url: 'http://xxx.amazonaws.com/file.json',
 dataType: 'jsonp',
 jsonpCallback: 'callback',
 success: function(json){
   console.log(json);
 }
});

你应该把你喜欢callback的开头:file.json

callback({"item":{".......

于 2015-07-24T08:29:19.710 回答
2

正如 epascarello指出的那样,JSONP 响应必须像这样发送:

callBackFunction({ JSON Object })

然后可以像这样设置调用者函数:

var url =  "http://someremoteurl.com/json";
    $.getJSON(url + "?callback=?", null, function(data) {
    callBackFunction(data);
});

然后您可以将响应数据循环为:

function callBackFunction(data)
{
   console.log(data);
}
于 2014-05-01T08:02:31.680 回答
1

如果您使用“ callback=? ”参数,您在服务器端的响应应如下所示:

$_callback = $_GET['callback'];    
echo $_callback . '(' . json_encode(YOUR_VARIABLE) . ');';

如果未定义“ callback=? ”参数,您的响应应如下所示:

echo '[' . json_encode($_return_array) . ']';
于 2016-02-17T06:16:36.200 回答
0

如果问题与 Ruby 有关,那么在您的控制器中确保正确呈现格式。例子:

def view_product
   data = Product.find params[:id]
   render :json =>  data, :callback => params[:callback]
end

在您的渲染方法中,您应该有:callback参数,否则它将以 json 而不是 jsonp 呈现。

于 2014-08-10T05:50:44.013 回答