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

使用 Go 解组 PubSub 请求数据 []bytes

使用 Go 解组 PubSub 请求数据 []bytes

Go
慕妹3242003 2022-01-17 10:30:16
我有一个从 Google PubSub 请求接收数据的端点。根据这个 repo,对象是这样的:type pushRequest struct {    Message struct {        Attributes map[string]string        Data       []byte        ID         string `json:"message_id"`    }    Subscription string}数据字段的格式一致,如下所示:type Data struct {    Key  string                 `json:"key"`    Body string                 `json:"body"`    Meta map[string]interface{} `json:"meta"`}我可以明显地用这样的方式解组 JSON 请求:f := &pushRequest{}json.Unmarshal(msg, &f)剩下的 []bytes 字段。根据文档,我可以做这样的事情来转换为字符串messages = append(messages, string(f.Message.Data))这没有帮助,因为我需要它作为一个结构。我可以再次解组数组:var m Datajson.Unmarshal(f.Message.Data, &m)尝试将 pushRequest 结构中的字段类型更改为 Data 但没有成功。空白的...有没有一种方法可以一次性打开包装?做两次似乎很荒谬。如果很明显,我就是看不到!
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

decoder := json.NewDecoder(r.Body)

psmsg := &PushRequest{}

decoderErr := decoder.Decode(&psmsg)


if decoderErr != nil {

    // Error... 

    return

}


data := Data{}

unmarshalErr := json.Unmarshal([]byte(string(psmsg.Message.Data)), &data)


if unmarshalErr != nil {

    // Error...

    return

}


查看完整回答
反对 回复 2022-01-17
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

这是我的云功能的一个片段,它用作发布/订阅推送端点。关键是您首先必须使用PushRequest结构解码主体。接下来,您可以将消息数据转换为结构。根据文档,其中的Data字段Message是 base-64 编码的字符串,因此您必须先对其进行解码。


type PushRequest struct {

    Message      pubsub.PubsubMessage `json:"message"`

    Subscription string               `json:"subscription"`

}


type Example struct {

    ID string `json:"id" firestore:"id"`

}


func HTTPEndpoint(w http.ResponseWriter, r *http.Request) {

    var pr common.PushRequest

    if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {

        log.Fatalf("Could not decode body: %v", err)

        return

    }


    data, err := base64.StdEncoding.DecodeString(pr.Message.Data)

    if err != nil {

        log.Fatalf("Base64: %v", err)

        return

    }


    var example Example

    if err := json.Unmarshal(data, &example); err != nil {

        log.Fatalf("Json: %v", err)

        return

    }


    // Do something useful with the struct

}


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信