jsonp返回json格式无法通过dataFilter进行预处理◔ ‸◔?

想要从一个百度统计页面获取到数据,从控制台获取到数据请求地址:http://tongji.baidu.com/data/...
这个地址返回的是json格式数据。
直接请求会有跨域问题,只能通过jsonp方式请求,但是会有报错(见图1)。这个问题主要是服务端返回的数据没有进行预处理,由于无法要求百度服务端进行预处理只能自己想办法了。查看jQuery文档,发现dataFilter参数可以对服务端返回的原始数据进行过滤,然后再传入success中。
现在的问题是
在测试中 dataFilter 方法传入的data参数是undefind。网上有一些处理方法但是不灵光,求解决方案。。。

贴上我的代码:

// 使用dataFilter过滤服务端返回数据
 $.ajax({
  type: 'get',
  url: 'http://tongji.baidu.com/data/browser/getData',
  dataType: 'jsonp',
  crossDomain: true,//强制跨域
  jsonp: 'callback',
  jsonpCallback: 'success_jsonpCallback',
  dataFilter: function (data, type) {
    console.log(type);
    console.log(data);
    return 'success_jsonpCallback(' + data + ')';
  },
  data: {
    st: 1472659200000,
    et: 1480435200000,
    reportId: 200
  },
  success: function (data) {
    console.log(data);
  }
});

图1
控制台报错

----------------2017/3/17 “诈帖”分割线----------------
不好意思各位,这会正在清理未解决的问题。
这个问题当初可能描述的不是很清楚,我重新表达一下:

  • 首先,我理解jsonp的原理,需要服务器端将json格式的数据以参数的形式放入一个函数调用表达式中。

  • 看到jQuery的ajax方法中设置项dataFilter可以在数据返回给success之前做些预处理。

    • 因此,我想着是不是可以在这里做本来服务器端做的事情:将json格式的数据以参数的形式放入一个函数调用。

    • 但是,dataFilter方法中data的值确实undefined。

  • 这块是不是dataFilter的用法不对?或者我的理解有错误?请大家指正。

阅读 5.8k
3 个回答

如果这样可行,安全机制都没用了

这是因为执行顺序的原因,
jsonp会先将接受到的内容当作一段代码加载到当前的运行环境中,然后再根据jsonpCallback中的名称去调用它。
此处由于服务端返回的根本就不是一段可以被执行的代码,自然会报语法错误了。
要想解决跨域问题这样是不行的。你可以用自己的服务器去做中转来实现。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题