凯发k8天生赢家一触即发

springboot中不能获取post请求参数如何解决? -凯发k8天生赢家一触即发

2024-01-24

这篇文章将为大家详细讲解有关springboot中不能获取post请求参数如何解决?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

问题描述

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

微信小程序端:

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


 

绑定一个函数发送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
浏览器的原生

表单,其中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的工具类:


   com.alibaba
   fastjson
   1.2.28

使用@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请求参数如何解决?就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

网站地图