博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
axios的坑
阅读量:6479 次
发布时间:2019-06-23

本文共 3110 字,大约阅读时间需要 10 分钟。

1.axios发送请求不携带coock

发现发送的请求中没有自动携带cookie(jQuery是会自己带上的)
所以要手动发送coock
axios.defaults.withCredentials = true

2.小小的提一下vue cli脚手架前端调后端数据接口时候的本地代理跨域问题,如我在本地localhost访问接口http://40.00.100.100:3002/是要跨域的,相当于浏览器设置了一到门槛,会报错XMLHTTPRequest can not load . Response to preflight request doesn’t pass access control….

为什么跨域同源非同源自己去查吧,在webpack配置一下proxyTable就OK了,如下
config/index.js

dev: {    加入以下    proxyTable: {      '/api': {        target: 'http://40.00.100.100:3002/',//设置你调用的接口域名和端口号 别忘了加http        changeOrigin: true,        pathRewrite: {          '^/api': '/'//这里理解成用‘/api’代替target里面的地址,后面组件中我们掉接口时直接用api代替 比如我要调用'http://40.00.100.100:3002/user/add',直接写‘/api/user/add’即可        }      }    },试一下,跨域成功了,但是注意了,这只是开发环境(dev)中解决了跨域问题,生产环境中真正部署到服务器上如果是非同源还是存在跨域问题,如我们部署的服务器端口是3001,需要前后端联调,第一步前端我们可以分生产production和开发development两种环境分别测试,在config/dev.env.js和prod.env.js里也就是开发/生产环境下分别配置一下请求的地址API_HOST,开发环境中我们用上面配置的代理地址api,生产环境下用正常的接口地址,所以这样配置module.exports = merge(prodEnv, {  NODE_ENV: '"development"',//开发环境  API_HOST:"/api/"})module.exports = {  NODE_ENV: '"production"',//生产环境  API_HOST:'"http://40.00.100.100:3002/"'}当然不管是开发还是生产环境都可以直接请求http://40.00.100.100:3002/。配置好之后测试时程序会自动判断当前是开发还是生产环境,然后自动匹配API_HOST,我们在任何组件里都能用process.env.API_HOST来使用地址如instance.post(process.env.API_HOST+'user/login', this.form)1然后第二步后端服务器配置一下cros跨域即可,就是access-control-allow-origin:*允许所有访问的意思。综上:开发的环境下我们前端可以自己配置个proxy代理就能跨域了,真正的生产环境下还需要后端的配合的。某大神说:此方法ie9及以下不好使,如果需要兼容,最好的办法是后端在服务器端口加个代理,效果类似开发时webpack的代理。3、axios发送get post请求问题 发送post请求时一般都要设置Content-Type,发送内容的类型,application/json指发送json对象但是要提前stringify一下。application/xxxx-form指发送?a=b&c=d格式,可以用qs的方法格式化一下,qs在安装axios后会自动安装,只需要组件里import一下即可。const postData=JSON.stringify(this.formCustomer);'Content-Type':'application/json'}const postData=Qs.stringify(this.formCustomer);//过滤成?&=格式'Content-Type':'application/xxxx-form'}4.axios拦截器的使用 当我们访问某个地址页面时,有时会要求我们重新登录后再访问该页面,也就是身份认证失效了,如token丢失了,或者是token依然存在本地,但是却失效了,所以单单判断本地有没有token值不能解决问题。此时请求时服务器返回的是401错误,授权出错,也就是没有权利访问该页面。 我们可以在发送所有请求之前和操作服务器响应数据之前对这种情况过滤。// http request 请求拦截器,有token值则配置上token值axios.interceptors.request.use(    config => {        if (token) {  // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了            config.headers.Authorization = token;        }        return config;    },    err => {        return Promise.reject(err);    });// http response 服务器响应拦截器,这里拦截401错误,并重新跳入登页重新获取tokenaxios.interceptors.response.use(    response => {        return response;    },    error => {        if (error.response) {            switch (error.response.status) {                case 401:                    // 这里写清除token的代码                    router.replace({                        path: 'login',                        query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面                    })            }        }        return Promise.reject(error.response.data)     });

5.首先axios不支持vue.use()方式声明使用,看了所有近乎相同的axios文档都没有提到这一点

建议方式 将axios挂载到Vue原型上 或者windwo原型上
在main.js中如下声明使用
import axios from 'axios';
Vue.prototype.$axios=axios;
那么在其他vue组件中就可以this.$axios调用使用

转载于:https://www.cnblogs.com/myheimastudy/p/9910433.html

你可能感兴趣的文章
css 3D transform变换
查看>>
ele表格合并行之后的selection选中
查看>>
正则表达式分解剖析(一文悟透正则表达式)
查看>>
解决UILable标点符号居中的问题
查看>>
HTML5新特性教程
查看>>
ImageOptim-无损图片压缩Mac版
查看>>
12 Go语言map底层浅析
查看>>
vue-resumer 项目中 element-ui 遇到的 textarea autosize 问题
查看>>
以主干开发作为持续交付的基础
查看>>
PHP扩展库PEAR被攻击,近半年下载者或被影响
查看>>
传统运维团队转型应该注意哪些问题?
查看>>
JavaScript函数(二)
查看>>
Airbnb改进部署管道安全性,规范部署顺序
查看>>
腾讯最大规模裁撤中层干部,让贤年轻人
查看>>
当我们谈性能的时候,我们实际上在谈什么?
查看>>
蔡超:入门 Go 语言必须跨越的五个思维误区
查看>>
使用Akka Actor和Java 8构建反应式应用
查看>>
curl常用命令详解
查看>>
saltstack 添加计划任务
查看>>
Puppet module命令参数介绍(六)
查看>>