循环动态 json.RawMessage 数据并将其设置为 net/http 标头

我正在着火并忘记接受 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 Event

reqBody, 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()?


青春有我
浏览 149回答 2
2回答

慕工程0101907

事实上,有一个使用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声明工作得很好。

函数式编程

有什么聪明的解决方案吗?不。[...] 还是我必须选择将标头解组为字符串,然后解析字符串并使用 http.Header.Add() 添加它们?是的。(除非您重新设计输入并删除 json.RawMessage。)总的来说,Go 中没有捷径、巧妙的 hack、魔豆或语法糖来避免一些代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go