通过 x-www-form-urlencoded 方式发送数组参数(@knife4j)
🏷️ knife4j
通过 x-www-form-urlencoded 方式传递数组参数时的格式比较特殊。
如传递一个名为 title 的 String 数组,发送请求时应该格式化为 title[0]=FirstTitle&title[1]=SencondTitle
。
如果要传递一个实体类的数组,需要格式化为 blog[0].title=FirstTitle&blog[1].title=SecondTitle
。
但貌似这里有些框架并不统一,有的会格式化为 blog[][title]=FirstTitle&blog[][title]=SecondTitle
的形式。
项目中使用的 SpringBoot 2.2.0 版本,默认使用的是第一种格式,也就是带下标的格式。
knife4j 中遇到的问题
但是在通过 knife4j 调用接口时遇到了请求参数无法解析的问题 (HTTP Status 400 – Bad Request)。
Knife4j 是为 Java MVC 框架集成 Swagger 生成 Api 文档的工具,前身是 swagger-bootstrap-ui 。
官网:https://doc.xiaominfo.com/
假设传递的参数如下:
ranges[0].end=1.594197645221E12&ranges[0].start=1.594115119048E12
但是同样的请求格式在 PostMan 中是可以正常传递参数的。使用 Fiddler 拦截后可以看到传递的参数会变成 ranges%5B0%5D.start
、ranges%5B0%5D.end
的形式。
如果在 knife4j 中将参数 key 改成 ranges%5B0%5D.start
、ranges%5B0%5D.end
格式,请求时又会自动变成如下格式(虽然不报错,但是参数没有正确传递)。
ranges%255B0%255D.end=1.59419974002E12&ranges%255B0%255D.start=1.594115119048E12
猜测这个是由于 knife4j 中没有对参数 key 中的 [
和 ]
做 UrlEncode 导致的。将 knife4j 升级到当前的最新版 2.0.4 仍然还有问题,暂时只能等修复了。