跨域

这是一个基本不会遇到的问题,不过万一呢??

跨域

不论ajax,还是promise交互,都遵循同源策略原则。也就是说:
http: 协议
localhost: 主机地址/域名
9090 端口号
三者中有一个不一样就是未遵循同源策略,就不可以使用ajax或this.$http.get/post方式。
但是在实际工作中运气实在不好(基本不会)会遇到接口地址和页面地址相左的情况,正常的交互方式就无法请求到数据。于是,出现了跨域问题。

解决跨域

总的来说,
get方式的跨域:JavaScript动态创建script标签
框架(比如vue)方式:jsonp ,其底层也就是动态创建script标签。

先和后台哥们儿商量好,搞个下面格式的data.txt

fn([
	{"name":"张三",sex:"男"},
	{"name":"王五",sex:"女"}
])

来动态创建一下script标签

<body>
<button id="btn">btn</button>
<ul></ul>
</body>
<script>
function fn(data){//把结果当参数传递
	console.log(data);
	for(var i = 0;i<data.length;i++){
		var li = document.createElement("li");
		li.innerHTML = data[i].name;
		document.getElementsByTagName("ul")[0].appendChild(li);
	}
}
</script>
<script>
	var btn = document.getElementById("btn");
	btn.onclick = function(){
		var oScript = document.createElement("script");
		oScript.src = "data.txt";
		document.body.appendChild(oScript);
	}
</script>

jsonp的底层也就是动态创建script标签,动态创建script标签就是写一个script标签指向资源换了一种方式请求。
但是以上的方式并没有异步请求。当代码执行到这段代码时,整个页面都在等待中。Ajax是异步请求的,互不干扰的。所以动态创建会堵塞浏览器运行。不过这种问题一般很少遇到。

至此,vue中跨域时就用到下面这句。

this.$http.jsonp('',{params:{a:1,b:1}},{emulateJSON:true}).then((res)=>{res.data});

来段真实接口操作!key部分已经隐匿(花钱买的!!)

var vm = new Vue({
	el:"#box",
	created(){
		this.$http.jsonp('http://apis.juhe.cn/oil/region',
		{params:{
			key:'a*************************e',format:2,city:'北京'},
		},
		{emulateJSON:true})
		.then((res)=>{console.log(res.data)})
	}
})

此外,有时我们使用的接口并没有在本机,但却没有出现跨域,那是因为人家接口底层允许跨域了,让你有权限获取,是开源的。

其他情况下的跨域再说吧。以上代码没有测试手敲的,哪里错了自己找找吧。只供参考。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值