为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
青春有我 2023-02-21 12:57:58
我正在着火并忘记接受 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声明工作得很好。


查看完整回答
反对 回复 2023-02-21
?
函数式编程

TA贡献1807条经验 获得超9个赞

有什么聪明的解决方案吗?

不。

[...] 还是我必须选择将标头解组为字符串,然后解析字符串并使用 http.Header.Add() 添加它们?

是的。

(除非您重新设计输入并删除 json.RawMessage。)

总的来说,Go 中没有捷径、巧妙的 hack、魔豆或语法糖来避免一些代码。


查看完整回答
反对 回复 2023-02-21
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号