哈喽~大家好,这篇来看看Axios网络请求。
文章推荐 | 链接 |
---|---|
SpringCloud Sentinel 使用 | SpringCloud Sentinel 使用 |
将Nacos注册到springboot使用以及Feign实现服务调用 | 将Nacos注册到springboot使用以及Feign实现服务调用 |
微服务介绍与 SpringCloud Eureka | 微服务介绍与 SpringCloud Eureka |
目录
- 一、前言
- 1、什么是Axios?
- 2、Axios特性
- 二、安装Axios
- 三、Axios的用法
- 1、发送GET请求
- 2、发送POST请求
- 3、async/await
- 4、其他请求方式
- 四、Axios与Vue整合
- 五、跨域问题
- 1、什么是跨域
- 2、为什么会出现跨域问题?
- 3、跨域问题解决
- 4、前端代码
- 5、后端代码讲解
- 6、前端代码讲解
- 六、拦截器
一、前言
1、什么是Axios?
在实际项目开发中,前端页面所需要的数据往往需要从服务器端获取,这必然涉及与服务器的通信。
Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。
Axios 在浏览器端使用XMLHttpRequests发送网络请求,并能自动完成JSON数据的转换 。
Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求。说到get、post,大家应该第一时间想到的就是Jquery吧,毕竟前几年Jquery比较火的时候,大家都在用他。但是由于Vue、React等框架的出现,Jquery也不是那么吃香了。也正是Vue、React等框架的出现,促使了Axios轻量级库的出现,因为Vue等,不需要操作Dom,所以不需要引入Jquery.js了。官方网站
2、Axios特性
1、可以在浏览器中发送 XMLHttpRequests
2、可以在 node.js 发送 http 请求
3、支持 Promise API
4、拦截请求和响应
5、转换请求数据和响应数据
6、能够取消请求
7、自动转换 JSON 数据
8、客户端支持保护安全免受 XSRF 攻击
二、安装Axios
使用npm:
npm install axios
下载完了之后在package.json里面查看是否有axios的版本号,有就表示已经下载成功了
三、Axios的用法
1、发送GET请求
2、发送POST请求
3、async/await
async和await是ES8引入的新语法,准确说来是异步函数实现的语法糖,使用async和await可以更加方便的进行异步操作
async 关键字用于函数上(async函数的返回值是Promise实例对象)
await 关键字用于 async 函数当中(await可以得到异步的结果)
4、其他请求方式
参考这里
四、Axios与Vue整合
在实际项目开发中,几乎每个组件中都会用到 axios 发起数据请求。此时会遇到如下两个问题:
每个组件中都需要导入 axios
每次发请求都需要填写完整的请求路径
可以通过全局配置的方式解决上述问题
axios.defaults.baseURL = "http://localhost:8088"
Vue.prototype.$http = axios
Vue.config.productionTip = false
axios.defaults.baseURL 作用:如果axios发送的AJAX请求的URL不是完整路径的话,就拼接baseURL前缀
Vue.prototype.http作用:http 作用:http作用:http就在所有的Vue实例中可以用了
Vue.config.productionTip 作用:作用——阻止vue启动生产消息,阻止的内容如图所示
五、跨域问题
1、什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
2、为什么会出现跨域问题?
为了保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,称为同源策略,同源策略是浏览器安全的基石
同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能
所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域,此时无法读取非同源网页的 Cookie,无法向非同源地址发送 AJAX 请求
3、跨域问题解决
CORS(Cross-Origin Resource Sharing)是由W3C制定的一种跨域资源共享技术标准,其目的就是为了解决前端的跨域请求。
CORS可以在不破坏即有规则的情况下,通过后端服务器实现CORS接口,从而实现跨域通信。
CORS将请求分为两类:简单请求和非简单请求,分别对跨域通信提供了支持。
在前端代码与后端代码连接时(前后端分离),常常因为跨域问题而连接不上,那么如何解决呢?
在 export default 里面使用created:function方法,代码如下
4、前端代码
created:function(){var _this = this;axios.get("http://localhost:8088/user/findAll").then(function(response){_this.tableData = response.data;// console.log(response.data)})// this.$http.get("/user/findAll").then((response)=>{// this.tableData = response.data;// // console.log(response.data)// })},
5、后端代码讲解
在控制层加上 @CrossOrigin 注解 或者自定义配置类
package com.example.mpdemo.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;// 使用了注解 @CrossOrigin,就可以不用 CorsConfig 配置类了
// @Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允许跨域访问的路径.allowedOrigins("*") // 允许跨域访问的源.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求的方法.maxAge(16800) // 预间隔时间.allowedHeaders("*") // 允许头部设置.allowCredentials(true); // 是否发送 cookie}
}
这里就使用注解的方式
我们看看控制层
package com.example.mpdemo.controller;import com.example.mpdemo.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class OrderController {@Autowiredprivate OrderMapper orderMapper;@GetMapping("/order/findAll")public List findAll(){List orders = orderMapper.selectAllOrdersAndUser();return orders;}}
调用OrderMapper的selectAllOrdersAndUser方法
OrderMapper代码
package com.example.mpdemo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mpdemo.entity.Order;
import com.example.mpdemo.entity.User;
import com.sun.org.apache.xpath.internal.operations.Or;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface OrderMapper extends BaseMapper<Order> {@Select("select * from t_order where uid = #{uid}")List<Order> selectByUid(int uid);// 查询所有的订单,同时查询订单的用户@Select("select * from t_order")@Results({@Result(column = "id",property = "id"),@Result(column = "ordertime",property = "ordertime"),@Result(column = "total",property = "total"),@Result(column = "uid",property = "user",javaType = User.class,one=@One(select = "com.example.mpdemo.mapper.UserMapper.selectById"))})List<Order> selectAllOrdersAndUser();
}
数据库结构
6、前端代码讲解
Hello.vue 代码
<template>
<div><el-table:data="tableData"style="width: 100%":row-class-name="tableRowClassName"><el-table-columnprop="id"label="编号"width="180"></el-table-column><el-table-columnprop="username"label="姓名"width="180"></el-table-column><el-table-columnprop="password"label="密码"width="180"></el-table-column><el-table-columnprop="birthday"label="出生年月"width="180"></el-table-column></el-table><!-- <i class="fa fa-camera-retro fa-lg"></i> -->
</div>
</template><!-- props 自定义属性,可以在外部使用自定义的名称,不需要导入的方式来进行套娃 -->
<script>// import axios from "axios";export default {name: "Hello",data: function(){return {tableData: []}},created:function(){var _this = this;axios.get("http://localhost:8088/user/findAll").then(function(response){_this.tableData = response.data;// console.log(response.data)})// this.$http.get("/user/findAll").then((response)=>{// this.tableData = response.data;// // console.log(response.data)// })},methods: {tableRowClassName({row, rowIndex}) {if (rowIndex === 1) {return 'warning-row';} else if (rowIndex === 3) {return 'success-row';}return '';}}
}
</script><style>.el-table .warning-row {background: oldlace;}.el-table .success-row {background: #f0f9eb;}
</style>
就是发了个请求,将数据放到tableData里面并渲染到页面上。
效果
六、拦截器
在请求或响应被 then 或 catch 处理前拦截它们。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});// 添加响应拦截器
axios.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么return response;}, function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么return Promise.reject(error);});
如果你稍后需要移除拦截器,可以这样:
const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);
可以给自定义的 axios 实例添加拦截器。
const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});