入门 - Vue中使用axios原理分析及解决前端跨域问题

1. 什么是Axios?

Axios(ajax i/o system),是Vue创建者主推的请求发送方式,因其简单的配置与良好的性能被前端爱好者所喜爱。众所周知,在进行网页设计时经常需要从后端拿数据,在Web应用初期会将整个页面或者文档直接拿过来,随着Web应用的发展,人们对性能的不断提升,逐渐向无页面刷新从后端获取数据,而axios就是其中一种新兴、火热的方式。在学习Vue中使用axios时,不需要太过于了解请求的发送过程,但需要对各种请求方式有一个大致的认识。本文将会从0到1的介绍vue中如何使用axios,并结合项目实例加深大家印象。

注意:第一部分只是带大家了解一下axios是什么以及其如何使用,具体项目中的应用还要看第二三部分。

1.1. axios概念

axios是一个基于promise 的 HTTP 库,可以用在浏览器和node.js中。

axios本质上也是对原生XHR(XMLHttpRequest)的封装,只不过它是Promise的实现版本,符合最新的ES规范。

新手可能容易弄混ajax与axios两个概念:

  • Ajax(Asynchronous Javascript And XML)不是一种编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。这种技术可以用到各种各样的库上。
  • Axios(ajax i/o system)是基于Ajax技术实现的一种库,市面上还有许多这样的库例如JQuery。

Axios通常具有以下特点:

  • 从浏览器创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御XSRF
  • 主流及大众浏览器宽泛的支持
  • 配置简单、安装简便

1.2. vue中使用axios

第一步:安装(安装起来灰常简单按照步骤执行即可)

  • 首先进入你的项目中src所在的目录
  • 然后进入cmd命令行
  • 执行npm install axios
  • 即可

第二步:引入项目

import axios from "axios"

第三步:发送请求并获取响应

这里仅仅是发送请求的其中一种方式(调用api),发送请求方式有两种:

  1. 传入对象发送;
  2. 调用api发送。
//请求github接口,根据用户名获取用户头像
axios.get(`https://api.github.com/search/users?q=${this.tempstr}`).then(// 响应成功(response存放了所有的响应信息)response=>{this.$bus.$emit("getDatas",{"objData":response.data.items,"isLoding":false,"error":""})},//出错error=>{console.log(error.message)this.$bus.$emit("getDatas",{"objData":[],"isLoding":false,"error":error.message})}
)

1.3. Axios两种请求方式

本质都是发送了一个get请求,一种是调用接口,一种是传入对象。在项目中使用时一般先创建一个axios对象对其进行二次封装,并添加请求、响应拦截器。这里只作为了解。

①.调用接口

this.$axios.get('后端url',{params: {id:1}}).then(res=>{console.log(res.data);},err=>{console.log(err);})

②.传入对象

传入对象常用配置:

参数名作用
baseURL请求的域名,基本地址,类型:String
timeout请求超时时长,单位ms,类型:Number
url请求路径,类型:String
method请求方法,类型:String
headers设置请求头,类型:Object
params请求参数,将参数拼接在URL上,类型:Object
data请求参数,将参数放到请求体中,类型:Object
this.$axios({method: 'get',url: '后端url',params: {id:1}
}).then(res=>{console.log(res.data);
},err=>{console.log(err);
})

接下来将会对请求类型进行细化,介绍axios支持的请求类型。

1.4.Axios支持的请求类型

①.get请求

不带请求参数:

方式一: axios({ methods: 'get', url: '/ulr' })
方式二: axios.get('/url')

带请求参数:

方式一: axios.get('/url', {params: {id: 12}})  //请求的地址实际为 localhost:8080/url?id=12
方式二: axios({methods: 'get',url: 'url',params: {id:12}})

②.post请求

let data = {}
let config = {}
方式一:  axios.post('/url',data,config)
方式二:  axios({methods: 'post',url: '/url',data: data,config: config
})

③.put请求

该请求和post类似,只是请求方法接口不同,传入对象的methods不同

④.patch请求

该请求和post类似,只是请求方法接口不同,传入对象的methods不同

⑤.delete请求

axios.delete('/url', {params: {id: 12}})  #参数在url params很重要
axios.delete('/url', {data: {id: 12}}) #参数在请求体中 将params改为 data就行 

2. 跨域问题解决方案

2.1. 什么是跨域问题?

由于浏览器的同源策略限制,进而产生跨域拦截问题。同源策略是浏览器最核心也最基本的安全功能;所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。这里要着重强调的是跨域问题是因为浏览器的原因,请求响应都是正常的,响应结果也交给了浏览器,只是因为没有进行相应的配置浏览器不将数据拿给用户。

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略在解决浏览器访问安全的同时,也带来了跨域问题,当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

跨域问题通常会抛出类似于下面的错误

Access to XMLHttpRequest at 'http://43.143.232.114:8080/login' from origin 'http://localhost:8081' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

当然这种问题并不是没有解决方案的常见的方法有三种:前端对脚手架文件进行配置、nginx进行转发、后端写相应的字段配合。彻底解决跨域请求还需要了解一下简单请求与复杂请求的概念,这里主要是教大家在vue中使用axios,就不进行过多的赘述了,后面会专门出一篇文章教大家彻底理解并解决跨域问题。

2.2. 方案一:在Vue中进行配置

在前面介绍创建vue项目时曾提到过vue.config.js配置文件,这个配置文件可以对我们的项目做一些个性化定制,也是我们解决跨域问题的重要途径之一。vue快速搭建一个项目在上面文章中有对Vue基础配置进行介绍。

配置文件内容如下:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,lintOnSave:false, /*关闭语法检查*///开启代理服务器(方式一)两个留一个即可devServer: {proxy: 'http://localhost:5000'}, //开启代理服务器(方式二)devServer: {proxy: {//第一个跨域代理'/server1': {target: 'http://localhost:5000',// 这样的写法是一种简写,会将原始路由中的/server1使用空格替换掉pathRewrite:{'^/server1':''},ws: true, //用于支持websocket//用于控制请求头中的host值,这个为true,会将请求头中的host字段变为target设置的值changeOrigin: true },//第二个跨域代理'/server2': {target: 'http://localhost:5001',pathRewrite:{'^/server2':''},ws: true, //用于支持websocketchangeOrigin: true //用于控制请求头中的host值}}}
})

2.3. 方案二:使用Nginx转发

使用这种方法需要有Nginx的基础知识,由于篇幅有限这里只提供思路,不进行细致的介绍了:

  • 在前端主机安装Nginx
  • 配置Nginx主配置文件进行路由转发
  • 启动Nginx服务器

2.4. 方案三:后端配合

这里做的工作就是将响应头字段中的指定字段添加上即可,这里给出Golang的跨域请求设置

//resp是响应对象
resp.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域

3. 封装Axios对象

项目中使用axios时,并不是直接使用其接口,通常会将其进行封装,对其功能进行定制。

以下实例就是对axios原有对象进行定制封装,然后实现自己的接口并调用

3.1. 创建axios实例

/*** 封装的axios*/
import axios from 'axios'
import qs from 'querystring'/*** 错误函数 解析常用的http状态码* 2xx:成功* 3xx: 重定向* 4xx: 资源不存在* 5xx:服务器错误* */
const  ErrorHandle=(status, info) => {switch (status) {case 400:console.log('400-表示请求报文中存在语法错');break;case 401:console.log('401-未经许可,需要通过HTTP认证');break;case 403:console.log('403-服务器拒绝该次访问(访问权限出现问题)');break;case 404:console.log('404-表示服务器上无法找到请求的资源');break;case 500:console.log('500-表示服务器在执行请求时发生了错误,\也有可能是web应用存在的bug或某些临时的错误时;');break;case 503:console.log('503-表示服务器暂时处于超负载或正在进行停机维护,无法处理请求');break;default:console.log(info);break;}
}//自定义新建一个 axios 实例
const install = axios.create({baseURL:process.env.VUE_APP_BASE_URL,//网络请求的基础路径,这里是vue脚手架运行时开启的端口 timeout: 5000,//请求等待时间 时间到了后台没有返回数据 请求中段
})

3.2. 请求拦截器

以下代码将在请求发送出去之前执行,通常用于对请求中的数据进行指定格式化的转换

//拦截器 
// 添加请求拦截器
install.interceptors.request.use(function (config) {console.log('添加请求拦截器',config);//处理post请求发送的参数格式if(config.method==='post'){config.data = qs.stringify(config.data)//{} 转 xx=xx&xx=xx }//配置请求token let token= localStorage.getItem('token')if(token){config.headers.Authorization=token;}else{return config;}// console.log('添加请求拦截器--config',config);// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});

3.3. 响应拦截器

以下代码用于响应来到前执行,通常用于检验响应有没有出错

// 添加响应拦截器
install.interceptors.response.use(response=>response,error=>{console.log('响应拦截器错误',error);let { response } = error;// 对响应错误做点什么ErrorHandle(response.status,response.info)});

最终将axios暴露出去

export default  install;

3.4. 导入定制的axios并使用

以下两个文件可以装进一个api文件夹下,专门负责网络请求

base.js

const base ={host:'http://localhost:8989',//基础域名/*...指定接口对应的路由*/
}export default base;

index.js

/*** 请求的方法*/
import base from './base'
//导入二次封装的axios文件
import axios from '../utils/request'//axios接口配置基础地址
// axios.defaults.baseURL = process.env.VUE_APP_BASE_URL;const api = {//自己指定接口,例如下面制定的一个接口/*** 登录接口*/getLogin(params) {//params={username:'',password:''}return axios.post(base.login, params)},
}export default api

做完上述工作,就可以直接在我们的项目中引入并使用,想用什么功能的接口自己封装即可(不亦乐乎)。

main.js

import api from './api/index'
Vue.prototype.$api = api;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406678.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络之TCP序号,确认序号和报文传输时间

开篇提示 本篇适合于了解基础知识,进行扩展提高的使用,附带考研习题以及解析。 TCP序号和确认序号的区别 TCP首部中有序号和确认序号,他们都是4个字节(4B),且在数据传输中有很重要的意义,那么两…

0x01 GlassFish 任意文件读取漏洞复现

参考文章: 应用服务器glassfish任意文件读取漏洞 - SecPulse.COM | 安全脉搏 fofa 搜索使用该服务器的网站 网络空间测绘,网络空间安全搜索引擎,网络空间搜索引擎,安全态势感知 - FOFA网络空间测绘系统 "glassfish"&…

用TensorFlow实现线性回归

说明 本文采用TensorFlow框架进行讲解,虽然之前的文章都采用mxnet,但是我发现tensorflow提供了免费的gpu可供使用,所以果断开始改为tensorflow,若要实现文章代码,可以使用colaboratory进行运行,当然&#…

外挂程序:增强点及辅助

1.关于前几篇介绍的外挂程序,SAP中的业务单据还是要区分具体的操作人员。如建立财务凭证,工号A,B,C使用相同的SAP账号,那就没办法知道是谁操作的了啊,所以sap的业务单据需要细分到具体人员的都要增强实现以下: 如生产工单: 具体的增强点: 2.辅助程序:SAP账号自动锁定功…

从新手到专家必读书籍:官方推荐.NET技术体系架构指南

前言 Microsoft 官方推荐了一系列有关 .NET 体系结构的指南,旨在帮助开发人员掌握最新的技术和最佳实践。这些资源覆盖了从微服务架构到云原生应用开发等多个主题,是开发高质量 .NET 应用程序不可或缺的参考资料。 通过这些指南,可以深入了…

瑞幸x《黑神话》周边秒空,联名营销真的是流量密码吗?

​8月19日,瑞幸上线了与国产3A游戏《黑神话:悟空》合作的联名活动,其中包括黑神话腾云美式咖啡及周边产品。很多人为了抢到联名的周边,一大早就在瑞幸卡点下单,更有一些网友早上6点多就在瑞幸门口“蹲点”,…

会话跟踪方案:Cookie Session Token

什么是会话技术? Cookie 以登录为例,用户在浏览器中将账号密码输入并勾选自动登录,浏览器发送请求,请求头中设置Cookie:userName:张三 ,password:1234aa ,若登录成功,服务器将这个cookie保存…

河南萌新联赛2024第(六)场:郑州大学(补题ABCDFGIL)

文章目录 河南萌新联赛2024第(六)场:郑州大学A 装备二选一(一)简单介绍:思路:代码: B 百变吗喽简单介绍:思路:代码: C 16进制世界简单介绍&#x…

【时时三省】(C语言基础)指针进阶2

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 数组指针 是一种指针-是指向数组的指针 整型指针-是指向整形的指针 字符指针-是指向字符的指针 什么叫做数组指针 上面的整形指针跟字符指针只需要&am…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 一次开发,多端部署

一、学习目的 掌握鸿蒙的核心概念和端云一体化开发、数据、网络、媒体、并发、分布式、多设备协同等关键技术能力,具备独立设计和开发鸿蒙应用能力。 二、总体介绍 HarmonyOS 系统面向多终端提供了“一次开发,多端部署”(后文中简称为“一…

日志审计-graylog ssh登录超过6次告警

Apt 设备通过UDP收集日志,在gray创建接收端口192.168.0.187:1514 1、ssh登录失败次数大于5次 ssh日志级别默认为INFO级别,通过系统rsyslog模块处理,日志默认存储在/var/log/auth.log。 将日志转发到graylog vim /etc/rsyslog.conf 文件末…

深入探讨SD NAND的SD模式与SPI模式初始化

在嵌入式系统和存储解决方案中,SD NAND的广泛应用是显而易见的。CS创世推出的SD NAND支持SD模式和SPI模式,这两种模式在功能和实现上各有优劣。在本文中,我们将深入探讨这两种模式的初始化过程,并比较它们在不同应用场景下的优劣&…

MySQL 配置免密码登陆(mysql_config_editor Configuration)

当使用mysql, mysqldump, mysqladmin等客户端连接MySQL数据库服务器时,需要提供用户凭证信息。你可以在每次连接时都输入连接信息(用户名/密码/地址/端口等)或者将用户信息保存在my.cnf配置文件的[client]模块。 第一种方式每次都输入用户密…

深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)

VGG16模块的可视化 VGG16简介: VGG是继AlexNet之后的后起之秀,相对于AlexNet他有如下特点: 1,更深的层数!相对于仅有8层的AlexNet而言,VGG把层数增加到了16和19层。 2,更小的卷积核!…

数据库MySQL多表设计、查询

目录 1.概述 2.一对多 3.一对一 4.多对多 5.多表查询 5.1内连接 5.2外连接 5.3子查询 1.概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个…

网络编程TCP与UDP

TCP与UDP UDP头: 包括源端口、目的地端口、用户数据包长度,检验和 数据。 typedef struct _UDP_HEADER {unsigned short m_usSourPort;    // 源端口号16bitunsigned short m_usDestPort;    // 目的端口号16bitunsigned short m_usLen…

Docker!!!

⼀、Docker 1、Docker介绍.pdf 1、Docker 是什么? Docker 是⼀个开源的应⽤容器引擎,可以实现虚拟化,完全采⽤“沙盒”机制,容器之间不会存在任何接⼝。Docker 通过 Linux Container(容器)技术将任意类型…

Ubuntu 安装 mysql 与 远程连接配置

1、安装 mysql ubuntu 默认安装 8.0 版本: sudo apt install mysql-server安装过程中 提示 是否继续操作 y 即可 2、使用ubuntu 系统用户 root 直接进入 mysql 切换至 系统用户 su root 输入命令 可直接进入 mysql: mysql3、创建一个允许远程登录的用户 创建 …

《Python编程:从入门到实践》笔记(一)

一、字符串 1.修改字符串大小写 title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写,其他的改为小写。 upper()将字母都改为大写,lower()将字母都改为小写。 2.合并(拼接)字符串 Python使用加号()来合并字符串。这种合…

超容易出成果的方向:多模态医学图像处理!

哈喽朋友们,今天给大家推荐一个比较容易出成果的方向:多模态医学图像处理。 众所周知,多模态如今火的一塌糊涂,早就成了很多应用科学与AI结合的重要赛道,特别是在医学图像处理领域。 由此提出的多模态医学图像处理融合…