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

Jas*_*n S 7 java ajax jquery protocol-buffers arraybuffer

使用https://github.com/dcodeIO/ProtoBuf.js/我将要发送到java服务器的消息编码为名为batch的ByteBuffer:

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
Run Code Online (Sandbox Code Playgroud)

现在我想用jquery的Ajax发送它:

  $.ajax({
    url: myUrl,
    type: 'POST',
    data : batch,
    contentType: 'application/protobuf',
    accept: 'application/json'
  })
Run Code Online (Sandbox Code Playgroud)

但我似乎无法做到这一点.上面的代码给了我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
Run Code Online (Sandbox Code Playgroud)

如果我从批处理(batch.toArrayBuffer())获得数组缓冲区,Java服务器什么也得不到

ByteStreams.toByteArray(req.getInputStream());
Run Code Online (Sandbox Code Playgroud)

我应该如何编码ByteBuffer来发送这样的?我应该如何将其解码为java字节数组?

joe*_*e p 0

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

注意:W3C XMLHttpRequest 规范规定字符集始终为 UTF-8;指定另一个字符集不会强制浏览器更改编码。

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

我不熟悉 ProtoBuf.js,但从网上的一点挖掘来看,似乎有一个 toBase64() 方法可用于将 protobuf 编码为 base64 字符串。尝试使用该方法获取要发送的数据,然后在服务器上从 Base64 进行解码。