Skip to content

网关逻辑之请求解析

404字约1分钟

2024-10-15

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的请求方法