Protobuf : WebApi -> JS - 解码对象为空

Posted

技术标签:

【中文标题】Protobuf : WebApi -> JS - 解码对象为空【英文标题】:Protobuf : WebApi -> JS - Decoded object is empty 【发布时间】:2016-07-10 11:45:14 【问题描述】:

我想通过Ajax 请求将对象从WebApi 控制器发送到html 页面。

当我在 JS 中收到对象时,它是空的。但服务器端的对象不是空的,因为当我查看byte[].length 时,它大于 0。

服务器端,我用dll provided by Google。

JS 方面,我用的是ProtobufJS library。这是我的.proto 文件:

syntax="proto3";

message Container 
    repeated TestModel2 Models = 1;


message TestModel2 
    string Property1 = 1;
    bool Property2 = 2;
    double Property3 = 3;

服务器代码:

var container = new Container();

var model = new TestModel2

    Property1 = "Test",
    Property2 = true,
    Property3 = 3.14
;

container.Models.Add(model);

Base64 数据:

ChEKBFRlc3QQARkfhetRuB4JQA==

JS解码:

var ProtoBuf = dcodeIO.ProtoBuf;
var xhr = ProtoBuf.Util.XHR();
xhr.open(
    /* method */ "GET",
    /* file */ "/XXXX/Protobuf/GetProtoData",
    /* async */ true
);
xhr.responseType = "arraybuffer";
xhr.onload = function (evt) 
    var testModelBuilder = ProtoBuf.loadProtoFile(
        "URL_TO_PROTO_FILE",
        "Container.proto").build("Container");
    var msg = testModelBuilder.decode64(xhr.response); 
    console.log(JSON.stringify(msg, null, 4)); // Correctly decoded

xhr.send(null);

JS 控制台中的结果对象:


    "Models": []

bytebuffer.js

protobuf.js v5.0.1

【问题讨论】:

所以你的请求是成功的,只是——你收到的Object是空的?尝试直接在浏览器中运行请求并查看输出,然后与我们分享您的输出:) 好像JS解码消息时,对象是or空或者解码过程不能成功所以我得到了默认的状态对象“直接在浏览器”? 当我console.log 得到响应时,我得到了这个ArrayBuffer 所以我想响应是空的。但是在服务器端,当我在byte[] 中序列化我的对象时,长度> 0,我能够反序列化它并且它不是空的。另外,在 Chrome 控制台中,ajax 响应是 ChEKBFRlc3QQARkfhetRuB4JQA== 我投了赞成票,所以你的问题会被看到,我不擅长 javascript,所以任何客户端代码,我都没用。只要您收到您的对象并且它包含一些东西,我相信如果他们也看看这些 cmets,您会得到一个解决方案。祝你好运,你可能想要赏金它,因为这是一个大多数扫描阅读的深入问题。但同样,我希望你能找到解决办法! 好的,我明白了。我想我的代码中有一个愚蠢的错误,但不知道在哪里。无论如何,谢谢你的帮助! 【参考方案1】:

最后我自己解决了这个问题。

是客户端出了问题。

实际上xhr.response 是JSON 格式,所以它在双引号"ChEKBFRlc3QQARkfhetRuB4JQA==" 之间。我必须 JSON.parse 我的回复。enter code here 我删除了xhr.responseType = "arraybuffer";

这是我现在的代码:

var ProtoBuf = dcodeIO.ProtoBuf;
var xhr = ProtoBuf.Util.XHR();
xhr.open(
    /* method */ "GET",
    /* file */ "/XXXX/Protobuf/GetProtoData",
    /* async */ true
);
// xhr.responseType = "arraybuffer"; <--- Removed
xhr.onload = function (evt) 
    var testModelBuilder = ProtoBuf.loadProtoFile(
        "URL_TO_PROTO_FILE",
        "Container.proto").build("Container");
    var msg = testModelBuilder.decode64(JSON.parse(xhr.response)); <-- Parse the response in JSON format
    console.log(msg); // Correctly decoded

xhr.send(null);

【讨论】:

以上是关于Protobuf : WebApi -> JS - 解码对象为空的主要内容,如果未能解决你的问题,请参考以下文章

GRPC代替webapi Demo。

Netty如何使用Protobuf 序列化

slf4j-api.jar是干啥的

幂等性

postman测试post请求参数为json类型

PICE:MongoDBStreaming - gRPC -MGO Service