axios 发 post 请求,后端接收不到参数的解决方案

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

问题场景
场景很简单,就是一个正常 axios post 请求:

axios({headers: {'deviceCode': 'A95ZEF1-47B5-AC90BF3'},method: 'post',url: '/api/lockServer/search',data: {username,pwd}
})


后台说没有接收到你的传参。

这就有点奇怪了,我看了一下浏览器的请求信息是 OK 的,参数都是有的,而且之前这样用 axios 也没有这个问题。

但是这个接口是通用的,别人都用了,是 OK 的,接口没问题。

问题原因
要点1
原因就是这次的接口使用 java spring mvc
并且在这个方法上使用了注解 @RequestParam

那么这个是什么意思呢,这个是只能从请求的地址中取出参数,也就是只能从 username=admin&password=admin 这种字符串中解析出参数。

要点2
我们还可以看到我们这次请求的 Content-Type:

application/json;charset=UTF-8
1
关于这一点需要说明的是:

1、axios会帮我们 转换请求数据和响应数据 以及 自动转换 JSON 数据


2、在 axios 源码中发现下面这段内容:(很关键)

我们知道在做 post 请求的时候,我们的传参是 data: {...} 或者直接 {...} 的形式传递的,嗯,就是下面这两种形式

【第一种形式】


【第二种形式】


非常的刺激,这两种形式无一例外都触发了 axios 源码中【很关键】的那一段代码

问题分析
也就是说,我们的 Content-Type 变成了 application/json;charset=utf-8
然后,因为我们的参数是 JSON 对象,axios 帮我们做了一个 stringify 的处理。
而且查阅 axios 文档可以知道:axios 使用 post 发送数据时,默认是直接把 json 放到请求体中提交到后端的。

那么,这就与我们服务端要求的 'Content-Type': 'application/x-www-form-urlencoded' 以及 @RequestParam 不符合。

解决方案
解决方案一
【用 URLSearchParams 传递参数】

let param = new URLSearchParams()
param.append('username', 'admin')
param.append('pwd', 'admin')
axios({method: 'post',url: '/api/lockServer/search',data: param
})

需要注意的是: URLSearchParams 不支持所有的浏览器,但是总体的支持情况还是 OK 的,所以优先推荐这种简单直接的解决方案

解决方案二
网上有很多方案说使用
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
或者
{headers:{'Content-Type':'application/x-www-form-urlencoded'}}
我试了一下,其实这样还是不行的
【还需要额外的操作,(我们要将参数转换为query参数)】
引入 qs ,这个库是 axios 里面包含的,不需要再下载了。

import Qs from 'qs'
let data = {"username": "admin","pwd": "admin"
}axios({headers: {'deviceCode': 'A95ZEF1-47B5-AC90BF3'},method: 'post',url: '/api/lockServer/search',data: Qs.stringify(data)
})

解决方案三
既然 axios 源码中有那么一段【很关键】的代码,那么,我们也可以通过修改 transformRequest 来达到我们的目的。

在 axios 的请求配置项中,是有 transformRequest 的配置的:

OK,那么现在我们的请求就可以写成下面这个样子了:

import Qs from 'qs'
axios({url: '/api/lockServer/search',method: 'post',transformRequest: [function (data) {// 对 data 进行任意转换处理return Qs.stringify(data)}],headers: {'deviceCode': 'A95ZEF1-47B5-AC90BF3'},data: {username: 'admin',pwd: 'admin'}
})

解决方案四
【重写一个 axios 实例,重新实现属于我们自己的 transformRequest】

import axios from 'axios'
let instance = axios.create({transformRequest: [function transformRequest(data, headers) {normalizeHeaderName(headers, 'Content-Type');if (utils.isFormData(data) ||utils.isArrayBuffer(data) ||utils.isBuffer(data) ||utils.isStream(data) ||utils.isFile(data) ||utils.isBlob(data)) {return data;}if (utils.isArrayBufferView(data)) {return data.buffer;}if (utils.isURLSearchParams(data)) {setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');return data.toString();}/*改了这里*/if (utils.isObject(data)) {setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');let _data = Object.keys(data)return encodeURI(_data.map(name => `${name}=${data[name]}`).join('&'));}return data;}],
})

解决方案五

axios.post('/api/lockServer/search',"userName='admin'&pwd='admin'");

解决方案六
我们知道现在我们服务端同学接收参数用的是 @RequestParam(通过字符串中解析出参数)
其实还有另一种是 @RequestBody(从请求体中获取参数)。

我们让后端的同学改成 @RequestBody 不就可以了吗
--------------------- 

转自:https://blog.csdn.net/csdn_yudong/article/details/79668655 
 

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

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

相关文章

nginx+keepalived高可用性负载均衡

一、前言nginx进程基于于MasterSlave(worker)多进程模型,自 身具有非常稳定的子进程管理功能。在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存 活高可靠性,Slave(work…

白发变黑有诀窍

白发变黑发的有效方法 1、要远离焦虑: 如果天天的忧愁、烦恼、焦虑,则可能引起脱发,焦虑压抑的时间越长,脱发就会迅速的加快。不管工作如何忙碌,建议女性保持适当的运动量以及愉快的心情,头发也会富有光…

经典监督学习方法

生成算法尝试去找这个数据到底是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,哪个类别最有可能产生这个信号,这个信号就属于那个类别。 判别模型不关心数据是怎么生成的,它只关心信号之…

Map 集合循环、遍历的 四 种方式

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 package cn.jdbc.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry;/…

Ubuntu版本更新一路走来:朕就是这样的汉子

今日,Ubuntu发布了最新的14.04版本。当然,业界对新版Ubuntu褒贬不一,为此我们回顾了Ubuntu版本更新历史上几个比较有代表性的版本,看看Ubuntu这一路走来究竟有什么变化。Ubuntu刚刚发布了最新的14.04版本,围绕这一版本…

「2019纪中集训Day7」解题报告

T1、小L的数列 给一个数列 \(\{f_i\}\):\[ f_i \prod_{j 1}^{j \leq k} f_{i - j}^{b_j}, \ (i > k) \] 现在给定数列的前 \(k \ (k \le 200)\) 项及 \({b_i}\),求第 \(n\) 项。 \(Sol\): 注意到数列的任意一项 \(f_i \ (i > k)\)&am…

我想拥有一座庄园:“ 暮春三月,江南草长,杂花生树,群莺乱飞 ... ”

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 // 或许这个心愿是缘于少时读的诗:其中大多是对于自然的期许和神往 ... // 亦或许是想太多的人大多都有这样的心愿 ... 我想…

安装Ubuntu 14.04后要做的5件事情

Ubuntu最新版本Ubuntu 14.04已经发布,它是一个长期支持版本(LTS),提供软件包和安全更新的服务周期为5年。本文为大家简单介绍了Ubuntu 14.04版本新特性和安装Ubuntu 14.04后需要做的5件事情,以供参考。Ubuntu目前是世界…

昨天,我的大学学习[2]

昨天,我的大学学习[2] 曾毅 谁能改变我的命运[大学二年级] 如果说大学一年级的时候是一种被动学习状态,对计算机科学不能揽其全貌,那么进入大学二年级以后的学习便是比较有针对性的了,但这种转变并非偶然,同样也是经过…

VUE 项目 去除 input 框值 所有空格、vue 组件去除空格、input 去除空格

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.以下所有方法 我都试过:不行。 str.trim(); //去掉首尾空格 str.replace(" ",""); //去除所有空格&…

性能优化之节流、防抖

1. 防抖: 由于dom操作极其昂贵,所以尝试过多的dom操作有可能会将浏览器搞崩溃,比如onresize、onscroll这类事件操作;为了解决这个问题,引出防抖的概念(某些代码不可以在没有间断的情况下连续重复执行&#…

百万用户规模的系统如何扩展

摘要:系统扩展一直是个让人头疼的事情,MatinKleppmann通过本文分享了他自己的6条经验,外加网友的一条建议,这些经验对于扩展Twitter这样规模的系统或许帮助不大,但是对于百万用户级别的系统扩展就另当别论了。 【编者…

springboot 项目输出 sql 到控制台、 SpringBoot 中 Mybatis 打印 sql

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 SpringBoot中Mybatis打印sql 如果使用的是 application.properties 文件,加入如下配置: logging.level.com.ex…

JS流程图解决方案GoJS

GoJs简介 一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库 GoJS依赖于HTML5,所以请保证您的浏览器版本支持HTML5,当然还要加载这个库。 首先个人建议先下载官方实例的 离线版本【…

VUE.JS 组件化开发实践

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子。后来接到一个基于模板的活动…

Space Time Varying Color Palette

PDF Space Time Varying Color Palettes from Bo Zhou转载于:https://www.cnblogs.com/Jedimaster/p/4941857.html

提升开发效率的十个工具

Git 之前也有过不少版本控制的工具。有好的,也有糟糕的。不过它们都或多或少地误入歧途了。 这时候Git出现了。一旦你用上了这个神奇的工具,很难相像你还会碰到比它更好的了。 还没用过Git?试一下吧。 Stack Overflow 真的,我没…

Virtual Villagers 攻略

和大家分享一下这个游戏的攻略心得,希望对大家有帮助~~Puzzle 1 清洁水井(难度:简单)将一个拥有Building技能的村民拖到水井上就可以了。Puzzle 2 房屋建设(难度:简单)一开始会由一个掌握Building技能的村民…

input 框 去掉下面的提示文字、提示选项

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 我的一个输入框总是有提示文字: 2. 去掉方法,给 input 加一个属性: autocomplete"off"…

科学合理的减肥

1、科学安排一日三餐    在正常生理情况下,一般人习惯于一日三餐。人体最大消耗是在一天中的上午。由于胃经过一夜消化早已排空,如果不吃早饭,那么整个上午的活动所消耗的能量完全要靠前一天晚餐提供,这就远远不能满足营养需要。…