请求Meta信息解析
约 478 字大约 2 分钟
2025-04-30
重要
在 restful风格
的API接口中会存在 /user/:id/deatail 这类风格的接口,应用网关接口为了方便管理以及后续扩展,不对外提供此类接口, 后端接口可以是restful风格的, 网关支持重写
Meta信息解析
上一节已经讲解过meta信息包含的内容,本内容直接讲述如何获取相关信息, gin自身已经提供了大量封装好的方法, 我们直接使用即可
请求接口
requestUrl = ctx.Request.URL.Path
注意事项
不要使用 ctx.Request.URL.String()
, 此方法获取出来的path会包含query信息, 不符合我们的预期
请求方法
requestMethod = ctx.Request.Method
请求类型
contentType := ctx.ContentType()
请求header
// parseHeader 解析header
func parseHeader(ctx *gin.Context) map[string]any {
headerData := map[string]string{}
for headerName, headerVal := range ctx.Request.Header {
if len(headerVal) > 0 {
// 注意判断长度, 防止索引越界
headerData[headerName] = headerVal[0]
} else {
headerData[headerName] = ""
}
}
return headerData
}
请求cookie
// parseCookie 解析cookie
func parseCookie(ctx *gin.Context) map[string]any {
cookieData := map[string]string{}
for _, itemCookie := range ctx.Request.Cookies() {
cookieData[itemCookie.Name] = itemCookie.Value
}
return cookieData
}
请求query
// parseQuery 解析query信息
func parseQuery(ctx *gin.Context) map[string]any {
query := make(map[string]string)
for paramName, valueList := range ctx.Request.URL.Query() {
// 注意判断长度, 防止索引越界
if len(valueList) == 0 {
query[paramName] = ""
} else {
query[paramName] = valueList[0]
}
}
return query
}
请求body
解析body是一个相对复杂的问题, 不同的请求方式随影不同的解析方法
, 下一节独立介绍解析body的实现, 本内容暂时约定好函数以及返回值:
// parseBody 解析请求body
func parseBody(ctx *gin.COntext) (map[string]any, error) {
return map[string]any{}, nil
}
总结
初始化请求context的完整代码如下:
// 初始化GatewayRequestContext
func InitGatewayRequestContext(ctx *gin.Context) (*GatewayRequestContext, error) {
requestContext := &GatewayRequestMeta{
Method: ctx.Request.Method,
ContentType: ctx.ContentType(),
Uri: ctx.Request.URL.Path
Body: map[string]any{},
Header: parseHeader(ctx *gin.Context),
Query: parseQuery(ctx *gin.Context),
Cookie: parseCookie(ctx *gin.Context),
}
var err error
if requestContext.Body, err = parseBody(ctx); nil != err {
return nil, err
}
retrun requestContext, nil
}