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

本文介绍了在SpringBoot后端遇到的一个问题:无法从微信小程序的POST请求中获取参数。问题源于请求数据格式为JSON,而服务端原先是按表单格式接收。解决方案包括两种:一是通过流读取并解析JSON;二是使用`@RequestBody`注解直接将JSON转换为Java对象。最后展示了如何使用`@RequestBody`注解来接收参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

最近在做微信小程序,用的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)

}

})

}

})

如图所示:

761fd9de8f1c937e73b823e22a4f02bf.png

服务端

服务端新建一个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";

}

}

可见,如果能获取到参数的话就会在控制台打印参数。

但是在小程序界面点击按钮之后,服务端并不能获取到数据,如下:

65964c5888a360982d2d774ae2f728c9.png

解决方法

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

application/x-www-form-urlencoded

浏览器的原生

表单,其中ajax也是用这种方式提交的multipart/form-data

表单上传文件用的这种提交方式application/json

这种提交方式的消息主体是一个json字符串text/xml

消息主体是XML格式的内容

再回到小程序中,检查消息头发现这里的提交方式为:application/json

a0d2e8c99432cfdcb589421c3348a012.png

所以在服务端进行接收的时候不能直接用参数接受,可以以流的形式来读取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";

}

}

输出如下:

ba068802c3744b56662e6ba02826a178.png

上面用到的解析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请求参数的解决方法的文章就介绍到这了,更多相关springboot不能获取post内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

原文链接:https://blog.csdn.net/li3455277925/article/details/88933221

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值