网关逻辑之请求解析
URL参数解析
在 restful风格
的API接口中会存在 /user/:id/deatail 这类风格的接口,应用网关接口为了方便管理以及后续扩展,不对外提供此类接口
QUERY解析
query参数解析相对简单,规则比较明确,解析URL参数即可
func ParseQuery(ctx *gin.Context) map[string]string {
query := make(map[string]string)
if nil != ctx && nil != ctx.Request && nil != ctx.Request.URL {
for paramName, valueList := range ctx.Request.URL.Query() {
if len(valueList) == 0 {
query[paramName] = ""
} else {
query[paramName] = valueList[0]
}
}
return query
}
return query
}
BODY解析
body解析比较特殊,根据不同的请求类型,有不同的请求BODY解析方式,下一章节会详细解析如何解析Body
HEADER解析
header解析,提取出所有网关请求的header数据,并转化为 map[string]string
进行数据存储, http的标准header可以查阅此文章
func ParseHeader(ctx *gin.Context) map[string]string {
headerData := map[string]string{}
if nil == ctx || nil == ctx.Request {
return headerData
}
for headerName, headerVal := range ctx.Request.Header {
if len(headerVal) > 0 {
headerData[headerName] = headerVal[0]
} else {
headerData[headerName] = ""
}
}
return headerData
}
COOKIE解析
cookie本质是一个特殊的headerKey,单独解析,并转化为 map[string]string
进行数据存储
func ParseCookie(ctx *gin.Context) map[string]string {
cookieData := map[string]string{}
if nil == ctx || nil == ctx.Request {
return cookieData
}
for _, itemCookie := range ctx.Request.Cookies() {
cookieData[itemCookie.Name] = itemCookie.Value
}
return cookieData
}
额外说明
说明
标准的http规范中,GET类请求 无请求body , POST类请求中 无请求query ,但这只是一种标准化的约定与规范,实际上 get请求带BODY 或者 post请求带query,都是可以正常解析的
http的请求方法参见 : HTTP的请求方法