GRPC的HTTP返回值int64被转为string类型

问题描述

最近在使用http接口访问一个GRPC的服务时遇到一个数据类型转换的问题。一个时间戳字段在PB中定义的字段类型为uint64,返回到本地之后却是一个string类型,在我用uint64去接收这个字段时报了错。

原因分析

为什么GRPC要把int64转为string类型呢,他们的回答是遵循proto3的序列化规则,proto3的json-mapping中规定了int64/uint64/fixed64类型映射的json类型为string。如图:(PB文档地址:https://developers.google.com/protocol-buffers/docs/proto3#json

pb-josnMapping.jpg

很多人都质疑PB的这个行为,然而这并不能改变什么,下面是一个关于该问题的回答,大意就是:JS使用了52bit去实现IEEE754的双精度数,也就是说js在不丢失信息的情况下最大能表示的数是 2^52 。64位的数在JS中直接使用是会有问题了。PB为了客户端能正常处理数据而把64位数值直接转换为了string类型。


int64tostring-reasopn.jpg
问题解决

本人使用的是golang语言,在处理http返回值时,使用jsonpb包代替了json包去解析返回的二进制数据。不过解析出来的是message格式的,用的时候还需要进一步加工处理,相比较与转换string类型到int64,感觉还是简单一点。

resp, err := http.Post(addr+path, "application/json", buf)
if err != nil { 
    t.Error(err)
 } else {
    if resp.Body != nil {
        var result stat.ListDataRows_Response
        err = jsonpb.Unmarshal(resp.Body, &result)
        if err != nil {
            t.Error(err)
        } else {
            t.Logf("result:%+v", result)
        }
    } else {
        t.Log("result is nil")   
    }
}

返回值:
 result:{
     Rows:[
       timestamp:1571195630000 
       tags:<key:"rule_id" value:"518852" > 
       values:<key:"logs" value:"*******" >
    ] 
    NextPageToken:1571195630000
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • gRPC 是一个高性能、通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的...
    小波同学阅读 19,537评论 6 19
  • 原文出处:gRPC gRPC分享 概述 gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远...
    小波同学阅读 7,279评论 0 18
  • 1)简介 gRPC负载平衡的主要实现机制是外部负载平衡,即通过外部负载平衡器来向客户端提供更新后的服务器列表。 g...
    Jay_Guo阅读 13,346评论 6 22
  • 现如今微服务很流行,而微服务很有可能是使用不同语言进行构建的。而微服务之间通常需要相互通信,所以微服务之间必须在以...
    solenovex阅读 504评论 0 2
  • 【旧知】对Angie的认知停留在“开挂的互联网斜杠达人”,只是简单的认为她是抓住了知识付费IP红利的牛人之一。 【...
    逗妈麦西阅读 256评论 3 0