Featured image of post HTTP 请求中使用 protobuf 协议数据

HTTP 请求中使用 protobuf 协议数据

protobuf 通常在 rpc 请求中使用, 但某些场景我们也会在 HTTP 请求中使用

最近都在忙第三方广告对接的事情, 在此记录一下, 有些第三方的API文档扔了一个word文档,文档上几十上百个参数, 只有一个表格参数说明, 然后自己根据表格手写参数(真的折磨)

但是有几家就比较好, 会提供proto文件, 然后可以使用这个文件生成RequestResponse(点赞)


  • 对接的时候, 可以找商务人员问有没有提供proto文件, 然后拿来自己生成代码
    • protoc pb\xxx.proto --go_out=.
    • 生成之后, 请求参数, 响应参数, 枚举参数等等都有了, 对于后端对接非常舒服(希望以后后端的接口对接都能变成这样子)
  • 实际发送请求的示例代码如下
package main

import (
	"bytes"
	"io/ioutil"
	"log"
	"net/http"

	"github.com/golang/protobuf/proto"
	"xxxx/internal/pb"
)

func main() {
	getDataByAdServe()
}

func getDataByAdServe() {

    // 序列化请求数据
    r := &pb.AdProfRequest{}
    data, er := proto.Marshal(r)
    if er != nil {
        log.Fatal(er)
        return
    }
    
    // 发送 HTTP 请求, 注意实际使用设置请求超时时间
    reader := bytes.NewReader(data)
    resp, err := http.Post("http://127.0.0.1:8001/xxx", "application/x-protobuf", reader)
    if err != nil {
        log.Println(err)
        return
    }
    defer resp.Body.Close()
    
    //
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println(err)
        return
    }
    
    // 反序列化响应
    var res pb.AdProfResponse
    if err := proto.Unmarshal(body, &res); err != nil {
        log.Println(err)
        return
    }
    
    log.Println(&res)
}