【Vue 快速入门系列】一文透彻vue中使用axios及跨域问题的解决

news2024/11/25 19:43:06

文章目录

  • 一、什么是Axios?
    • 1.前置知识
    • 2.vue中使用axios
    • 3.Axios两种请求方式
      • ①.调用接口
      • ②.传入对象
    • 3.Axios支持的请求类型
      • ①.get请求
      • ②.post请求
      • ③.put请求
      • ④.patch请求
      • ⑤.delete请求
  • 二、跨域问题解决方案
    • 1.什么是跨域问题?
    • 2.解决方案一:在Vue中进行配置
    • 3.解决方案二:使用Nginx转发
    • 4.解决方案三:后端配合
  • 三、项目中对Axios对象进行封装
    • 1.创建axios实例
    • 2.请求拦截器
    • 3.响应拦截器
    • 4.导入定制的axios并使用

一、什么是Axios?

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

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

1.前置知识

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
  • 主流及大众浏览器宽泛的支持
  • 配置简单、安装简便

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})
  }
)

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支持的请求类型。

3.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就行 

二、跨域问题解决方案

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.解决方案一:在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, //用于支持websocket
         changeOrigin: true //用于控制请求头中的host值
      }
    }
  }
})

3.解决方案二:使用Nginx转发

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

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

4.解决方案三:后端配合

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

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

三、项目中对Axios对象进行封装

项目中使用axios时,并不是直接使用其接口,通常会将其进行封装,对其功能进行定制。
以下实例就是对axios原有对象进行定制封装,然后实现自己的接口并调用

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,//请求等待时间 时间到了后台没有返回数据 请求中段
})

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.响应拦截器

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

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

最终将axios暴露出去

export default  install;

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.coloradmin.cn/o/90486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序的社区心理健康服务-计算机毕业设计

项目介绍 社区心理健康服务平台小程序采用java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户、咨询师三部分,管理员服务端:首页、个人中心、用户管理、咨询师管理、心理书籍管理、相关资源管理、试卷管理、试题管理、系统管理、订单管理&…

希沃 API 网关架构演进之路

网关往期迭代与痛点 希沃网关的发展经历了四个版本的迭代。2013 年公司开始尝试互联网业务,那时候采用了 OpenRestyNGINX 静态配置的方式搭建了最初的网关,开发人员通过 SCP 来发布。与此同时一个比较严重的问题就是,每次上线发布都需要运维…

喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”

近日,在“开源中国(OSCHINA)”开展的年度评选中,袋鼠云数栈技术团队凭借在2022年间的技术分享频率及质量、运营积极性等多方面的表现,荣获“2022年度优秀开源技术团队”的称号,这也是袋鼠云数栈技术团队连续…

umi学习总结

文章目录umi介绍umi是什么?umi的特性开发环境Node.js依赖管理工具目录结构路由配置路由页面跳转Link组件路由组件参数:路由动态参数query信息样式使用css样式dva为什么需要状态管理umi如何管理状态umi介绍 umi是什么? Umi,中文发…

自定义委托类

setItemDelegete();该函数可以自定义委托类 该例子为Qt官网的一个例子:使用QSpinBox来提供编辑功能 首先创建一个项目:名为object在项目中添加一个c类,类名为SpinBoxDelegate 修改该类的基类:更改为QImageDelegate,然后需要添加重…

12/15历史上的今天

宜找代驾 星期四 农历十一月廿二 今夜无人拥你入怀不如喝完杯中酒走入夜色中踏上回家的归途 *约翰-梅尔西藏墨脱公路嘎隆拉隧道顺利贯通 2010年12月15日,西藏墨脱公路控制性工程——嘎隆拉隧道顺利贯通。   2010年12月15日西藏墨脱公路控制性工程——嘎隆拉隧道…

华为开源自研AI框架昇思MindSpore应用实践:RNN实现情感分类

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、数据准备1.数据下载模块2.加载IMDB数据集2.加载预训练词向量三、数据集预处理四、模型构建1.Embedding2.RNN(循环神经网络)3.Dense4.损失函数与优化器5.训练逻辑6.评估指标和逻辑五、模型训练与保存六、模…

电脑重装系统后卡顿怎么办?教你快速解决电脑卡顿问题

​Win10电脑卡顿怎么办?许多用户在使用电脑的过程中发现,随着使用时间的增加,电脑会越来越卡顿。有些小伙伴就会选择重装电脑系统,那么我们在重装电脑之后要进行什么操作才能让电脑不卡顿呢? 操作方法: 优化…

java学生成绩管理系统源码swing(GUI) MySQL带开发教程永久学习

今天给大家演示一款由Java swing即GUI和mysql数据库实现的,学生成绩管理系统,系统采用了MVC的设计模式,结构层次非常清晰,此外,该项目有手把手的开发教程,适合刚入门Java的学生学习,下面我们来看…

Pr:导出设置

◆ ◆ ◆导出设置(媒体文件)Export Settings(Media File)基本设置文件名File Name指定导出的文件名。位置Location可以点击蓝色字更改导出的文件的存放位置。预设Preset选择导出预设。匹配源 Match Source预设会将大多数设置与源…

[附源码]Python计算机毕业设计高校贫困生信息管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Mysql 查询获取 为数字的 字符串

先看示例数据: test_value 字段 为 VARVCHAR 类型 数据样例: 包含 纯数字, 带小数点的数字, 字符串 获取里面的纯数字 :使用正则匹配 函数 REGEXP ,返回 1代表不匹配, 返回 0 代表匹配 包含小数点 [^0-…

两步开启研发团队专属ChatOps|极狐GitLab ChatOps 的设计与实践

本文来自: 彭亮 极狐(GitLab) 高级产品经理 郭旭东 极狐(GitLab) 资深创新架构师 舒文斌 极狐(GitLab) 高级网站可靠性工程师 最近几天,ChatGPT 真是杀疯了 ! 相信大家的朋友圈,已经被调戏、询问或探讨 ChatGPT 的贴子刷屏。 看到…

虹科案例 | 风电机组的预测性维护应该如何进行?

虹科预测性维护方案 在风能领域的应用 虹科案例 01 应用背景 风能是最重要的清洁能源之一,大力发展风电等清洁能源是实现国家可持续发展战略的必然选择。发展风电、光伏等新能源的高效运维技术已成为当前电力系统面临的重要问题之一。在风电机组单机容量较大、机组…

在Azure上设置存储账户

目录 (一)前言 (二)正文 1. 搜索存储账户类型资源 2. 开始创建新存储账户 (1)基本信息 (2)高级选项 (3)网络配置 (4)数据保护…

怎么看电脑是32位还是64位?2个方法,快速查看

熟悉计算机操作系统的朋友应该知道,电脑系统分为32位和64位。不同系统位数的兼容软件也会有所不同。怎么看电脑是32位还是64位?这里小编分享2个方法,快速查看自己的电脑系统位数。 方法一:电脑属性查看法 很多小伙伴不知道怎么看…

特殊符号——双引号和单引号

特殊符号——双引号和单引号一.通常理解二.一般使用三.特殊使用四.为何计算机需要字符一.通常理解 在c语言中,我们通常认为双引号保存的是字符串,单引号里保存的是字符。这里也没什么好说的,说一说它们的细微的一些地方 二.一般使用 接下来我…

图为科技与深圳人工智能产业协会联合发布边缘计算机概念

2022年12月13日由图为信息科技(深圳)有限公司联合深圳市人工智能产业协会举办的“边缘计算机发布会”在深圳市龙岗区大运AI小镇举行。 随着5G、物联网、人工智能等技术的规模应用和持续进步,边缘计算市场进入蓬勃发展期。我国在《…

罗克韦尔(AB)PLC远程维护连接不上网关怎么办?

对很多使用罗克韦尔(AB)PLC的工厂来说,PLC具备成熟系统和稳定性能等特点,可以适应厂内设备的控制指令,需要细心保养,认真维护。随着无线通信技术和物联网技术的发展,PLC的数据上云进行云端监控和…

过两年 JVM 可能就要被它替代了

今天说一说 GraalVM。 GraalVM 是 Oracle 大力发展和想要推广的新一代 JVM ,目前很多框架都已经渐渐支持 GraalVM 了,比如我们在用的 Spring 也已经推出了对 GraalVM 兼容的工具包了。 既然说的这么厉害,那么它到底是何方神圣呢。 GraalVM…