Skip to content

通过 x-www-form-urlencoded 方式发送数组参数(@knife4j)

🏷️ knife4j

通过 x-www-form-urlencoded 方式传递数组参数时的格式比较特殊。

如传递一个名为 titleString 数组,发送请求时应该格式化为 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.startranges%5B0%5D.end 的形式。

如果在 knife4j 中将参数 key 改成 ranges%5B0%5D.startranges%5B0%5D.end 格式,请求时又会自动变成如下格式(虽然不报错,但是参数没有正确传递)。

ranges%255B0%255D.end=1.59419974002E12&ranges%255B0%255D.start=1.594115119048E12

猜测这个是由于 knife4j 中没有对参数 key 中的 []UrlEncode 导致的。将 knife4j 升级到当前的最新版 2.0.4 仍然还有问题,暂时只能等修复了。