一、问题场景

后端代码:

  1. @RequestMapping("/tranfer/save")
  2. public Result<String> transferSave( String indexs, String userId){
  3. // 逻辑代码..
  4. }

前端以POST方式调用/tranfer/save接口时会传两个参数:indexs、userId。
而在transferSave方法体内debug,发现参数获取到的是 null 值。

二、原因

post请求提交数据有四种常见方式:

  • application/x-www-form-urlencoded 浏览器的原生
    表单,其中ajax也是用这种方式提交的
  • multipart/form-data 表单上传文件用的这种提交方式
  • application/json 这种提交方式的消息主体是一个json字符串
  • text/xml 消息主体是XML格式的内容

前端调用接口时,观察请求头,其中数据格式为
**content-type: application/json; charset=UTF-8**

所以在服务端进行接收的时候不能直接用多个形参接受。否则服务器会返回400错误。

三、解决方式

1、(推荐)使用参数的包装类

可以封装一个接收请求参数的类:

  1. @Data
  2. public class Param{
  3. private String indexs;
  4. private String userId;
  5. }

在方法形参处用改类进行接收即可:

@RequestBody 作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象。

  1. @RequestMapping("/tranfer/save")
  2. public Result<String> transferSave(@RequestBody Param param){
  3. String indexs = param.getIndexs();
  4. // 逻辑代码..
  5. }

2、用流解析json格式传参

  1. @RequestMapping("/tranfer/save")
  2. public Result<String> transferSave(HttpServletRequest req){
  3. String indexs = "";
  4. String userId = "";
  5. try {
  6. BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()));
  7. StringBuffer sb=new StringBuffer();
  8. String s=null;
  9. while((s=br.readLine())!=null){
  10. sb.append(s);
  11. }
  12. JSONObject jsonObject = JSONObject.parseObject(sb.toString());
  13. indexs = jsonObject.getString("name");
  14. userId = jsonObject.getString("age");
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. // 逻辑代码..
  19. }

3、前端发送POST请求时将参数放在url之后

前端调用接口的vue代码:

  1. const getTransterSave = (data) => {
  2. return request({
  3. url: 'xxx/tranfer/save/',
  4. method: 'POST',
  5. data: data // 参数以请求体方式串数
  6. })
  7. }

将其改为:

  1. const getTransterSave = (data) => {
  2. return request({
  3. url: 'xxx/tranfer/save/',
  4. method: 'POST',
  5. params: data // 参数以url拼接的方式串数
  6. })
  7. }

参考资料: 关于springboot中不能获取post请求参数的问题