原因是,POST DATA是Object / Array,axios并没有构造相应的post数据。
解决方法:
- 安装 qs ,使用qs构造。
- 安装 cnpm i qs
- 使用 this.aixos.post('xxxx',Qs.stringify({a:[1,2,3]})
- 完成 transformRequest 钩子方法。
另,使用时需要注意,如果Date类型,需要事先转成String / Number。 有时间了再去完善。 :) 代码如下,
</p>
<p>this.axios({</p>
<p> url: '',</p>
<p> method: 'post',</p>
<p> headers: {</p>
<p> "content-type": "application/x-www-form-urlencoded"</p>
<p> },</p>
<p> <strong>transformRequest</strong>:(obj)=>{</p>
<p> let result = '';</p>
<p> var getStr = function(val,source='',key=[]){</p>
<p> var str = "";</p>
<p> for(var p in val){</p>
<p> switch( typeof val[p] ){</p>
<p> case "string":</p>
<p> case "number":</p>
<p> case "boolean":</p>
<p> if ( source =='' ){</p>
<p> str += p;</p>
<p> }else{</p>
<p> str += source;</p>
<p> key.push(p);</p>
<p> }</p>
<p> str += encodeURIComponent((key!='')?("[" + key.join('][') + "]") : '');</p>
<p> key.pop();</p>
<p> str += "=" </p>
<p> str += encodeURIComponent(val[p]) + "&";</p>
<p> break;</p>
<p> case "object":</p>
<p> <span style="text-decoration-line: underline;">if (val[p].constructor == Date){</span></p>
<p> return '';</p>
<p> }</p>
<p> if (source == ''){</p>
<p> source = p;</p>
<p> }else{</p>
<p> key.push(p);</p>
<p> }</p>
<p> str += getStr(val[p],source,key);</p>
<p> if (val[p].constructor == Array)</p>
<p> source = '';</p>
<p> key=[];</p>
<p> break;</p>
<p> default:</p>
<p> str = '';</p>
<p> break;</p>
<p> </p>
<p> }</p>
<p> }</p>
<p> return str;</p>
<p> }</p>
<p> result = getStr(obj);</p>
<p> return result.replace(/&$/,'');</p>
<p> }</p>
<p>})</p>
<p>
3. transformRequest 也可以写成 json 的形式。这样做的好处是,看起来比较明了,缺点是后台要做相应的调整。比如:
</p>
<p> transformRequest:(obj)=></p>
<p> {</p>
<p> return "json="+encodeURIComponent(JSON.stringify(obj));</p>
<p> }</p>
<p>
© 著作权归作者所有