跳到主要内容
版本:2.7.x

如何通过中间件修改请求参数​

在了解如何修改请求参数之前,请先了解一下请求参数输入的一些细节知识: 请求输入🔥

自定义参数覆盖​

修改请求参数最简单的方式,是通过 自定义参数 来覆盖客户端提交的参数。因为自定义参数在参数解析的优先级最高,因此在 全量获取请求参数(不是通过特定的提交方式获取参数)时,会使用自定义参数来覆盖掉其他提交方式的参数。这种修改方式比较常见,特别是使用规范路由时,接收参数时一个 struct 对象,底层是通过全量获取参数后再转换为 struct 对象。

但是如果用户是用过 r.GetQuery, r.GetForm 来获取参数时,自定义参数覆盖将会失效。而 r.Get 或者 r.GetRequest 方式获取参数,也可以实现参数覆盖的效果。

修改特定请求方式的参数​

也可以在中间件中通过修改 r.URL.RawQuery 或者 r.Body 来修改原始参数,但是在修改完毕后,需要调用 r.ReloadParam() 来标识下一次获取请求参数时将重新解析参数。

通过中间件修改请求Body的注意事项​

当通过中间件修改 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 内容。