axios把post的RequestPayload格式转为formdata

方法一:配置transformRequest,缺点:其他请求格式的数据也会被重新格式化(PUT,PATCH)

const service = axios.create({//设置axios为form-data 方法1// headers: {//     post: {//         "Content-Type": "application/x-www-form-urlencoded"//     },//     get: {//         "Content-Type": "application/x-www-form-urlencoded"//     }// },transformRequest: [function (data) {let request = ''for (let item in data) {if (data[item])request += encodeURIComponent(item) + '=' + encodeURIComponent(data[item]) + '&'}return request.slice(0, request.length - 1)}]
})

方法二:添加请求拦截器,对症下药(推荐),所有主要浏览器都支持 encodeURIComponent() 函数

//添加请求拦截器
service.interceptors.request.use(config => {//设置axios为form-data 方法2if (config.method === 'post') {let data = ''for (let item in config.data) {if (config.data[item])data += encodeURIComponent(item) + '=' + encodeURIComponent(config.data[item]) + '&'}config.data = data.slice(0, data.length - 1)}return config;},error => {console.log("在request拦截器显示错误:", error.response)return Promise.reject(error);}
);

方法三:添加请求拦截器,使用axios 插件qs转换,可能存在兼容性问题

import qs from 'qs';
//添加请求拦截器
service.interceptors.request.use(config => {//设置axios为form-data 方法2if (config.method === 'post') {config.data = qs.stringify(config.data); // npm install axios qs --save}return config;},error => {console.log("在request拦截器显示错误:", error.response)return Promise.reject(error);}
);

完整代码:

import axios from 'axios'
import store from '@/store'
import router from '@/router'
import Vue from "vue";
// import qs from 'qs';
let vue = new Vue()// create an axios instance
const service = axios.create({// index.js设置了代理(解决跨域) api = XXXbaseURL: "/api", // url = base url + request urltimeout: 5000, // request timeout// headers: {//     Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",//     Cookie: "JSESSIONID=8F611FDFEBA4FA2A1891D5929F5E8682",//     "Upgrade-Insecure-Requests": 1,//     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"// }//设置axios为form-data 方法1// headers: {//     post: {//         "Content-Type": "application/x-www-form-urlencoded"//     },//     get: {//         "Content-Type": "application/x-www-form-urlencoded"//     }// },// transformRequest: [function (data) {//     let request = ''//     for (let item in data) {//         if (data[item])//             request += encodeURIComponent(item) + '=' + encodeURIComponent(data[item]) + '&'//     }//     return request.slice(0, request.length - 1)// }]
})//添加请求拦截器,若token存在则在请求头中加token,不存在也继续请求
service.interceptors.request.use(config => {// 每次发送请求之前检测都vuex存有token,那么都要放在请求头发送给服务器,没有则不带token// Authorization是必须的// if (store.getters.getToken) {//     config.headers.Authorization = store.getters.getToken;// }vue.$Loading.start()//设置axios为form-data 方法2if (config.method === 'post') {// config.data = qs.stringify(config.data); // npm install axios qs --savelet data = ''for (let item in config.data) {if (config.data[item])data += encodeURIComponent(item) + '=' + encodeURIComponent(config.data[item]) + '&'}config.data = data.slice(0, data.length - 1)}return config;},error => {console.log("在request拦截器显示错误:", error.response)vue.$Loading.error()return Promise.reject(error);}
);//respone拦截器
service.interceptors.response.use(response => {vue.$Loading.finish();// 在status正确的情况下,code不正确则返回对应的错误信息(后台自定义为200是正确,并且将错误信息写在message),正确则返回响应return response.data;},error => {vue.$Loading.error()// 在status不正确的情况下,判别status状态码给出对应响应if (error.response) {console.log("在respone拦截器显示错误:", error.response)switch (error.response.status) {case 401://可能是token过期,清除它store.commit("delToken");router.replace({ //跳转到登录页面path: '/login',// 将跳转的路由path作为参数,登录成功后跳转到该路由query: { redirect: router.currentRoute.fullPath }});}}return Promise.reject(error.response);}
);export default service// axios({
//     url:'/user',                            //  `url`是服务器链接,用来请求用
//     method:`get`,                           //  `method`是发起请求时的请求方法
//     baseURL:'http://some-domain.com/api/',  //  `baseURL`如果`url`不是绝对地址,那么将会加在其前面。当axios使用相对地址时这个设置非常方便//     transformRequest:[function(data){       //  `transformRequest`允许请求的数据在传到服务器之前进行转化。只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法。数组中的最后一个函数必须返回一个字符串,一个`ArrayBuffer`,或者`Stream`
//         //依自己的需求对请求数据进行处理
//         return data;
//     }],
//     transformResponse:[function(data){      //  `transformResponse`允许返回的数据传入then/catch之前进行处理
//         //依需要对数据进行处理
//         return data;
//     }],  
//     headers:{'X-Requested-with':'XMLHttpRequest'},//`headers`是自定义的要被发送的头信息
//     params:{ //`params`是请求连接中的请求参数,必须是一个纯对象,或者URLSearchParams对象
//         ID:12345
//     },
//     paramsSerializer: function(params){//`paramsSerializer`是一个可选的函数,是用来序列化参数,例如:(https://ww.npmjs.com/package/qs,http://api.jquery.com/jquery.param/)
//         return Qs.stringify(params,{arrayFormat:'brackets'})
//     },
//     data:{//`data`是请求提需要设置的数据,只适用于应用的'PUT','POST','PATCH',请求方法。当没有设置`transformRequest`时,必须是以下其中之一的类型(不可重复?):-string,plain object,ArrayBuffer,ArrayBufferView,URLSearchParams。仅浏览器:FormData,File,Blob。仅Node:Stream
//         firstName:'fred'
//     },
//     //`timeout`定义请求的时间,单位是毫秒。
//     //如果请求的时间超过这个设定时间,请求将会停止。
//     timeout:1000,
//     //`withCredentials`表明是否跨域请求,
//     //应该是用证书
//     withCredentials:false //默认值
//     //`adapter`适配器,允许自定义处理请求,这会使测试更简单。
//     //返回一个promise,并且提供验证返回(查看[response docs](#response-api))
//     adapter:function(config){
//         /*...*/
//     },
//     //`auth`表明HTTP基础的认证应该被使用,并且提供证书。
//     //这个会设置一个`authorization` 头(header),并且覆盖你在header设置的Authorization头信息。
//     auth:{
//         username:'janedoe',
//         password:'s00pers3cret'
//     },
//     //`responsetype`表明服务器返回的数据类型,这些类型的设置应该是
//     //'arraybuffer','blob','document','json','text',stream'
//     responsetype:'json',
//     //`xsrfHeaderName` 是http头(header)的名字,并且该头携带xsrf的值
//     xrsfHeadername:'X-XSRF-TOKEN',//默认值
//     //`onUploadProgress`允许处理上传过程的事件
//     onUploadProgress: function(progressEvent){
//         //本地过程事件发生时想做的事
//     },
//     //`onDownloadProgress`允许处理下载过程的事件
//     onDownloadProgress: function(progressEvent){
//         //下载过程中想做的事
//     },
//     //`maxContentLength` 定义http返回内容的最大容量
//     maxContentLength: 2000,
//     //`validateStatus` 定义promise的resolve和reject。
//     //http返回状态码,如果`validateStatus`返回true(或者设置成null/undefined),promise将会接受;其他的promise将会拒绝。
//     validateStatus: function(status){
//         return status >= 200 &;&; stauts < 300;//默认
//     },
//     //`httpAgent` 和 `httpsAgent`当产生一个http或者https请求时分别定义一个自定义的代理,在nodejs中。
//     //这个允许设置一些选选个,像是`keepAlive`--这个在默认中是没有开启的。
//     httpAgent: new http.Agent({keepAlive:treu}),
//     httpsAgent: new https.Agent({keepAlive:true}),
//     //`proxy`定义服务器的主机名字和端口号。
//     //`auth`表明HTTP基本认证应该跟`proxy`相连接,并且提供证书。
//     //这个将设置一个'Proxy-Authorization'头(header),覆盖原先自定义的。
//     proxy:{
//         host:127.0.0.1,
//         port:9000,
//         auth:{
//             username:'cdd',
//             password:'123456'
//         }
//     },
//     //`cancelTaken` 定义一个取消,能够用来取消请求
//     //(查看 下面的Cancellation 的详细部分)
//     cancelToke: new CancelToken(function(cancel){
//     })
// });

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

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

相关文章

火狐打印预览_将打印和打印预览命令添加到Firefox的上下文菜单

火狐打印预览Have you been thinking about how much easier it would be to having the Print & Print Preview commands in Firefox’s Context Menu? The Print Context Menu extension for Firefox allows you to avoid having to use the File Menu to access the pr…

每个人都要在自己的“时区”里找到自己的快乐

祝小妹和自己生日快乐&#xff0c;人人都想快乐&#xff0c;却在平常的365天闷闷不乐&#xff0c;但愿家人朋友在平常的每一天都很够健康快乐&#xff01; 在我那个开不了机的手机记事薄有句话还记得&#xff1a;你们不要刻意等我&#xff0c;因为可能现在的我还没来得及去发现…

《2017 云计算评测报告》:带你了解 AWS、阿里云、腾讯云等八家云计算服务提供商的综合用户体验情况...

报告电子版至听云官方博客下载&#xff1a;http://blog.tingyun.com/web/article/detail/1352 评测说明 评测目标&#xff1a;同一应用&#xff08;网站&#xff09;在不同云上的用户访问体验&#xff0c;以及对云资源的使用 洞察周期及范围&#xff1a;2017年4月-2017年9月 访…

js以变量为键

let key "dynamic",obj{[key]:true }; obj[key2]key console.log(obj)一般在配置文件中应用较多

搭建jenkins实现自动化部署

参考&#xff1a; https://www.cnblogs.com/rslai/p/8135460.html转载于:https://www.cnblogs.com/lihuanhuan/p/10612123.html

python 新闻摘要_每日新闻摘要:Microsoft内部禁止应用程序,这样就可以了

python 新闻摘要Recently, a list of apps that Microsoft prohibits for internal employee use leaked, including Slack, Grammarly, and others. It’s tempting to think these are the actions of a company hating competition, but the truth is more complicated. 最近…

vue使用process.env搭建自定义运行环境

一、vue-cli项目下默认有三种模式&#xff1a; development&#xff1a;在 vue-cli-service serve 时使用。production&#xff1a;在 vue-cli-service build 和 vue-cli-service test:e2e 时使用。test&#xff1a;在 vue-cli-service test:unit 时使用。 对应的 process.env…

bootstrap评分插件 Bootstrap Star Rating Examples

http://www.jq22.com/demo/bootstrap-star-rating-master201708041812/ 转载于:https://www.cnblogs.com/waw/p/8288951.html

http 请求报文

1、报文 2、http请求方法 restful接口 post&#xff1a;创建 put&#xff1a;更新 转载于:https://www.cnblogs.com/mengfangui/p/10171559.html

chrome硬件加速_如何在Chrome中打开和关闭硬件加速

chrome硬件加速Google Chrome comes equipped with hardware acceleration, a feature which takes advantage of your computer’s GPU to speed up processes and free vital CPU time. However, sometimes driver incompatibilities can cause this feature to misbehave an…

春节您“抢票”到手了吗,如果没,请进来看看!

不是为了卖“广告”!我与软件作者从不认识&#xff01;我与软件作者因为抢票认识&#xff0c;不&#xff0c;只认识他写的软件&#xff01;51CTO博客2.0后&#xff0c;我一直没有写博文&#xff01;主要原因&#xff1a;不能用Live Writer写博文&#xff0c;复制&#xff0c;粘…

两个矩阵相加 Exercise08_05

1 import java.util.Scanner;2 /**3 * author 冰樱梦4 * 时间&#xff1a;2018年12月5 * 题目&#xff1a;两个矩阵相加6 *7 */8 public class Exercise08_05 {9 public static void main(String[] args){ 10 Scanner inputnew Scanner(System.in); 11 …

vue element form中input等组件不能输入值

<el-input v-model"form.inputVal " />由于data中form只是一个空对象{}&#xff0c;当主动设置 form.inputVal “” 后input却仍无法输入值&#xff0c;这是因为inputVal 属性没有get和set&#xff0c;需要用vue内置属性设置&#xff1a;this.$set(this.form,…

如何在PowerPoint中制作三折

While Microsoft PowerPoint is almost exclusively used for presentation purposes, it’s also a great application for creating interesting and visually appealing brochures. Here’s how to create (and print out) a tri-fold using PowerPoint. 尽管Microsoft Powe…

彻底理解数据库事物

事务 事务(Transaction)&#xff0c;一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在计算机术语中&#xff0c;事务通常就是指数据库事务。 概念 一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的…

HttpRunner自动化框架学习笔记

一.简单介绍 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架&#xff0c;只需编写维护一份 YAML/JSON 脚本&#xff0c;即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。 支持python2和python3 二.框架特点 继承 Requests 的全部特性&#xff0c;轻松实现…

如何在Chrome中为Gmail启用桌面通知

Last year Google rolled out desktop notifications for Google Calendar, now you can get Gmail and Gchat notifications on your desktop too. Read on as we walk you through configuring them both. 去年Google推出了Google日历的桌面通知&#xff0c;现在您也可以在桌…

vue集成iconfont、fontawesome和图标选择器(含fontawesome、el-icon和加入的iconfont)

目录&#xff08;一&#xff09;引入iconfont字体图标库将图标加入购物车新建&#xff08;添加至&#xff09;项目下载后项目中引入&#xff08;二&#xff09;引入fontawesome&#xff08;三&#xff09;图标选择器效果图结构使用源码&#xff08;一&#xff09;引入iconfont字…

java之Synchronize

2019独角兽企业重金招聘Python工程师标准>>> 实现原理&#xff1a;JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。 具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令&#xff0c;在退出方法和异常处插入 monitor.exit …

pop()方法

pop()方法 描述 列表 pop() 方法通过指定元素的索引值来移除列表中的某个元素&#xff08;默认是最后一个元素&#xff09;&#xff0c;并且返回该元素的值&#xff0c;如果列表为空或者索引值超出范围会报一个异常。 语法 pop() 方法语法&#xff1a; L.pop([index-1]) 参数 i…