一、golang-前端json传参bind两次
二、json传参使用shouldbind为啥不能多次绑定
主要原因
-
数据流的消耗: HTTP 请求的 Body 是一个流,当你第一次调用 ShouldBind 时,Go 会将数据从流中读取,并将其绑定到指定的结构体中。此时,数据流被消耗,第二次调用时流已为空,无法再次绑定。
-
数据绑定时的机制: ctx.ShouldBind 是基于 io.Reader 的接口实现的,io.Reader 一旦读取数据,数据就不会再保留。因此,第二次调用无法再次读取数据。
解决方案 -
可以使用ShouldBindBodyWithJSON对于json传参的多次bind
三、为什么form-data格式的数据却不受影响呢
主要原因
- form-data 解析机制: form-data 是通过解析表单数据来进行绑定的,数据保存在内存中或者由文件系统管理。每次绑定时,gin 会重新读取并解析表单数据。因此,form-data 可以绑定多次,不会像 JSON 那样被消耗掉。
- 请求体的重用: 在 form-data 的情况下,数据是通过键值对形式提交的,这些键值对在请求的生命周期内是可重复访问的。每次绑定时,gin 都会根据键值对重新进行绑定操作,不会像流式数据那样只能读取一次。
- 绑定方法的实现: gin 的 ShouldBind 在处理 form-data 时,会直接从解析后的表单数据中获取值,因此不依赖于一次性读取的流式数据。这使得 form-data 可以在同一个请求中绑定多次。