在进行网站开发的过程中经常会用到第三方的数据,但是由于同源策略的限制导致ajax不能发送请求,因此也无法获得数据。解决ajax的跨域问题有两种方法:
一、jsonp
二、XMLHttpRequest2中可以配合服务端来解决,在响应头中加入Access-Control-Allow-Origin:*
1、同源:
同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口号完全相同
1.1目的:保护用户信息安全 1.2限制:cookie、localStorage和IndexDB无法读取 无法操作跨域的iframe里的dom元素 ajax请求不能发送2、跨域:
不同源则为跨域
http://api.example.com/detail.html 不同源 域名不同 2 https//www.example.com/detail.html 不同源 协议不同 3 http://www.example.com:8080/detail.html 不同源 端口不同 4 http://api.example.com:8080/detail.html 不同源 域名、端口不同 5 https://api.example.com/detail.html 不同源 协议、域名不同 6 https://www.example.com:8080/detail.html 不同源 端口、协议不同 7 http://www.example.com/detail/index.html 同源 只是目录不同
3、jsonp原理:
其本质是利用了标签具有可跨域的特性,由服务端返回预先定义好的javascript函数的调用,并且将服务端数据以该函数参数的形式传递过来
4、案例
views.pyfrom django.shortcuts import renderimport requestsdef jsonp(request): response = requests.get('http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301') #通过这个天气的API接口获得天气信息 #print(response.content) # 字节 response.encoding = 'utf-8' #将其转化为中文字符 #print(response.text) # 字符串 return render(request,'jsonp.html',{ 'result': response.text}) #向前端发送result
urls.pyfrom app01 import viewsfrom django.contrib.staticfiles.ursfrom django.urls import pathurlpatterns = [ path('jsonp/', views.jsonp),]
jsonp.htmlTitle 后台获取的结果
{ { result }}js直接获取结果
案例前端结果: