Vue使用axios、解决axios跨域

2023-11-04

axios

axios文档

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF
    看起来就很高大上,就决定是它了;但用起来脑子石化,一脸黑人问号,经脉逆流…但是惹不起还是得惹,毕竟它非常流行
axios使用处理错误的写法
  1. 一个不建议的处理发生错误的代码
	axios.get(url)
    .then(response => {
        console.log(response);
    }, error => {
        console.log(error);
    })

这不是处理catch的相关,是关于new Promise()的then,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
2. catch是处理逻辑或接口出错

axios.get(url)
.then(res=>{
//处理业务逻辑
})
.catch(err=>{

})
  1. catch的分步骤处理
    if (error.response) {
// 请求已发出,但服务器响应的状态码不在 2xx 范围内
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // 有请求但未收到响应
      console.log(error.request);
    } else {
      // 在发生请求时触发的错误
      console.log('Error', error.message);
    }
    console.log(error.config);

vue cli 2使用axios

  1. 安装脚手架
cnpm install -g @vue/cli-service-global
  1. 现在是vue cli 3,所以我们需要全局安装一个桥接工具
cnpm install -g @vue/cli-init
  1. 可以自主选择,根据自己需求,这里选择默认的,然后下载包,最后更改App.vue的内容
vue init webpack axios_test
cnpm i 
  1. 下载axios
cnpm i axios -S
  1. 提供接口:这里使用某度音乐做测试接口
http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0
  1. 在main.js导入并配置
import Axios from 'axios'
Vue.prototype.$axios  = Axios
  1. App.vue测试
export default {
  mounted(){
    this.$axios.get('http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0')
    .then(result=>{
      console.log(result)
    })
    .catch(error=>{
      console.log(error)
    })
  }
};
  1. 运行项目
cnpm run dev

我用铜钱算出来你报了一下的错误;这是因为浏览器的同源政策

Access to XMLHttpRequest at 'http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
解决跨域

我们先来实现解决跨域在解释(1.2是实现解决禁止跨域的)

  1. 在main.js加入HOST
Vue.prototype.$axios  = Axios
Vue.prototype.HOST = '/baidu_music_api'
  1. 在配置文件config文件夹的index.js里面配置,在里面有个proxyTable配置
    proxyTable: {
      "/baidu_music_api": {
        target: "http://tingapi.ting.baidu.com",
        changeOrigin: true,
        pathRewrite: {
            '^/baidu_music_api': '/v1/restserver/ting'
        }
    }
    },
  1. 重新再App.vue发送请求
  mounted(){
    let url = this.HOST + '?method=baidu.ting.billboard.billList&type=1&size=10&offset=0'
    this.$axios.get(url)
    .then(result=>{
      console.log(result)
    })
    .catch(error=>{
      console.log(error)
    })
  1. 配置文件的解释
    proxyTable在使用webpack做构建工具的项目中使用proxyTable代理实现跨域是一种比较方便的选择。
    target目标接口域名
    changeOrigin是否跨域
    pathRewrite是重写接口,如果没有包含该项目名或则字段(/v1/restserver/ting)的话,我们可以直接写’/'来代替

比如大部分接口有’api’,我们配置的时候时候可以直接(这里跟我们当前接口使用的无关)

proxyTable: {
    '/api': {
      target: 'http://www.csdn.com',  //目标接口域名
      changeOrigin: true,  //是否跨域
      pathRewrite: {
        '^/api': '/api'   //重写接口
        //没有api
        // '^api':'/'
      }
    },
  1. 原理解释
'http://localhost:8080/baidu_music_api' ===> 'http://tingapi.ting.baidu.com/v1/restserver/ting'
本地服务器 --》 代理 --》目标服务器 --》拿到数据后通过代理伪装成本地服务请求的返回值 ---》然后浏览器就顺利收到了我们想要的数据

也就是说我们访问,会重写服务器http://tingapi.ting.baidu.com,baidu_music_api就会解析成v1/restserver/ting;有人说可以理解为服务器是没有同源政策的。
6. 接下来可以看一下我们返回的数据,直接截图
在这里插入图片描述
以下响应结构的信息;所以我们的数据都要在data里面获取

{
  // `data` 由服务器提供的响应
  data: {},
  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,
  // `statusText` 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',
  // `headers` 服务器响应的头
  headers: {},
  // `config` 是为请求提供的配置信息
  config: {}
}
  1. 添加拦截器
    页面发送http请求,很多情况我们要对请求和其响应进行特定的处理;如果请求数非常多,单独对每一个请求进行处理会变得非常麻烦,程序的优雅性也会大打折扣。axios为开发者提供了这样一个API:拦截器。拦截器分为 请求(request)拦截器和 响应(response)拦截器。
    应用场景:路由拦截、统一处理所有的http请求和响应、refresh_token换access_token
Vue.prototype.HOST = '/baidu_music_api'
// 添加请求拦截器
Axios.interceptors.request.use(function (config) {
    if(config.method === "post"){
      config.data = qs.stringify(config.data)
    }
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
Axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

vue cli3使用

vue cli参考配置vue.config.js的devServer配置
可以自主配置(空格是选中),也可以直接选择默认

vue create axios_vue3
  1. 项目根目录下新建vue.config.js
    vue.config.js 是一个可选的配置文件,如果项目的 (和 package.json 同级的) 根目录中存在这个文件,那么它会被 @vue/cli-service 自动加载。
  2. 接着在main.js的文档里面配置(先安装axios)
import Axios from 'axios'
Vue.prototype.$axios  = Axios
Vue.prototype.HOST = '/api'
  1. 在vue.config.js里面配置
module.exports = {
devServer: {
    proxy: {
      '/api': {
        target: 'http://tingapi.ting.baidu.com/v1/restserver/ting',
        ws: true,
        changeOrigin: true
      }
    }
  }
}
  1. 测试axios
  mounted(){
   let url = this.HOST + '?method=baidu.ting.billboard.billList&type=1&size=10&offset=0'
   this.$axios.get(url).then(result=>{
    console.log(result)
   })
  }

结果

直接使用webpack,没有使用脚手架的,看看这个能否解决

https://webpack.js.org/configuration/dev-server/#devserverproxy
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue使用axios、解决axios跨域 的相关文章

  • JavaScript:解决意外字符“#”

    介绍 我的 React 应用程序可以执行npm run build在开发模式下 webpack config dev js 但不在生产模式下 webpack config prod js 抛出以下错误 Module parse failed
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • Webpack 在 Angular 的 ng 服务中的作用

    我是 Angular 的新手 想知道当我们为应用程序提供服务时 Webpack 在幕后扮演什么角色 在最初的印象中 我开始知道 webpack 是一个构建和打包工具 它将所有必需的 JS 文件分组到单独的包中 然而 我无法找到 webpac
  • 无法在 .tsx 文件中导入 CSS 模块

    我正在使用 typescript 构建基本的 React 应用程序 但无法导入 CSS 文件索引 tsx file 我能够导入索引 css文件如下 import index css this import gives typescript
  • Webpack 子编译器更改配置

    我希望在编译我的服务工作人员时将我的 webpack 构建的输出定义为变量 我想使用子编译功能来编译放入不同路径的服务工作人员 我需要 webpack 编译发出的输出来正确编译服务工作线程 我最初的做法是使用与离线插件相同的策略 在其中创建
  • 将 sass 变量导入 gatsby 组件中引用的第二个 Sass 文件

    我正在使用 Gatsby 构建一个静态站点项目 我已经成功安装了 gatsby sass 插件并让 sass 正常工作 但是 我无法将自定义 sass 变量文件正确导入到其他组件 sass 文件中 下面是我的文件夹结构 src compon
  • axios post请求react-native中出现网络错误

    这是我通过 axios post 请求检查身份验证的方法 CheckAuth let obj username email protected cdn cgi l email protection password zzxxz oauth
  • 限制 Axios 请求

    我正在使用 axios 向 Deezer API 发出请求 不幸的是 使用 Deezer 的 API 当您请求艺术家的专辑时 它不包括专辑曲目 因此 我正在通过请求艺术家的专辑 然后对每个专辑执行后续的 axios 请求来解决这个问题 我遇
  • React JS 服务器端问题 - 找不到窗口

    你好 我正在尝试在我的reactJS项目中使用react rte 我有服务器端渲染 每次我想使用这个包时 我都会得到 return msie 6 9 b test window navigator userAgent toLowerCase
  • webpack中动态加载外部模块失败

    我正在尝试建立以下架构 一个核心 React 应用程序 它具有一些基本功能 并且能够在运行时加载其他 React 组件 这些额外的 React 组件可以按需加载 并且它们在构建核心应用程序时不可用 因此它们不能包含在核心应用程序的捆绑包中
  • 如何在 webpack 中渲染嵌套的 SASS?

    采取以下CSS MyComponent color blue Button color red 以及以下 React 组件 import React from react import classes from MyComponent sc
  • TypeScript 编译速度极慢 > 12 秒

    只是把它放在那里看看其他人是否也遇到这个问题 我已经使用 webpack 作为我的构建工具 使用 typescript 构建了一个 Angular 2 应用程序 一切都运行良好 但是我注意到 typescript 编译超级超级慢 我现在只有
  • 如何将 .env 文件变量传递给 webpack 配置?

    我是 webpack 的新手 几乎完成了所有构建部分 但现在的问题是我想将环境变量从 env 文件传递 到 webpack 配置 以便我可以通过以下方式将该变量传递到我的构建文件webpack DefinePlugin plugin 目前我
  • 无法在 typeScript 和 Webpack 中使用 p5.js

    我有一个使用图书馆的项目p5 js https github com processing p5 js Details 我的 Webpack 配置是 const path require path module exports entry
  • 在 Vue SFC 组件中导入 SCSS 文件,无需使用 Webpack 进行重复

    当我尝试访问所有 Vue SFC 中的 scss 文件时 样式会重复 导致大型 css 包和开发工具在样式调试时崩溃 我正在使用 Webpack 4 和 webpack dev server 来构建和运行具有热重载的开发服务 我没有使用 V
  • 从在不同端口运行的 Vue 应用程序调用 Node Express 服务器 API

    我最近开始学习 vue js 并且目前使用 vue jsvue 简单 webpack https github com vuejs templates webpack simpletemplate express 和 mongo 来开发一个
  • 压缩 webpack 插件

    我正在尝试弄清楚如何正确使用webpack html 插件与压缩插件 后者的文档有点匮乏 我的 webpack 配置声明 output filename js name hash js 最后运行压缩插件 new CompressionPlu
  • Gatsby/webpack - WebpackError 窗口未定义 - 在哪里?

    运行 gatsby build 时 出现以下错误 我知道如何修复它 例如检查窗口的 typedef 但我找不到该窗口的用法 我怎么知道它在哪里 我怀疑节点模块 因为我自己的代码中没有很多窗口引用 多谢 failed Building sta
  • Bootstrap 4 Beta 使用 Webpack 3.x 导入 Popper.js 会抛出 Popper 不是构造函数

    So Bootstrap 4 Beta出来了 耶 然而 Tether 已被取代Popper js用于工具提示 和其他功能 我看到控制台中抛出一个错误 速度足够快 足以建议我进行更改Popper js Bootstrap dropdown r
  • 如何让 webpack 和 iis express 协同工作?

    I have Angular 2 和 Webpack 2 入门 https github com qdouble angular webpack2 starter它通过 webpack dev server 在节点上运行 我如何使用 web

随机推荐

  • 继电器控制电路原理解析说明

    继电器驱动电流一般需要20 40mA或更大才能使继电器吸合 继电器的线圈电阻100 200欧姆 因此必须进行扩流 即驱动 图1 21所示为用NPN型三极管驱动继电器的电路图 图中阴影部分为继电器电路 继电器线圈作为集电极负载而接到集电极和正
  • 【软件测试】(四)测试用例怎么写

    文章目录 测试用例基本要素 1 评价好的测试用例的标准 2 根据需求写测试用例 3 测试用例的设计方法 3 1 基于需求进行测试用例的设计 3 2 具体的设计用例的方法 3 2 1 等价类 3 2 2 边界值 3 2 3 错误猜测法 3 2
  • php不可见字符,php怎么处理不可见字符

    php处理不可见字符的方法 首先创建一个PHP文件 然后定义一个filterNonPrintableChar方法 接着在方法体内通过while语句实现过滤不可见字符的功能逻辑 最后运行该文件即可 php过滤不可见字符 编码知识 ASCII码
  • waitpid的作用

    waitpid的使用 waitpid用于等待特定的进程结束之后 主进程再继续执行 这时主进程会进入阻塞状态 在fork之后 如果子进程不使用waitpid 则可能时主进程先结束 也可能时子进程先结束 子进程 include
  • Spring核心概念

    BeanDefinition BeanDefinition表示Bean定义 BeanDefinition中存在很多属性用来描述一个Bean的特点 比如 class 表示Bean类型 scope 表示Bean作用域 单例或原型等 lazyIn
  • python3 leecode之快乐数

    题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果 可以变为 1 那么这个数就是快乐
  • 05-Mysql夺命三连问:什么是索引下推?什么是索引覆盖?什么是回表?【Java面试总结】

    Mysql夺命三连问 什么是索引下推 什么是索引覆盖 什么是回表 索引下推是mysql5 6 提出的一个查询优化方案 主要的目的是减少数据或查询中不必要的读取和计算 它的原理是将查询条件尽可能的推送到索引层面进行过滤 减少从磁盘读取的数据量
  • Win10报错! 由于找不到hhctrl.ocx win10运行帮助时hhctrl.ocx缺失的解决方法

    hhctrl ocx下载地址 1 到网上下载hhctrl ocx 然后将下载的ocx文件复制到C Windows System32目录下 Win7 Vista系统的路径是一样的 64位放到C Windows SysWOW64 2 开始 菜单
  • 使用OpenCV对物体搜索检测与识别

    在本教程中 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 并输出该图像中存在的对象的类标签和类概率 例如 类
  • vue3 - setup之defineEmits

    基础形式 子组件 const emits defineEmits name 触发emits事件 const eventButton gt emits name 父组件
  • 第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容

    一 引言 在 第14 10节 Python中使用BeautifulSoup解析http报文 html标签相关属性的访问 介绍了BeautifulSoup对象的主要属性 通过这些属性可以访问标签 内容 但这种方法要么就只能访问符合条件的第一个
  • robot framework 使用三:浏览器兼容性自动化

    robot framework 测试浏览器兼容性 上图中黄色圈的地方默认什么都不写 是firefox浏览器 写上ie就是ie浏览器了 firefox最新版本就行 ie需要设置 1 IE选项设置的安全页中 4个区域的启用保护模式的勾选都勾上
  • git commit遇到的问题:error: pathspec ‘xxx‘ did not match any file(s) known to git

    问题 git commit 时出现报错 error pathspec xxx did not match any file s known to git 原因 未知 可以看下其他人的答案 查询其他人的说法 远程分支与本地分支没有建立连接等
  • C++中的类模板(黑马程序员)

    目录 类模板 类模板 1 1 类模板语法 1 2 类模板与函数模板区别 1 3 类模板中成员函数创建时机 1 4 类模板对象做函数参数 主要了解类模板实例化出的对象后 如何向函数传参 1 5 类模板与继承 1 6 类模板成员函数类外实现 1
  • 使用GetOpenFileName创建“选择文件”对话框

    GetOpenFileName用于创建一个打开文件对话框 存在于头文件commdlg h 原型 BOOL WINAPI GetOpenFileName Inout LPOPENFILENAME lpofn lpofn为一个指向OPENFIL
  • MySQL JDBC URL中几个重要参数说明

    jdbc mysql host port host port database 参数名1 参数值1 参数名2 参数值2 参数名称 参数说明 缺省值 最低版本要求 user 数据库用户名 用于连接数据库 所有版本 password 用户密码
  • tensorflow中如何average checkpoint

    首先获取checkpoint的状态以及每个参数的值 ckpt state tf train get checkpoint state model dir ckpts ckpt state all model checkpoint paths
  • java - 面向对象程序的三大特性 封装、继承、多态

    目录 1 封装 1 1访问限定符 1 2包 1 3导入包中的类 1 4如何自定义包 1 5 包的访问权限控制举例 1 6 常见的包 1 7如果修改封装好的成员变量 2 继承 什么继承 子类中访问父类成员变量 子类和父类不存在同名成员变量 子
  • windows电脑文件传输至ipad/iphone

    前言 个人分享而已 好坏对错与否勿喷 介意就别看 文明上网 tips1 本方法适用于稍微有点计算机基础的伙伴们 tips2 本方法需要你的电脑上已经安装并配置好了python 只要你电脑可以进行python代码程序运行就是ok的 tip3
  • Vue使用axios、解决axios跨域

    axios axios文档 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端 从浏览器中创建 XMLHttpRequests 从 node js 创建 http 请求 支持 Promise API 拦截