2014-06-19 14 views
6

Mit https://github.com/dcodeIO/ProtoBuf.js/ ich eine Botschaft, die ich zu einem ByteBuffer zu einem Java-Server senden möchten verschlüsselt senden Charge genannt:Ajax eine Proto-buf-Nachricht an einen Java-Server

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 

Jetzt möchte ich dies senden mit jquery's Ajax:

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

Aber ich kann nicht scheinen, dies zu tun. Der obige Code gibt mir die jquery Ausnahme:

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 

Wenn ich ein Array-Puffer von Charge erhalten (batch.toArrayBuffer()) der Java-Server bekommt nichts von

ByteStreams.toByteArray(req.getInputStream()); 

Wie soll ich das ByteBuffer kodieren so senden? Und wie soll ich es in ein Java-Byte-Array entschlüsseln?

+1

Haben Sie Glück dabei? Ich setze den contentType auf application/x-protobuf und das Objekt auf der Java-Seite ist nicht null, hat aber nicht die gesendeten Werte. Ideen? – SergioM

+0

ProtoBuf.js verwendet das ursprüngliche Protokoll protobuf, das über ein binäres Protokoll (wie Websockets) gesendet werden soll, weshalb die Daten mit "ByteBuffer" gespeichert werden. Was Sie suchen, klingt mehr wie "PBLite", das ist Google JS datenähnliche Marke von Protobuf (die als indizierte JS-Array gesendet wird). – user120242

+0

Wenn Sie sich für blite interessieren: http://closure-library.googlecode.com/git-history/docs/namespace_goog_proto2.html Ein paar Leute hier und da entwickelt einige pblite Tools – user120242

Antwort

0

Von Dokumentation des JQuery auf Ajax (http://api.jquery.com/jquery.ajax/):

Hinweis: Die W3C XMLHttpRequest-Spezifikation schreibt vor, dass die charset immer UTF-8 ist; Wenn Sie einen anderen Zeichensatz angeben, wird der Browser nicht gezwungen, die Codierung zu ändern.

Sie versuchen wahrscheinlich, rohe Binärbytes von Ihrem Protobuffer zu senden, der nicht mit UTF-8 kompatibel ist.

Ich bin nicht vertraut mit ProtoBuf.js, aber von ein wenig graben Online sieht es aus wie es eine ToBase64() -Methode zur Verfügung steht für die Codierung der Protobuf als Base64 String. Versuchen Sie, diese Methode zu verwenden, um die Daten zu senden, und dann auf dem Server von Base64 zu dekodieren.

+1

Beendet diese Art der Zweck nicht wenn Sie es als Base64 intermediär codieren müssen – user120242

0

Nicht sicher, ob Sie eine Lösung gefunden haben, aber Google Protocol Buffers jetzt mit einem Javascript-Compiler kommen.

Sobald Sie Ihr Objekt aufgebaut haben mit dem Proto-Builder zu senden, können Sie Daten senden Verwendung von jQuery mit dem folgenden:

$.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 ist notwendig jQuery Serialisierung der Daten im Hintergrund zu vermeiden .

Verwandte Themen