技术标签: qs POST Vue Javascript 前端 axios querystring transformRequest
公司目前项目并没有完全实现前后分离的开发模式,在使用vue开发页面的时候,一度使用引入vue.js + zepto.js的方式,请求一直是用
$.ajax()
的方式。为了向vue环境靠拢,引入了vue.axios。但是这种方式在用POST传参的时候,还是踩了不少坑。
使用的时候:
axios.post('/user', {
foo: 'foo',
bar: 'bar'
})
.then(function (res) {
console.log(res);
})
.catch(function (error) {
console.log(error);
});
这样传参数,后台说接收不到,并且前台查看请求参数的时候,参数的格式还是Request Payload。这在用zepto的$.ajax()
方式的时候是从来没有过的。后来查了下资料,原来zepto的ajax方式在传参的时候,默认设置了Content-Type=application/x-www-form-urlencoded
,服务器能够正确解析,后台也不用做其他多余设置。而axios默认的则是Content-Type=text/plain
,如果前后端都不处理的话,请求是无法成功的(其实当时自己并没有认真看axios的官方文档,其实官方文档已经明确说明了这一点,并且给出了解决方案)。
最初的方案是前台传JSON格式的数据过去;设置'Content-Type': 'application/json;charset=UTF-8'
,大概:
axios.post('/user',JSON.stringify(params),{
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
.then(function (res) {
console.log(res);
})
.catch(function (error) {
console.log(error);
});
并且后台改变其接收参数的方式改为@RequestBody
。
此方法主要参考该博客:https://blog.csdn.net/CarryBest/article/details/80079364
该博客有个问题,就是接收单个参数的时候,是可行的,但是要是接收多个参数,仍然会报错。解决方法是只要后台设置接收的参数为Map类型或是多个参数组成的类的这种类型(对后台不是很了解,大概是这样。。)
后来后台反馈,这种方法每个接口都要设置,很麻烦,询问我有没有更好的方法,随后我又自己查阅官方文档,原来官方给出了解决方案。戳这里,看官方文档。
使用URLSearchParams
的API:
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);
但是该API的浏览器兼容性不是很理想,不过有polyfill,提供了兼容性方案。(https://github.com/WebReflection/url-search-params )
或者引用qs来encode 传入的参数。(https://github.com/ljharb/qs )
const qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));
当然用es6的语法也可以:
import qs from 'qs';
const data = { 'bar': 123 };
const options = {
method: 'POST',
headers: { 'content-type': 'application/x-www-form-urlencoded' },
data: qs.stringify(data),
url,
};
axios(options);
在node.js里,还可以引入querystring模块。(https://nodejs.org/api/querystring.html )
const querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));
综合考虑,上面方法都不适合我这种传统的引入以vue.js和axios.js进行开发的模式。(适合vue-cli)
仔细看文档的时候发现有个transformRequest
参数,类似于拦截器。用于在传递参数前对参数进行处理,于是这里我手动拼接了一下参数,后端无须做任何处理,正常接收就行。
axios.post(url, params, {
transformRequest: [function (data) {
var str='';
for (var key in data) {
str += encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) + '&';
}
return str;
}]
} ).then(fulfilled).catch(rejected)
文章浏览阅读2.1k次。原文链接先说说编解码问题编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 Eg:str1.decode('gb2312') #将gb2312编码的字符串转换成unicode编码str2.encode('gb2312') #将unicode编码..._python中encode在什么模块
文章浏览阅读949次,点赞21次,收藏15次。本文介绍了Java中的数据输入流(DataInputStream)和数据输出流(DataOutputStream)的使用方法。
文章浏览阅读111次。ie无法兼容_ie 浏览器 newdate
文章浏览阅读239次。这篇文章把 Docker 和 K8s 的关系给大家做了一个解答,希望还在迟疑自己现有的知识储备能不能直接学 K8s 的,赶紧行动起来,K8s 是典型的入门有点难,后面越用越香。
文章浏览阅读561次。ADI中文手册获取方法_adi 如何查看数据手册
文章浏览阅读1k次,点赞4次,收藏3次。React 获取接口数据实现分页效果以拼多多接口为例实现思路加载前 加载动画加载后 判断有内容的时候 无内容的时候用到的知识点1、动画效果(用在加载前,加载之后就隐藏或关闭,用开关效果即可)2、axios请求3、map渲染页面4、分页插件(antd)代码实现import React, { Component } from 'react';//引入axiosimport axios from 'axios';//引入antd插件import { Pagination }_react 分页
文章浏览阅读449次,点赞9次,收藏7次。这个变量与验签过程中的SignatureVerificationFilter::PUT_MESSAGE这个宏是对应的,SignatureVerificationFilter::PUT_MESSAGE,如果在签名过程中putMessage设置为true,则在验签过程中需要添加SignatureVerificationFilter::PUT_MESSAGE。项目中使用到了CryPtopp库进行RSA签名与验签,但是在使用过程中反复提示无效的数字签名。否则就会出现文章开头出现的数字签名无效。_cryptopp 签名
文章浏览阅读848次。新闻稿是新闻从业者经常使用的一种文体,它的格式与内容都有着一定的规范。本文将从新闻稿的格式和范文两个方面进行介绍,以帮助读者更好地了解新闻稿的写作_新闻稿时间应该放在什么位置
文章浏览阅读1.7k次。Java中的转换器设计模式 在这篇文章中,我们将讨论 Java / J2EE项目中最常用的 Converter Design Pattern。由于Java8 功能不仅提供了相应类型之间的通用双向转换方式,而且还提供了转换相同类型对象集合的常用方法,从而将样板代码减少到绝对最小值。我们使用Java8 功能编写了..._java转换器模式
文章浏览阅读150次。1,kubectl run创建pods[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1[root@master ~]# kubectl get podsNAME READY STATUS REST...
文章浏览阅读128次。PAT菜鸡进化史_乙级_1003“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。得到“答案正确”的条件是: 1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符; 2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或..._1003 pat乙级 最优
文章浏览阅读5.6k次。CH340与Android串口通信为何要将CH340的ATD+Eclipse上的安卓工程移植到AndroidStudio移植的具体步骤CH340串口通信驱动函数通信过程中重难点还存在的问题为何要将CH340的ATD+Eclipse上的安卓工程移植到AndroidStudio为了在这个工程基础上进行改动,验证串口的数据和配置串口的参数,我首先在Eclipse上配置了安卓开发环境,注意在配置环境是..._340串口小板 安卓给安卓发指令