入门 - 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, //用于支持websocket
         changeOrigin: 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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库,它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域,是 Python 中最著名的绘图库之一。 同样matplotlib的安…

golang实现一个简单的rpc框架

前言 RPC在分布式系统中经常使用,这里写一个简单的demo实践一下。 code 先生成 go.mod 文件 go mod init rpc-try01定义方法 package model// Args 是 RPC 方法的参数结构体 type Args struct {A, B int }// Arith 定义了一个简单的算术服务 type Arith struct{…

:class的用法及应用

参考小满视频 在同一个标签中&#xff0c;class只能有一个&#xff0c;:class也只能有一个 :class的用法 1. :class “非响应式的变量”&#xff08;一般不使用&#xff0c;和写死了一样&#xff09; const a "style1" <span :class"a"></spa…

python-逆序数(赛氪OJ)

[题目描述] 在一个排列中&#xff0c;如果一对数的前后位置与大小顺序相反&#xff0c;即前面的数大于后面的数&#xff0c;那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列&#xff0c;其元素为 2,4,3,1&#xff0c;则 (2,…

Stable Diffusion 使用详解(8)--- layer diffsuion

背景 layer diffusion 重点在 layer&#xff0c;顾名思义&#xff0c;就是分图层的概念&#xff0c;用过ps 的朋友再熟悉不过了。没使用过的&#xff0c;也没关系&#xff0c;其实很简单&#xff0c;本质就是各图层自身的编辑不会影响其他图层&#xff0c;这好比OS中运行了很多…

使用 Python构建 Windows 进程管理器应用程序

在这篇博客中&#xff0c;我们将探讨如何使用 wxPython 构建一个简单的 Windows 进程管理器应用程序。这个应用程序允许用户列出当前系统上的所有进程&#xff0c;选择和终止进程&#xff0c;并将特定进程保存到文件中以供将来加载。 C:\pythoncode\new\manageprocess.py 全部…

RabbitMQ实现多线程处理接收消息

前言&#xff1a;在使用RabbitListener注解来指定消费方法的时候&#xff0c;默认情况是单线程去监听队列&#xff0c;但是这个如果在高并发的场景中会出现很多个任务&#xff0c;但是每次只消费一个消息&#xff0c;就会很缓慢。单线程处理消息容易引起消息处理缓慢&#xff0…

推荐算法实战-五-召回(上)

一、传统召回算法 &#xff08;一&#xff09;基于物料属性的倒排索引 在离线时&#xff0c;将具有相同属性的物料集合起来&#xff0c;根据一些后验统计指标将物料排序。 当一个用户在线交互发出请求后&#xff0c;提取用户的兴趣标签&#xff0c;根据标签检索相应物料集合…

直方图均衡化

概念 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法&#xff0c;通过拉伸像素强度分布范围来增强图像对比度。 原理 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布)&#xff0c;从而令强度值分布会在整个范围内…

CSS知识点详解:div盒子模型

盒子模型&#xff1a; 边框&#xff1a; border-color&#xff1a;边框颜色 border-width&#xff1a;边框粗细 1.thin 2.medium 3.thick 4.像素值 border-width:5px ; border-width:20px 2px; border-width:5px 1px 6px; border-width:1px 3px 5px 2px; 这个简写属性…

Java二十三种设计模式-责任链模式(17/23)

责任链模式&#xff1a;实现请求处理的灵活流转 引言 在这篇博客中&#xff0c;我们深入探讨了责任链模式的精髓&#xff0c;从其定义和用途到实现方法&#xff0c;再到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;旨在指导开发者如何…

基于springboot框架的电影订票系统_wqc3k

TOC springboot611基于springboot框架的电影订票系统_wqc3k--论文 绪 论 1.1研究背景和意义 随着科学技术的不断发展&#xff0c;计算机现在已经成为了社会的必需品&#xff0c;人们通过网络可以获得海量的信息&#xff0c;这些信息可以和各行各业进行关联&#xff0c;电影…

Selenium + Python 自动化测试22(PO+数据驱动)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式和unittest框架结合起来使用。 本篇文章我们综合一下之前学习的内容&#xff0c;如先将PO模式、数据驱动思想和我们生成HTML报告融合起来&#xff0c;综…

如何应对突发技术故障和危机:开发团队的应急策略

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性对于企业至关重要。然而&#xff0c;即使是大型平台&#xff0c;如网易云音乐&#xff0c;也可能遇到突发的技术故障。网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常…

如何生成随机数(通过rand函数,srand函数,time函数深入讲解)

目录 1. 随机数的生成 2. srand函数 3. time函数 4. 设置随机数的范围 1. 随机数的生成 既然是猜数字游戏&#xff0c;那么最终的数字答案肯定是重要的&#xff0c;我们要如何实现这个随机数的生成呢&#xff1f; 在这个功能上&#xff0c;C语言提供了一个函数叫rand&…

数据库多表设计:深入理解一对多、一对一、多对多关系 【后端 12】

数据库多表设计&#xff1a;深入理解一对多、一对一、多对多关系 在数据库设计中&#xff0c;表之间的关系决定了如何组织和存储数据。常见的表关系包括一对多、一对一和多对多。在不同的业务场景下&#xff0c;我们会选择不同的关系模式进行数据库设计。本文将通过具体案例介绍…

Excel技巧(一)

快捷键技巧 原文链接 选取某一行的数据直到最后一行&#xff1a;【CTRL SHIFT ↓ 】或者选取一行后按住SHIFT键&#xff0c;双击下边线就可以快速选取区域。 如果表格中有多行空行&#xff0c;可以先按CTRL SHIFT END&#xff0c;再按CTRL SHIFT 上下键调整&#xff0c;…

网络安全之xss靶场练习

目录 一、xss靶场练习 1、Ma Spaghet! 2、Jefff 第一个方法 第二个方法 3、Ugandan Knuckles 4、Ricardo Milos 5、Ah Thats Hawt 6、Ligma 7、Mafia​编辑 8、Ok, Boomer 一、xss靶场练习 靶场地址 https://xss.pwnfunction.com/ 页面显示如下 1、Ma Spaghet! 分析…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…

CSS“叠叠乐”——WEB开发系列16

在现代前端开发中&#xff0c;CSS 是控制网页外观和布局的核心工具。随着项目的复杂化和样式规则的增加&#xff0c;CSS 层叠&#xff08;cascade&#xff09;变得更加重要。为了更好地管理和控制样式规则的应用&#xff0c;CSS 引入了层叠层&#xff08;cascade layers&#x…