gRPC-Gateway流式响应解码失败:如何解决runtime.JSONPb.Decode返回nil值的问题?

grpc-gateway流式响应解码失败:如何解决runtime.jsonpb.decode返回nil值的问题?

gRPC-Gateway流式响应解码难题:runtime.JSONPb.Decode返回nil值的有效解决方案

本文分析并解决使用HTTP请求gRPC-Gateway流式响应时,解码返回值失败的问题。问题表现为:HTTP请求的流式响应体内容正确,但runtime.jsonpb.Decode却始终返回nil值。

问题描述:

原始代码中,HTTP请求的流式响应体如下:

{"result":{"code":1,"msg":"1111"}}{"result":{"code":2,"msg":"2222"}}{"result":{"code":3,"msg":"3333"}}{"result":{"code":4,"msg":"4444"}}{"result":{"code":5,"msg":"5555"}}{"result":{"code":6,"msg":"6666"}}

登录后复制

使用runtime.jsonpb.Decode解码时,结果却是一系列nil值。原因在于gRPC-Gateway返回的JSON数据额外封装了一层result字段。直接使用*pb.resp作为解码目标类型导致解码失败。

解决方案:

此问题可以通过以下三步解决:

升级gRPC-Gateway版本: 确保使用最新版本的github.com/grpc-ecosystem/grpc-gateway/v2,例如v2.4.0或更高版本,以避免兼容性问题。

修改proto文件: 在.proto文件中添加一个新的message,匹配gRPC-Gateway返回的JSON结构(包含result字段):

message resp {  int32 code = 1;  string msg = 2;}message httpresp {  resp result = 1;}

登录后复制修改解码代码: 使用新的httpresp message作为解码目标类型,并使用指针接收解码结果:

var result *pb.httpresp // 使用 *pb.httpresperr := dencoder.Decode(&result) // 使用 &result,传入指针

登录后复制

修改后的单元测试代码示例:

package mainimport (    "bytes"    "context"    "net/http"    "test/pb"    "testing"    "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"    "google.golang.org/grpc")func TestHttpRespStream(t *testing.T) {    // ... (其余代码保持不变) ...    for {        var result *pb.httpresp // 使用 *pb.httpresp        err := dencoder.Decode(&result) // 使用 &result        if err == nil {            t.Logf("resp: %+v", result)        } else {            t.Logf("%+v", err)            break        }    }}

登录后复制

通过以上修改,即可成功解码gRPC-Gateway返回的流式响应数据。 记住要重新生成代码以反映.proto文件的更改。

以上就是gRPC-Gateway流式响应解码失败:如何解决runtime.JSONPb.Decode返回nil值的问题?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3046947.html

(0)
上一篇 2025年3月13日 18:33:39
下一篇 2025年3月13日 18:33:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • golang不支持泛型吗?

    Golang团队认为在类型系统和运行时的复杂性花费太大,还没找到可以和这个复杂性相抵的良好设计。 内置的map和slice其实都有泛型的味道,加上可以用interface{}来构造容器,可以达到泛型的效果。所以目前为止还没有直接的支持泛型。…

    2025年3月13日
    200
  • 关于golang之排序使用

    下面由golang教程栏目给大家介绍golang之排序使用,希望对需要的朋友有所帮助! golang标准库实现了许多常用的排序方法,比如对整数序列排序:sort.Ints(), 那么如果对自定义的数据结构排序怎么做呢? 比如对一个用户列表,…

    2025年3月13日
    200
  • git中push -u是什么意思

    在git中,“push -u”的意思是将本地的分支版本上传到远程合并,并且记录push到远程分支的默认值;当添加“-u”参数时,表示下次继续push的这个远端分支的时候推送命令就可以简写成“git push”。 本文操作环境:Windows…

    2025年3月13日
    200
  • 羊驼系列大模型和ChatGPT差多少?详细测评后,我沉默了

    前段时间,谷歌的一份泄密文件引发了广泛关注。在这份文件中,一位谷歌内部的研究人员表达了一个重要观点:谷歌没有护城河,OpenAI 也没有。 这位研究人员表示,虽然表面看起来 OpenAI 和谷歌在 AI 大模型上你追我赶,但真正的赢家未必会…

    2025年3月13日 编程技术
    200
  • golang可以用正则吗

    golang可以用正则。golang提供了简便而且高效的正则表达式功能,使得在处理文本时更加方便和灵活,golang提供了内置的正则表达式包regexp,用于支持正则表达式的相关功能,还提供了“MatchString()”和“Match()…

    2025年3月13日
    200
  • c#怎么获取字符串中的数字

    从 C# 字符串中提取数字的方法有五种:正则表达式、循环和 Char.IsDigit()、int.TryParse()、String.Split() 和 int.Parse()、LINQ。 如何从 C# 字符串中提取数字 从 C# 字符串中…

    2025年3月13日
    200
  • java怎么拆分多位数

    使用循环、字符串拆分或正则表达式即可将多位数拆分为个位、十位等各个组成部分:1. 使用循环逐位遍历数字;2. 将数字转换为字符串,再使用 split() 方法拆分;3. 使用正则表达式提取各个部分。 如何在 Java 中拆分多位数 在 Ja…

    2025年3月13日
    200
  • java如何判断字符串是数字

    java 中判断字符串是数字的方法 在 Java 中,可以判断一个字符串是否表示数字的方法有几种: 1. 使用内置方法 Integer.parseInt(String s):尝试将字符串解析为整数,如果成功,返回整数值;否则,抛出 Numb…

    编程技术 2025年3月13日
    200
  • 值得一读的Java书籍

    java 是市场上需求量最大的编程语言之一。 它的主要特点之一就是它在便携性方面具有强大的功能。 从书籍(和优质书籍)学习 Java 对于真正了解它的工作原理至关重要。 在这篇文章中我们将发现10本值得一读的Java书籍!!! 01.Jav…

    2025年3月13日 编程技术
    200
  • java爬虫教程资源

    Java 爬虫学习资源丰富,从入门级到进阶级,涵盖教程、笔记、实战项目等。入门级资源包括菜鸟教程、慕课网、极客时间等;进阶级资源则有掘金、CSDN和廖雪峰教程;实战项目可参考 GitHub、掘金和 CSDN;其他辅助资源包括 HTTP 协议…

    2025年3月13日
    200

发表回复

登录后才能评论