您的位置 首页 编程知识

如何解决 grpc-gateway 流式响应无法 decode 返回值的问题?

http 请求 grpc-gateway stream 流式响应无法 decode 返回值 针对 http 请…

如何解决 grpc-gateway 流式响应无法 decode 返回值的问题?

http 请求 grpc-gateway stream 流式响应无法 decode 返回值

针对 http 请求中流式响应时 decode 返回值失败的问题,经过排查,需要进行以下调整:

  1. 升级 hub.com/grpc-eystem/grpc-gateway 版本至 v2.4.0。
  2. 在 proto 文件中添加一个 httpresp message,将 resp message 作为其 result 字段。
  3. 在 decode 时使用 *pb.httpresp 而不是 *pb.resp。

修改后的 proto 文件:

message resp {     int32 code = 1;     string msg = 2; }  // 新增 message httpresp {     resp result = 1; }
登录后复制

修改后的单元测试:

package main  import (     "bytes"     "context"     "io"     "net/http"     "test/pb"     "testing"      "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"     "google.golang.org/grpc" )  func TestHttpRespStream(t *testing.T) {     url := "http://127.0.0.1:8080/query-stream-resp"     reqData := &pb.Req{Id: 1, Name: "111"}      var buffer bytes.Buffer     encoder := (&runtime.JSONPb{}).NewEncoder(&buffer)      if err := encoder.Encode(reqData); err != nil {         t.Fatal(err)     }      ctx, cancel := context.WithCancel(context.Background())     defer cancel()     req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, &buffer)     if err != nil {         t.Fatal(err)     }      resp, err := http.DefaultClient.Do(req)     if err != nil {         t.Fatal(err)     }     defer resp.Body.Close()      jsonb := new(runtime.JSONPb)     dencoder := jsonb.NewDecoder(resp.Body)      for {         var result *pb.HttpResp // 注意,使用 *pb.HttpResp 代替 *pb.Resp         err := dencoder.Decode(&result) // 注意,使用 io.EOF 判断结束而不是 resp.Body.Read() 返回 (nil, io.EOF)         if err == io.EOF {             break         }         if err != nil {             t.Fatal(err)         }         t.Logf("resp: %v", result)     } }
登录后复制

以上就是如何解决 grpc-gateway 流式响应无法 decode 返回值的问题?的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/3235.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部