JSONP的跨域
Posted CSandCatti
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSONP的跨域相关的知识,希望对你有一定的参考价值。
关于JSONP的使用
本次文章主要讲解运用jsonp实现跨域的原理和一个小例子的实现~
什么是跨域?
要说什么是跨域,首先要说说什么是同源策略?
所以要实现不用源的数据请求就要实现跨域啦~
怎么实现跨域?
关于跨域的实现方式,网上的讲解有很多,大概就是:
jsonp
document.domain+iframe
location.hash+iframe
Window.name+iframe
html5的postMessage方法
CROS
附上一个我觉得跨域讲的还不错的网站:
https://www.cnblogs.com/roam/p/7520433.html
怎么实现jsonp的跨域?
虽然网上讲解的很清楚,但是都没有实际代码来验证一下,所以以下讲解了一个可以实现看到效果的实际操作~
原理
jsonp主要是通过script标签的url属性(因此也只能实现get请求);
因为通过script标签引入的js是不受同源策略的限制的;
所以我们可以通过script标签引入一个js或者是一个其他后缀形式(如php,jsp等)的文件,此文件返回一个js函数的调用(跟服务器约好的回调函数)。
实例操作:
跟服务器约定好一个回调函数;
我们先上网去找一下可以实现jsonp的网站接口:
https://www.bejson.com/knownjson/webInterface/
这个网站有很多接口哦,我们选用第一个电商接口。
点击用例,把url参数修改为卫衣,网页显示了他返回的结果;
可见他的回调函数是cb
,返回一个对象,里面又个result
数组,接下来我们要实习的就是自己获取这个result数组,并在控制台打印出数组的第一个结果;
把这个回调函数
cb
作为参数传递给服务器,服务器会返回一段js,这段js会调用写在客户端的回调函数,并往里面传参。
以下是js代码:
function jsonp(url) {
//动态生成一个script标签
let script = document.createElement('script');
script.src = url;
script.setAttribute("type","text/javascript");
document.body.appendChild(script);
}
function cb(data) {
//由于该网址返回的就是一个对象,所有不用在解析啦
//var obj = JSON.parse(data);
console.log(data.result[0]);
}
window.onload = function (ev) {
//给script标签传入url
var url = 'http://suggest.taobao.com/sug?code=utf-8&q=' + '卫衣' +'&callback=cb';
jsonp(url);//服务器会返回一段js,这段js是cb({result:[[...]...]});
}
将上面的js文件插入到html中,在chrome浏览器的开发者工具的console里就可看到结果啦~
结语
具体代码都放在github的jsonp文件里了~:https://github.com/dy21335/Practice
以上是关于JSONP的跨域的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSONP 或 CORS 的跨域 JavaScript 调用
对 Python Bottle 的跨域 Angular JSONP 请求
JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)