热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

微信小程序Post方法提交数据问题描述微信小程序使用POST方法向SpringBoot后端提交数据,但是后端无法得到期待的数据;后端Control
微信小程序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)以及后端接收方式相一致;


推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • postmain报400_Postman测试@RequestBody发送请求时报400错误
    postman测试requestbody时碰到400错误图1原因:传参数如果不使用RequestBody,在使用Postman进行Post请求时,通常做 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 使用这个技巧要达到的目标:一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。classPostextendsModel{}现在 ... [详细]
  • 软件测试对于减少程序BUG有多大帮助?有经验的程序员通常认为测试与代码同等重要,测试可以减少代码变更或扩展的不确定性。测试应该方便阅读简单且能快速运行 ... [详细]
  • 使用Postman调试API遇到“400 Bad Request”问题
    问题今日使用Postman调试一个临时接手的API,参照调用程序代码填充好请求头、请求体参数(post),Postman客 ... [详细]
  • php实现用户注册登录界面的方法:1、创建log.php登录主界面;2、设置register.php注册主界面;3、通过mysqli_connect连接数据库并进行相应的数据操作即可。 ... [详细]
  • Postman 调试 WebService
    Postman调试WebServiceWebServicePostman设置Headers请求头参数Body请求体传参返回结果WebService天气预报Web服务http:ww ... [详细]
author-avatar
小丽丽很可爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有