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

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

自定义参数覆盖

修改请求参数最简单的方式,是通过自定义参数来覆盖客户端提交的参数。因为自定义参数在参数解析的优先级最高,因此在全量获取请求参数(不是通过特定的提交方式获取参数)时,会使用自定义参数来覆盖掉其他提交方式的参数。这种修改方式比较常见,特别是使用规范路由时,接收参数时一个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内容。



Content Menu

  • No labels

2 Comments

  1. r.Body = io.NopCloser(bytes.NewBuffer([]byte(新的内容)))
    r.ReloadParam()



  2. s.Group("/:adminPath", func(group *ghttp.RouterGroup))
    s.Group("/", func(group *ghttp.RouterGroup))
    


    :adminPath 为后台配置的后台访问地址 
    / 则为前台地址
    我开始是想用 中间件的 next来进行处理,但是好像不能执行下一个匹配的地址,
    那么如何通过此写法来区分他是需要后台还是前台呢?
     如何处理多选一这种路由问题?