目前在做一个微型网关,一期的功能就是接收请求、匹配路由、鉴权、转发请求,再把响应接住并动态添加字段最后返回给调用方。
简单来说就是把请求方的响应接住,并在外层加上网关层特有的字段,如下
{
"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 字符串返回给调用方。