想要从一个百度统计页面获取到数据,从控制台获取到数据请求地址: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的用法不对?或者我的理解有错误?请大家指正。
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
如果这样可行,安全机制都没用了
这是因为执行顺序的原因,
jsonp会先将接受到的内容当作一段代码加载到当前的运行环境中,然后再根据
jsonpCallback中的名称去调用它。此处由于服务端返回的根本就不是一段可以被执行的代码,自然会报语法错误了。
要想解决跨域问题这样是不行的。你可以用自己的服务器去做中转来实现。