目前在做一个微型网关,一期的功能就是接收请求、匹配路由、鉴权、转发请求,再把响应接住并动态添加字段最后返回给调用方。

简单来说就是把请求方的响应接住,并在外层加上网关层特有的字段,如下

{
	"response": {
		"data":[],
		"traceId":"1212121212112"
	}
}

其中 response 和 traceId 就是网关动态加的,这个可以利用 golang 里的 map 属性来实现。

ret  := map[string]interface{}{}
data := map[string]interface{}{}

首先,定义两个 map 变量,其中 ret 是外层的 map,data 则是内层具体的 map。

content, _ := ioutil.ReadAll(res.Body)
json.Unmarshal([]byte(content), &data)

其次,使用 data 接住 json.Unmarshal 解析返回的 json 串。

data["traceId"] = "1212121212112"
ret["response"] = data
str, _          = json.Marshal(ret)

w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, string(str))

最后,动态添加 traceId 和 response 字段并转成 json 字符串返回给调用方。