springboot中不能获取post请求参数的解决方法

 更新时间:2020年06月23日 10:31:03   作者:芊雨_  
这篇文章主要介绍了springboot中不能获取post请求参数的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题描述

最近在做微信小程序,用的spring boot做后端,突然发现客户端发送post请求的时候服务端接收不到参数。问题简化之后如下:

微信小程序端:

在页面放一个按钮进行测试

<!--index.wxml-->
<view class="container">
 <button catchtap='testpost'>点击进行测试</button>
</view>

绑定一个函数发送post请求

//index.js
//获取应用实例
const app = getApp()

Page({
 testpost:function(){
  wx.request({
   url: 'http://127.0.0.1:8081/testpost/demo',
   method:'POST',
   data:{
    name:'lijing',
    age:'18'
   },
   success:function(res){
    console.log(res);
   },
   fail:function(err){
    console.log(err)
   }
  })
 }
})

如图所示:

服务端

服务端新建一个springBoot项目,配置端口和路径

server.port=8081
server.servlet.context-path=/testpost

再新建一个controller用于测试:

package com.demo.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 1. @author lijing
 2. @date 2019-03-31-20:19
 3. @discroption 测试post请求参数传递
 */
@RestController
public class TestController {
  @RequestMapping(value = "/demo",method = RequestMethod.POST)
  public String demo(String name,String age){
    System.out.println("name = [" + name + "], age = [" + age + "]");
    return "server response";
  }
}

可见,如果能获取到参数的话就会在控制台打印参数。
但是在小程序界面点击按钮之后,服务端并不能获取到数据,如下:

解决方法

查阅资料之后发现,post请求提交数据有四种常见方式:

application/x-www-form-urlencoded
浏览器的原生 <form> 表单,其中ajax也是用这种方式提交的multipart/form-data
表单上传文件用的这种提交方式application/json
这种提交方式的消息主体是一个json字符串text/xml
消息主体是XML格式的内容
再回到小程序中,检查消息头发现这里的提交方式为:application/json


所以在服务端进行接收的时候不能直接用参数接受,可以以流的形式来读取json字符串,在用工具类来解析json数据,如下:

package com.demo.demo;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author lijing
 * @date 2019-03-31-20:19
 * @discroption 测试post请求参数传递
 */
@RestController
public class TestController {
  @RequestMapping(value = "/demo",method = RequestMethod.POST)
  public String demo(HttpServletRequest req){
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()));
      StringBuffer sb=new StringBuffer();
      String s=null;
      while((s=br.readLine())!=null){
        sb.append(s);
      }
      JSONObject jsonObject = JSONObject.parseObject(sb.toString());
      String name = jsonObject.getString("name");
      String age = jsonObject.getString("age");
      System.out.println("name:"+name+" age:"+age);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return "server response";
  }
}

输出如下:


上面用到的解析json的工具类:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.28</version>
</dependency>

使用@RequestBody注解

@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象。所以上面代码可以改为如下形式:

package com.demo.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
1. @author lijing
2. @date 2019-03-31-20:19
3. @discroption 测试post请求参数传递
*/
@RestController
public class TestController {
  @RequestMapping(value = "/demo",method = RequestMethod.POST)
  public String demo(@RequestBody Person person){
    System.out.println(person);
    return "server response";
  }
}
package com.demo.model;
import lombok.*;

@Data
class Person{
	private String name;
	private String age;
}

到此这篇关于springboot中不能获取post请求参数的解决方法的文章就介绍到这了,更多相关springboot不能获取post内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中LinkedHashMap源码解析

    Java中LinkedHashMap源码解析

    这篇文章主要为大家解析了Java中LinkedHashMap源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Springboot整合camunda+mysql的集成流程分析

    Springboot整合camunda+mysql的集成流程分析

    本文介绍基于mysql数据库,如何实现camunda与springboot的集成,如何实现基于springboot运行camunda开源流程引擎,本文分步骤图文相结合给大家介绍的非常详细,需要的朋友参考下吧
    2021-06-06
  • GC参考手册二java中垃圾回收原理解析

    GC参考手册二java中垃圾回收原理解析

    由于有个垃圾回收机制,java中的额对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存<BR>
    2022-01-01
  • Spring项目XML文件使用小结

    Spring项目XML文件使用小结

    这篇文章主要介绍了Spring项目XML文件使用常见介绍,主要包括项目pom文件,项目初始IOC容器及项目需要自动装配的代码详解,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • SpringBoot接值实现方法详解

    SpringBoot接值实现方法详解

    这篇文章主要介绍了SpringBoot接值实现方法,SpringBoot接值是指在SpringBoot应用程序中接收请求参数,从HTTP请求中获取参数,并将其绑定到Java对象中进行处理的过程,感兴趣想要详细了解可以参考下文
    2023-05-05
  • intelij idea 2023创建java web项目的完整步骤

    intelij idea 2023创建java web项目的完整步骤

    这篇文章主要给大家介绍了关于intelij idea 2023创建java web项目的完整步骤,该教学主要针对各位刚刚接触javaweb开发的小伙伴,各位学习java的朋友也难免会经历这个阶段,需要的朋友可以参考下
    2023-10-10
  • SpringBoot对静态资源的映射规则详解解读

    SpringBoot对静态资源的映射规则详解解读

    这篇文章主要介绍了SpringBoot对静态资源的映射规则详解解读,在Spring Boot中,映射规则是用来定义URL与控制器方法之间的映射关系的,通过映射规则,可以将特定的URL请求映射到相应的控制器方法上,从而实现请求的处理和响应的返回,需要的朋友可以参考下
    2023-10-10
  • 使用Java Api操作HDFS过程详解

    使用Java Api操作HDFS过程详解

    这篇文章主要介绍了使用Java Api操作HDFS过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java实现产生随机字符串主键的UUID工具类

    Java实现产生随机字符串主键的UUID工具类

    这篇文章主要介绍了Java实现产生随机字符串主键的UUID工具类,涉及java随机数与字符串遍历、转换等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Java四个线程常用函数超全使用详解

    Java四个线程常用函数超全使用详解

    这篇文章主要为大家介绍了线程中常用的四个函数:wait()、join()、sleep() 和 yield(),以及这四个函数的使用方法和相互之间的区别,需要的可以参考一下
    2022-03-03

最新评论