JavaScript jsonp解决跨域问题

本文介绍了浏览器的同源策略导致的跨域问题,以及通过JSONP技术解决跨域请求的两种方法:使用<script>标签和jQuery AJAX。JSONP仅支持GET请求,通过动态创建<script>标签或者设置jQuery AJAX的dataType和jsonpCallback属性来实现。示例中展示了请求豆瓣API并处理返回数据的过程。

产生跨域原因[浏览器同源策略]:协议不同(http/https)、域名不同、端口不同

演示下出现跨域的情况,请求豆瓣api:http://api.douban.com/v2/movie/top250

jquery-ajax请求

function req_test () {
	var url = "http://api.douban.com/v2/movie/top250"

	$.ajax({
		type: "GET",
		url: url,
		success: function (res) {
			console.log(res)
		}
	});
}
req_test()

控制台直接报错...

谷歌翻译:请求的资源上不存在“Access-Control-Allow-Origin”标头。 因此不允许原点'null'访问。

 

解决跨域的方法很多,其中包括CORS(Cross-Origin-Resource-Sharing),jsonp

使用CORS解决跨域问题,直接让后台人员设置就好,前端照常请求。参考博客:跨域资源共享 CORS 详解

下面列举jsonp的两种实现方式(js / jquery ajax)

1.通过<script>请求,浏览器对<script>没有同源限制

function jsonpProcess (data) {
	console.log(data)
}

function jsonp_Script () {
	var _script = document.createElement("script");
	_script.type = "text/javascript";
	_script.src = "http://api.douban.com/v2/movie/top250?start=25&count=30&callback=jsonpProcess";
	document.head.appendChild(_script)
}

jsonp_Script();

成功请求,注意src中还附加了请求参数,这是个GET请求,jsonp也仅仅支持GET请求。数据在自定义函数jsonpProcess中返回,注意使用callback=jsonpProcess调用

2.通过jquery ajax请求,jquery ajax进行jsonp请求需要额外设置两个属性:dataType,jsonpCallback

function jsonp_jquery () {
	var url = "http://api.douban.com/v2/movie/top250"
	var data = JSON.stringify({
		"start": 25,
		"count": 30
	})

	$.ajax({
		type: "GET",
		url: url,
		data: data,
		dataType: "jsonp",
		jsonpCallback: "jsonpProcess", // jsonpProcess自定义函数名
		success: function (res) {
			console.log(res)
		}
	});
}

jsonp_jquery();

注意:jsonpCallback属性的值为自定义函数jsonpProcess

3.vue-resource解决跨域问题

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.1"></script>
<script type="text/javascript">
	Vue.http.jsonp("http://api.douban.com/v2/movie/top250", {
		params: {
			start: 20, 
			count: 30
		}
	}).then(response => {
		console.log(response)
	}, response => {
		console.log(response)
	});
</script>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值