Axios、同源策略和跨域、JSONP

本文介绍了Axios,它是专注网络数据请求的库,简单易用且轻量化。还阐述了同源策略和跨域概念,指出跨域是因浏览器同源策略限制。实现跨域主要有JSONP和CORS两种方案,重点讲解了JSONP的原理、使用过程及缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Axios基本概念

Axios 是专注于网络数据请求的库。
相比于原生的 XMLHttpRequest 对象,axios 简单易用。
相比于 jQuery,axios 更加轻量化,只专注于网络数据请求。

axios的基本使用方式
发起get请求:

axios.get(请求地址,{params: 参数}).then(function (res) {});

发起post请求:

axios.post(请求地址,{data: 参数}).then(function (res) {});
axios.post(请求地址, 参数).then(function (res) {});

综合方法:

axios({
	method: 请求类型,
	url: 请求地址,
	params: get请求发送的数据,
	data: post请求发送的数据,
}).then(function (res){

});

注意res不是服务器返回的原始数据,是axios加工之后的数据;res.data是服务器返回的数据;

同源策略、跨域

什么是同源:
如果两个页面的协议域名端口都相同,则两个页面具有相同的源。
同源策略(英文全称 Same origin policy)是浏览器提供的一个安全功能。
MDN 官方给定的概念:同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

什么是跨域:
同源指的是两个 URL 的协议、域名、端口一致,反之,则是跨域。
出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互。

浏览器对跨域请求的拦截:浏览器允许发起跨域请求,但是,跨域请求回来的数据,会被浏览器拦截,无法被页面获取到!

实现跨域数据请求的方法:
现如今,实现跨域数据请求,最主要的两种解决方案,分别是 JSONP 和 CORS。
JSONP:出现的早,兼容性好(兼容低版本IE)。是前端程序员为了解决跨域问题,被迫想出来的一种临时解决方案。缺点是只支持 GET 请求,不支持 POST 请求。
CORS:出现的较晚,它是 W3C 标准,属于跨域 Ajax 请求的根本解决方案。支持 GET 和 POST 请求。缺点是不兼容某些低版本的浏览器。

JSONP

JSONP (JSON with Padding) 是 JSON 的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
JSONP的实现原理:
由于浏览器同源策略的限制,网页中无法通过 Ajax 请求非同源的接口数据。但是scr属性不受浏览器同源策略的影响,可以通过<script> 标签的src 属性,请求非同源的 js 脚本。
JSONP的使用过程:
1.通过script标签发出请求,浏览器会认为请求回来的数据是一个js文件,会当作js代码去执行;
2.script标签的src地址中,使用协商好的字段携带要调用的函数名;
3.服务器会根据请求地址中的字段,捕捉到函数名,把函数名和数据拼接后返回;
4.在前端页面中,定义传输的函数名,通过形参接收服务器传过来的实参;

JSONP的缺点
由于 JSONP 是通过 <script> 标签的 src 属性,来实现跨域数据获取的,所以,JSONP 只支持 GET 数据请求,不支持 POST 请求。
注意:JSONP 和 Ajax 之间没有任何关系,不能把 JSONP 请求数据的方式叫做 Ajax,因为 JSONP 没有用到XMLHttpRequest 这个对象。

用jQuery发出JSONP请求:

$.ajax({
	url: 请求地址, // 请求地址后面用?+字符串的格式发送数据
	dataType: 'JSONP',
	success: function(res){
		console.log(res);
	}
});

在使用 jQuery 发起 JSONP 请求时,如果想要自定义 JSONP 的参数以及回调函数名称,可以通过如下两个参数来指定:

 $.ajax({
 url: 'http://ajax.frontend.itheima.net:3006/api/jsonp?name=zs&age=20',
 dataType: 'jsonp',
 
 // 发送到服务端的参数名称,默认值为 callback
 jsonp: 'callback',
 // 自定义的回调函数名称,默认值为 jQueryxxx 格式
 jsonpCallback: 'abc',
 
 success: function(res) {
 console.log(res)
 }
 });
### 回答1: Axios可以通过使用JSONP来解决问题。JSONP是JSON with Padding的缩写,是一种解决请求的方法。JSONP通过在请求URL中传递一个回调函数名称,服务器端将数据包装在该回调函数的调用中返回给客户端,客户端再通过该函数接收并处理数据,这样就实现了请求。 Axios中可以通过设置`jsonp: 'callback'`来开启JSONP请求,其中`callback`是回调函数的名称。例如: ``` axios({ method: 'get', url: 'http://example.com/data', params: { id: 123 }, jsonp: 'callback' }) .then(response => { console.log(response.data) }) .catch(error => { console.log(error) }) ``` 在请求中设置了`params`参数,表示将该参数传递到服务器端,服务器端可以通过该参数返回相应的数据。同时,通过设置`jsonp: 'callback'`来开启JSONP请求,并指定回调函数的名称为`callback`。 在服务器端,需要将数据包装在回调函数的调用中返回给客户端。以Node.js为例,代码如下: ``` var express = require('express'); var app = express(); app.get('/data', function (req, res) { var id = req.query.id; var data = { id: id, name: 'John' }; var callback = req.query.callback; res.send(callback + '(' + JSON.stringify(data) + ')'); }); app.listen(3000, function () { console.log('Example app listening on port 3000!'); }); ``` 在上面的代码中,首先获取了客户端传递过来的`id`参数,然后构造数据`data`,最后获取客户端传递过来的回调函数名称`callback`,将数据包装在该回调函数的调用中返回给客户端。 通过上述方式,就可以使用AxiosJSONP功能来解决请求了。 ### 回答2: Axios是一个非常流行的JavaScript库,它专门用于发送HTTP请求。然而,由于同源策略限制,我们在使用Axios发送请求时,很容易碰到浏览器的请求限制。在这种情况下,我们可以考虑使用Axios Jsonp来解决问题。 JSONP(JSON Padding)是一种解决问题的方式,它是通过不同的网址来加载一个JavaScript文件,该文件载入后会执行我们在网址中传入的回调函数,并且将我们需要的JSON数据作为参数传递给回调函数。通常情况下,我们可以通过动态创建一个<script>元素来实现JSONP请求。 在使用Axios Jsonp解决问题时,我们需要先引入Jsonp插件,在Vue项目中,我们可以通过npm来安装: ``` npm i vue-jsonp --save-dev ``` 安装完成后,我们需要在main.js中将Jsonp插件引入: ``` import Vue from 'vue' import Jsonp from 'vue-jsonp' Vue.use(Jsonp) ``` 接下来,在需要发送Jsonp请求的地方,我们可以使用Axiosjsonp方法来实现: ``` this.$jsonp(url, { param: 'callback' }).then((response) => { console.log(response.data) }).catch((error) => { console.log(error) }) ``` 在这个例子中,我们使用了this.$jsonp方法来发送请求,并且指定了callback参数,这个参数在后台接到请求后用来充当回调函数的名称。使用Axios Jsonp可以很方便地解决问题,但是由于Jsonp本身的局限性,它也存在一些缺点。比如Jsonp只支持GET请求,无法使用POST等其他请求方法。同时,也存在安全性问题,因为Jsonp并不是一个真正的Ajax请求,所以无法像Ajax那样对请求进行全面的验证。如果需要更加严格的安全控制,我们需要考虑使用CORS(Cross-Origin Resource Sharing)或者代理来解决问题。 ### 回答3: Axios 是一款流行的 HTTP 客户端库,它支持浏览器 node.js 平台。它提供了很多接口来执行各种 HTTP 请求,例如 GET、POST、PUT、DELETE 等。但在浏览器中,由于策略的限制,发送请求会限制。浏览器限制请求包括 XMLHttpRequest、Fetch、Ajax 等。 解决这个问题的一种方法是使用 JSONP,它是浏览器的一种解决方案,允许在客户端从不同的名请求数据。JSONP 的原理是通过动态创建 script 标签,将请求的数据封装在一个函数调用中,服务器返回的数据会被该函数接收并解析。在客户端通过 script 标签加载服务器返回的 js 文件,客户端收到 js 文件后直接执行其中的代码。因为返回的是一段 JavaScript 代码,所以不存在问题。 Axios 提供了一个可以发送 JSONP 请求的接口,这个接口JSONP 接口的 promise 化版本。Axiosjsonp接口主要有两个参数,一个是url,另一个则是用于配置jsonp的一些选项回调函数。 下面是 axios jsonp 的使用示例: ``` axios.jsonp('http://server.com/api', { params: { // 设置请求参数 name: 'apple', count: 10 }, jsonpCallback: 'callback', // 回调函数名字 timeout: 5000 // 超时时间 }) .then(function(response){ console.log(response); }) .catch(function(error){ console.log(error); }); ``` 在传递的配置选项中,`jsonpCallback` 是必选的选项,它指定了回调函数的函数名。服务器返回的数据应该该函数名作为函数调用,并将请求的数据作为参数传入。在完成请求的时候,Axios调用这个函数来解析返回的数据。 Axios 通过动态创建 script 标签的方式发送 JSONP 请求,解决了同源策略限制下的问题。同时,AxiosJSONP 的支持也使得开发者能够更加方便地获取数据,轻松构建 Web 应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值