在了解如何修改请求参数之前,请先了解一下请求参数输入的一些细节知识:请求输入🔥
修改请求参数最简单的方式,是通过自定义参数来覆盖客户端提交的参数。因为自定义参数在参数解析的优先级最高,因此在全量获取请求参数(不是通过特定的提交方式获取参数)时,会使用自定义参数来覆盖掉其他提交方式的参数。这种修改方式比较常见,特别是使用规范路由时,接收参数时一个struct
对象,底层是通过全量获取参数后再转换为struct
对象。
但是如果用户是用过r.GetQuery, r.GetForm
来获取参数时,自定义参数覆盖将会失效。而r.Get
或者r.GetRequest
方式获取参数,也可以实现参数覆盖的效果。
也可以在中间件中通过修改r.URL.RawQuery
或者r.Body
来修改原始参数,但是在修改完毕后,需要调用r.ReloadParams()
来标识下一次获取请求参数时将重新解析参数。
当通过中间件修改r.Body
时常遇到的一个问题,是r.Body
只允许读取一次,后续的读取都将读取不到数据,这是标准库http.Request
的设计。在GoFrame
框架的ghttp.Request
对象中,允许通过框架ghttp.Request
的GetBody
、GetBodyString
方法连续读取Body
内容。
但是,如果是在中间件中自行通过标准库http.Request
对象直接读取r.Body
,那么建议通过重新赋值r.Body
或者通过io.NopCloser
重新包裹赋值给r.Body
便于后续中间件或者流程进一步读取Body
内容。