我正在着火并忘记接受 http POST 请求并从请求主体收集所需数据的微服务,然后请求主体中的给定 URL。我遇到的问题是输入数据中的标头数量是动态的,这意味着可以有 1 个或多个标头。它不同。因此,我将传入的 requestBody 解组为以下结构:type Request struct { Headers json.RawMessage `json:"headers"` Method string `json:"method"` Body json.RawMessage `json:"body"`}type Event struct { Url string `json:"url"` Request Request `json:"request"`}和:var newEvent EventreqBody, err := ioutil.ReadAll(r.Body)if err != nil { fmt.Fprintln(w, err)}err2 := json.Unmarshal(reqBody, &newEvent)if err2 != nil { fmt.Fprintln(w, err2)}创建请求时,正文很容易传递:req, err := http.NewRequest(newEvent.Request.Method , newEvent.Url, bytes.NewBuffer(newEvent.Request.Body))if err != nil { panic(err)}但是在设置标题时,我找不到任何只传递 json.RawMessage 格式的好方法。最理想的是,我只想做这样的事情:req.Header = http.Header{newEvent.Request.Headers}是否有任何智能解决方案,或者我是否必须选择将标头解组为字符串,然后解析字符串并将它们全部添加http.Header.Add()?
2 回答

慕工程0101907
TA贡献1887条经验 获得超5个赞
事实上,有一个使用map! 如果将来有人遇到这个问题,这就是我所做的:
var headerMap map[string]interface{}
json.Unmarshal([]byte(newEvent.Request.Headers), &headerMap)
for key, element := range headerMap {
headerKey := fmt.Sprintf("%s", key)
headerElement := fmt.Sprintf("%s", element)
req.Header.Add(headerKey, headerElement)
}
无需准确指定输入,动态json.RawMessage声明工作得很好。

函数式编程
TA贡献1807条经验 获得超9个赞
有什么聪明的解决方案吗?
不。
[...] 还是我必须选择将标头解组为字符串,然后解析字符串并使用 http.Header.Add() 添加它们?
是的。
(除非您重新设计输入并删除 json.RawMessage。)
总的来说,Go 中没有捷径、巧妙的 hack、魔豆或语法糖来避免一些代码。
- 2 回答
- 0 关注
- 148 浏览
添加回答
举报
0/150
提交
取消