HTTP 请求中使用 protobuf 协议数据

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

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

对接的时候，可以找商务人员问有没有提供proto文件，然后拿来自己生成代码

protoc pb\xxx.proto --go_out=.

生成之后，请求参数，响应参数，枚举参数等等都有了，对于后端对接非常舒服 (希望以后后端的接口对接都能变成这样子)

实际发送请求的示例代码如下

Copy
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)
}