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

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

自定义参数覆盖

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

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

修改特定请求方式的参数

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

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

当通过中间件修改r.Body时常遇到的一个问题,是r.Body只允许读取一次,后续的读取都将读取不到数据,这是标准库http.Request的设计。在GoFrame框架的ghttp.Request对象中,允许通过框架ghttp.RequestGetBodyGetBodyString方法连续读取Body内容。

但是,如果是在中间件中自行通过标准库http.Request对象直接读取r.Body,那么建议通过重新赋值r.Body或者通过io.NopCloser重新包裹赋值给r.Body便于后续中间件或者流程进一步读取Body内容。