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

时间:2014-06-19 14:37:38

标签: java jquery ajax 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

现在我想用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字节数组?

2 个答案:

答案 0 :(得分:1)

不确定您是否找到了解决方案,但Google协议缓冲区现在附带了javascript编译器。

一旦构建了要与proto构建器一起发送的对象,就可以使用以下命令使用jQuery发送数据:

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#MyModal<?php echo $object['id']?>">
     Details
</button>

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

答案 1 :(得分:0)

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

  

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

你可能试图从你的protobuffer发送原始二进制字节,这与UTF-8不兼容。

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