📖本文目录
📑Axios前后端交互的异步请求库
💖0、写在前面
小付最近再弄前后端分离项目
,因为很多技术以前都是学过的,对之前的所学技术进行一个快速总结与再夯实,不用掌握太深
,会用就可以
,毕竟咱们是专修后端技术的Java工程师嘛
,但是项目的构建,不光光由后端逻辑来解决就可以了,还需要前端的页面整合,中间的数据传输,后端的API接口逻辑等等,都是比较重要的,这样才能完完整整的搭建好一个项目,项目不是必需品,作为校招面试考察的更多的是计算机网络
、操作系统
、数据结构与算法
,设计模式
、数据库
等相关知识,但是精益求精嘛,或多或少完成一到两个整体项目,肯定会有很大的收获,为了以后再回顾前端部分知识的时候有所印象
,就有了这篇文章,有关于Axios前后端信息交互异步请求库。话不多说接着看文章吧~
初学的时候是跟着编程不良人
大佬视频学的,第二次刷的时候看官方网站,就游刃有余多了~
🎁1、axios异步请求技术
axios 前端异步请求的一个库函数 类似于JQuery ajax技术
ajax 用来在页面发起异步请求到后端的服务,并将后端服务响应数据渲染到页面上。
既然Ajax可以做到前后端分离 那为什么改换为axios呢?
JQuery
推荐使用Ajax
,Ajax实际是由JQuery的部分API进行了封装而组合成的一个前后端数据异步请求与接收的工具
。- 我们在做前后端分离项目时,可能会用到
Vue
这个框架,Vue更推荐我们使用axios
,它更为轻小灵活
。
小结: 也是通过前端的页面发起异步请求,请求之后页面不动
,响应后回来刷新并且渲染页面的局部内容
。
axios在Vue中的前端系统发送异步请求,它是连接前端后端的交互使者~
其不是属于Vue的官方类库 第三方的异步请求处理库 在Vue中推荐了axios
Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js | Axios 中文文档 | Axios 中文网 (axios-http.cn)
axios中文网|axios API 中文文档 | axios (axios-js.com)
官方的定义:axios 是一个 简洁易用且高效的Http库
=====> 简单来说就是用来发送Http异步请求库
🎁2、axios与之前的异步请求库有什么独特之处
学习之前我们要先了解一下axios的几大特性,并与咱们以前学过的JQuery啊,Ajax进行对照学习
,这样不仅能快速了解前后端页面数据交互的底层实现
,还能对技术的二次加深与夯实
。
官网中给出的几大特性
从浏览器中创建 XMLHttpRequests
从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
自动转换 JSON 数据
- 客户端支持防御 XSRF
是不是有咱们比较熟悉的XMLHttpRequests这个东东呀,这个是咱们在初学Ajax时见到过的,Ajax的异步请求操作就是基于XMLHttpRequests这个对象中的属性以及方法来实现的~
🎁3、HelloAxios
进入页面另存为:axios.min.js
$ npm install axios
<script src="js/axios.min.js"></script>
🚀1、GET请求
举个小🌰:
axios.get('/user?ID=201901094106&username=Alascanfu')
.then(function (resp) {//请求成功获得响应后的处理
console.log(resp);
}).catch(function (error) {//请求失败后的响应处理
console.log(error);
})
上述的代码表示:当我们引入了axios这个异步请求类库后,我们想要向服务器发送GET请求时的一系列步骤
axios.get(url)
:通过GET请求url地址。.then(function(resp)){...}
:这是一个链式编程的格式,当我们向后端发送请求 然后 后端会将请求返回回来一般是 response (响应).catch(function(error)){...}
:这是当请求错误时才会执行的链式编程代码。 咱们也能理解为这玩意就是Java中的try-catch中的catch
axios可以发送RESTful风格的请求方式
如 POST \ DELETE \ PUT \ GET 等
@RestController
@CrossOrigin//用来解决跨域的问题
public class HelloAxiosController {
@GetMapping("/helloAxios")
public String helloAxios(){
System.out.println("TEST OK~");
return "hello ~ Axios";
}
}
对前端的访问url进行修改然后测试
<script>
axios.get('http://localhost:8080/helloAxios?id=201901094106&username=Alascanfu')
.then(function (resp) {
console.log(resp);
console.log(resp.data);
}).catch(function (error) {
console.log(error);
})
</script>
测试成功会将咱们通过响应获得data的数据进行打印~
返回的状态码为200
,数据data就是hello~ Axios
后端结构目录如图所示:
当我们后端想要从前端获取数据时,可以通过SpringMVC层的@RequestParam进行控制获取
@RestController
@CrossOrigin//用来解决跨域的问题
public class HelloAxiosController {
@GetMapping("/helloAxios")
public String helloAxios(@RequestParam Long id , @RequestParam String username){
System.out.println("TEST OK~");
return "hello ~ Axios";
}
}
修改我们的控制层代码进行读取对应的参数,并且在控制台输出。
当你访问Axios的前端页面
时会向后端发送请求
,请求中夹带着参数id
和username
,后端可以通过@RequestParam
获取相应的参数
🚀2、POST请求
axios.post('http://localhost:8080/helloAxios',{
id: 201901094106,
username: "Alascanfu"
}).then(function (resp) {
console.log(resp);
console.log(resp.data);
}).catch(function (error) {
console.log(error)
})
post请求的唯一区别就在于post方法中的参数要多一个,传递给后端的JSON数据
。
因为是post方法请求,所以还需要改写我们的Controller层的代码。
@PostMapping("/helloAxiosPost")
public String postHelloAxios(@RequestBody User user){
System.out.println(user);
System.out.println("TEST OK~");
return "hello ~ Axios POST!";
}
@Request接收前端传过来的JSON数据
赋给 User 对象
。
当我们访问axios界面时后端会打印出来post请求传过来的数据。
User.java
public class User {
private String username ;
private Long id;
public User() {
}
public User(String username, Long id) {
this.username = username;
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", id=" + id +
'}';
}
}
上述已经囊括了较为普遍的GET与POST方法
了,其他方法本质基本是一样的
,剩下就靠自行理解了
。
🎁4、创建axios的配置对象
🚀1、axios API
可以通过向 axios
传递相关配置来创建请求
// 发送 POST 请求
axios({
method: 'post',
url: '/user/201901094106',
data: {
firstName: 'Fu',
lastName: 'JiaWei'
}
});
🚀2、请求配置
这个是截取自官网的请求配置
{
// `url` 是用于请求的服务器 URL
url: '/user',
// `method` 是创建请求时使用的方法
method: 'get', // default
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL: 'https://some-domain.com/api/',
// `transformRequest` 允许在向服务器发送前,修改请求数据
// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
transformRequest: [function (data, headers) {
// 对 data 进行任意转换处理
return data;
}],
// `transformResponse` 在传递给 then/catch 前,允许修改响应数据
transformResponse: [function (data) {
// 对 data 进行任意转换处理
return data;
}],
// `headers` 是即将被发送的自定义请求头
headers: {'X-Requested-With': 'XMLHttpRequest'},
// `params` 是即将与请求一起发送的 URL 参数
// 必须是一个无格式对象(plain object)或 URLSearchParams 对象
params: {
ID: 12345
},
// `paramsSerializer` 是一个负责 `params` 序列化的函数
// (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
paramsSerializer: function(params) {
return Qs.stringify(params, {arrayFormat: 'brackets'})
},
// `data` 是作为请求主体被发送的数据
// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
// 在没有设置 `transformRequest` 时,必须是以下类型之一:
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
// - 浏览器专属:FormData, File, Blob
// - Node 专属: Stream
data: {
firstName: 'Fred'
},
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求话费了超过 `timeout` 的时间,请求将被中断
timeout: 1000,
// `withCredentials` 表示跨域请求时是否需要使用凭证
withCredentials: false, // default
// `adapter` 允许自定义处理请求,以使测试更轻松
// 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).
adapter: function (config) {
/* ... */
},
// `auth` 表示应该使用 HTTP 基础验证,并提供凭据
// 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
// `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
responseType: 'json', // default
// `responseEncoding` indicates encoding to use for decoding responses
// Note: Ignored for `responseType` of 'stream' or client-side requests
responseEncoding: 'utf8', // default
// `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
xsrfCookieName: 'XSRF-TOKEN', // default
// `xsrfHeaderName` is the name of the http header that carries the xsrf token value
xsrfHeaderName: 'X-XSRF-TOKEN', // default
// `onUploadProgress` 允许为上传处理进度事件
onUploadProgress: function (progressEvent) {
// Do whatever you want with the native progress event
},
// `onDownloadProgress` 允许为下载处理进度事件
onDownloadProgress: function (progressEvent) {
// 对原生进度事件的处理
},
// `maxContentLength` 定义允许的响应内容的最大尺寸
maxContentLength: 2000,
// `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
validateStatus: function (status) {
return status >= 200 && status < 300; // default
},
// `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
// 如果设置为0,将不会 follow 任何重定向
maxRedirects: 5, // default
// `socketPath` defines a UNIX Socket to be used in node.js.
// e.g. '/var/run/docker.sock' to send requests to the docker daemon.
// Only either `socketPath` or `proxy` can be specified.
// If both are specified, `socketPath` is used.
socketPath: null, // default
// `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
// `keepAlive` 默认没有启用
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
// 'proxy' 定义代理服务器的主机名称和端口
// `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
// 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
proxy: {
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
},
// `cancelToken` 指定用于取消请求的 cancel token
// (查看后面的 Cancellation 这节了解更多)
cancelToken: new CancelToken(function (cancel) {
})
}
简单的请求配置操作:
根据配置创建实例
,依据配置实例来进行请求
。
var instance = axios.create ({
baseURL: "http://localhost:8080/"
});
instance.get("/helloAxios?id=201901094106&username=Alascanfu")
.then(function (resp) {
console.log(resp);
console.log(resp.data);
}).catch(function (error){
console.log(error);
})
常用请求配置:
var instance = axios.create({
baseURL: "http://localhost:8080/",
timeout: 5000,
proxy: {
host: '127.0.0.1',
port: 8081,
auth: {
username: 'Alascanfu',
password: '123456'
}
}
})
说白了这个常用的请求配置实例就是为了帮助我们简化配置的实例对象
。
🎁5、axios拦截器
Inteceptor: 拦截器
作用: 用来降axios中共有的参数,响应公共处理交给拦截器处理,减少axios发送请求时代码冗余。
🚀1、请求拦截器
举个实际小案例来讲解
:
当我们构建前后端分离项目的时候,前端传送的数据到后端都会进行信息认证,我们常会看见一个地址后面携带了一串token=xxxxx的请求,那这个具体是如何实现的呢?
<script>
var instance = axios.create({
baseURL: "http://localhost:8080/"
});
instance.interceptors.request.use(function (config) {
console.log(config);
if (config.url.indexOf("?") === -1)config.url+="?token=1234567890987654321";
else config.url+="&token=1234567890987654321";
return config;
}, function (error) {
console.log(error);
return Promise.reject(error);
})
instance.get("/helloAxios?id=201901094106&username=Alascanfu")
.then(function (resp) {
console.log(resp);
console.log(resp.data);
}).catch(function (error) {
console.log(error);
})
</script>
进行请求测试,测试之后如果当前的设置中没有参数的情况下就将原url加上?token参数,如果有参数则直接并入token参数就好了
下述参数都是可以供给config配置类进行修改的对象属性,我们可以根据这些属性进行独立的配置,从而为我们的请求在真正的访问到处理器之前,添加额外的请求拦截器增加数据后再传送给服务器后端。
🚀2、响应拦截器
顾名思义
,我们可以理解他是作为服务器返回数据给前端时需要经过的拦截器,但是我们一般不会对数据库返回的信息进行任何的修改操作,只会加以判断,比如状态码是否符合要求的200
,正确访问等等操作,来进行替代catch中的错误显示
。
instance.interceptors.response.use(function (resp) {
console.log(config);
if (resp.status == 200)return resp;
else {
alert("服务器出现错误!");
}
return resp;
}
💖6、总结
axios作为Vue中外接的异步请求库
,固然有它自身的特点
、之前特点也有所讲述了,其实说白了axios的关键点
在于异步请求时调用的各种请求方式
,方式掌握了,学会了如何利用浏览器的DEBUG
等都可以很轻松的解决上述问题,当然在传输数据的时候会有很多前后端交叉的知识错误点,我觉得如果单独抽出来每个人肯定都会进行修改
,但是合在一起就更加考察程序猿们的思维能力了。个人觉得比较重要需要掌握的点
就在于axios中的全局配置对象
以及 axios中的两大拦截器
为难点,学会如何使用,如何解和项目实际进行开发
就好了~