微信小程序Post方法提交数据

本文深入探讨微信小程序使用POST方法向SpringBoot后端提交数据时遇到的问题,详细分析了数据格式、content-type设置及@RequestBody注解的影响,提供了解决方案。

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

微信小程序Post方法提交数据

问题描述

微信小程序使用POST方法向Spring Boot 后端提交数据,但是后端无法得到期待的数据;

后端Controller方法使用@RequestBody注解DTO,前端需要传入JSON字符串参数,然后Spring MVC完成JSON字符串和DTO的转换;后端接收到了数据,但是字段全部为null;

后端Controller方法已经通过postman测试;

场景还原

//微信小程序请求代码:
let obj=new Object();
//....设置obj的属性
wx.request({
    url:"url",
    method:"POST",
    data:{
        "dtoName":obj
    }
});
//Spring Boot后端Controller方法
@PostMapping("add")
public Result addDTO(@RequestBody DTO dto){
	return dtoService.save(dto);
}

问题分析

后端代码不存在功能性缺陷,通过调试发现接收到参数,并且进入了Service层,所以问题应该在微信小程序发送的数据不合适,也就是微信小程序发送数据的格式或者发送数据的方式不是后端期待的方式;

问题解决

百度后,发现有一种做法是当请求方法为POST时,指定content-type的值为“application/x-www-form-urlencoded”;但是这时后台会报415错误:

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]

所以,content-type的值只能为application/json,这是因为我们使用了@RequestBody注解,Spring MVC只有在content-type为application/json的时候才会做转换,否则就报“Unsupported Media Type”的415错误;

去微信小程序官网文档查看wx.request的用法,知道content-type的默认值为"application/json";也就是将对数据进行 JSON 序列化;这说明小程序端发送数据的方式没有问题;因为会“对数据进行 JSON 序列化”,那么数据自然就是data对象;我们的data实际上这样一个对象:它有一个“dtoName”的属性,其值为我们构造的对象;这样就能解释为什么接收到数据(说明媒体类型是合适的),但是字段全部为null,也就是发送数据的格式有问题;修改如下:

wx.request({
    url:"url",
    method:"POST",
    data:{
        fieldOne:"value",
        fieldTwo:"value"
    }
});

这样就解决了使用@RequestBody注解,接收到数据字段为null的问题;

涉及原理

实际上,POST提交数据时可以有多种格式:form-data、x-www.form-urlencodeed、raw、binary等;@RequestBody注解正是指示框架将body里的内容按照JSON字符串解析成相应对象,所以当content-type不是application/json的请求到达时,自然不能处理,报错415;值得一提的是,使用postman测试的时候正是指定post的格式为raw;另外,即便使用“application/x-www-form-urlencoded”的方式,data的格式仍然需要为键值对;

官方文档中的说明如下:

最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String 。转换规则如下:
对于 GET 方法的数据,会将数据转换成 query
string(encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)…) 对于 POST 方法且 header[‘content-type’] 为 application/json 的数据,会对数据进行 JSON
序列化 对于 POST 方法且 header[‘content-type’] 为
application/x-www-form-urlencoded 的数据,会将数据转换成 query string
(encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)…)

所以,我们也可以直接将一个JSON字符串传递给data,以实现提交JSON数据的需求(比如提交数组时,并不需要手动构造data的键值对,只需要将数组转换为JSON字符串,传递给data即可);

总而言之,data的构造方式应该同小程序发送方式(json还是x-www-form-urlencoded)以及后端接收方式相一致;

微信小程序中的按钮提交数据通常涉及前端页面设计、用户交互及后端的数据处理。下面简要介绍如何通过按钮点击事件触发表单或其他形式的数据提交: ### 一、准备工作 1. **创建项目结构**:确保你已经在微信公众平台注册账号并完成开发者认证,然后新建一个小程序项目。 2. **配置环境**:安装必要的工具链如 [WeChat DevTools](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html),用于编写代码和调试程序。 ### 二、实现步骤 #### (一)HTML/CSS部分 - 设计界面元素 在 `.wxml` 文件中添加 `button` 按钮,并为其绑定点击事件处理器(假设这里我们直接绑定了名为 `onSubmit` 的函数)。同时设置好样式,在对应的 `.wxss` 中对组件进行美化。 ```html <!-- index.wxml --> <form bindsubmit="onFormSubmit"> <input name="username" placeholder="请输入用户名"/> <input type="password" password="{{true}}" name="password" placeholder="请输入密码"/> <!-- 更多功能可以继续增加其他的 input 元素 --> <view class="btn-area"> <button formType="submit">登录</button> </view> </form> /* index.wxss */ .btn-area { margin-top: 40rpx; } button { width: 80%; } ``` #### (二)JavaScript 部分 - 编写业务逻辑 接下来是在 JavaScript 文件里定义上述提到的 `onFormSubmit()` 函数,该函数会在用户点击“提交”按钮时被调用;此外还需要引入 wx.request() 来发送网络请求到服务器保存信息等操作。 ```javascript //index.js Page({ data:{ }, onFormSubmit(event){ // 获取表单值 const { username, password } = event.detail.value; if (!username || !password) return wx.showToast({title:"请检查输入", icon:'none'}); console.log(`正在尝试登录... 用户名:${username}, 密码(加密前):${'*'.repeat(password.length)} `); /** * 发起 HTTP POST 请求向服务端验证凭据, * 成功则跳转至指定页面; * 失败给出提示消息给客户端. * * 注意实际开发过程中需要对接口安全性做更多考虑比如采用HTTPS协议传输敏感资料以及加解密算法保护账户安全。 */ wx.request({ url : 'YOUR_SERVER_URL', method :"POST", header:{'content-type':'application/json'}, dataType:'json', data:{ "userName": username, "passWordHash": this.hashPassword(password), // 假设有这样一个辅助方法来散列原始字符串 }, success(res){ if (res.statusCode === 200 && res.data.success===true){ wx.reLaunch({url:'/pages/home/home'}) } else{ wx.showModal({ content:`登录失败: ${res.errMsg}`, showCancel:false}) } } }); }, hashPassword(){ /* ... */} ///模拟生成哈希值的过程 }); ``` 以上就是简单的关于微信小程序内利用按钮传递数据的基本流程描述了。当然这只是一个非常基础的例子,在真实的应用场景下还需结合具体的业务需求做出相应的调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值