使用ajax向Java服务器发送Proto-buf消息

9

我使用https://github.com/dcodeIO/ProtoBuf.js/将一条消息编码成了一个名为batch的ByteBuffer,我想将其发送给一个Java服务器。

batch:
  ByteBuffer {array: ArrayBuffer, view: DataView, offset: 0, markedOffset: -1, length: 139…}
    array: ArrayBuffer
    length: 139
    littleEndian: false
    markedOffset: -1
    offset: 0
    view: DataView
    __proto__: Object

现在我想用jQuery的Ajax发送这个请求:
  $.ajax({
    url: myUrl,
    type: 'POST',
    data : batch,
    contentType: 'application/protobuf',
    accept: 'application/json'
  })

但是我似乎做不到这一点。上面的代码给了我jquery异常:
Uncaught TypeError: Cannot set property 'littleEndian' of undefined myScript.js:1353
ByteBuffer.LE bunk.js:1353
jQuery.param.add jquery.js:7203
buildParams jquery.js:7261
jQuery.param jquery.js:7223
jQuery.extend.ajax

如果我从批处理中获取一个数组缓冲区(batch.toArrayBuffer()),那么Java服务器将获取不到任何内容。
ByteStreams.toByteArray(req.getInputStream());

我应该如何编码ByteBuffer以便像这样发送?我应该如何将其解码为Java字节数组?


1
这个问题解决了吗?我将contentType设置为application/x-protobuf,Java端的对象不为空,但是没有发送的值。有什么想法吗? - SergioM
ProtoBuf.js使用原始的protobuf协议,该协议旨在通过二进制协议(如WebSockets)发送,这就是为什么数据使用“ByteBuffer”存储的原因。您要查找的更像是“PBLite”,这是Google的JS数据品牌protobuf(作为索引JS数组发送)。 - user120242
如果您对pblite感兴趣:http://closure-library.googlecode.com/git-history/docs/namespace_goog_proto2.html。一些人在这里和那里开发了一些pblite工具。 - user120242
2个回答

2

不确定您是否找到了解决方案,但是现在Google Protocol Buffers已经带有javascript编译器。

一旦您使用proto builder构建了要发送的对象,您可以使用以下代码使用jQuery发送数据:

    $.ajax({
        type: "PUT",
        url: "http://localhost:8088/user",
        data: user.serializeBinary(),
        success: function () {
            $("#message").text("User with key " + user.getApikey() + " saved");
        },
        contentType: "application/x-protobuf",
        processData: false
    });

ProcessData: false是必需的,以避免jQuery在后台序列化数据。


Protobuf3带有JS输出。 - towi

0

来自JQuery的ajax文档(http://api.jquery.com/jquery.ajax/):

注意:W3C XMLHttpRequest规范规定charset始终为UTF-8;指定其他charset将不能强制浏览器更改编码。

您可能正在尝试从您的Protobuf发送原始二进制字节,这与UTF-8不兼容。

我不熟悉ProtoBuf.js,但经过一些在线挖掘,看起来有一个toBase64()方法可用于将protobuf编码为base64字符串。请尝试使用该方法获取要发送的数据,然后在服务器上解码base64。


1
如果您必须将其中间编码为Base64,那么这不是有些违背了它的目的吗? - user120242

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接