現在、ルビー シナトラ サービスからmsgpack http://msgpack.org/を返し、javascript を使用して解析しようとしています。ここにあるjavascriptライブラリを使用しています: https://github.com/uupaa/msgpack.js/ (ただし、この質問には関係ないと思います)。
msgpack gem を使用して次のことを行う sinatra サービスがあります。
require 'sinatra'
require 'msgpack'
get '/t' do
content_type 'application/x-msgpack'
{ :status => 'success', :data => {:one => "two", :three => "four"}}.to_msgpack
end
私は次のようにそれを読むJavaScriptを持っています:
<script src="js/jquery.js"></script>
<script src="js/msgpack.js"></script>
<script type="text/javascript">
function r() {
$.ajaxSetup({
converters: {
"text msgpack": function( packed ) {
if(packed != '') {
unpacked = msgpack.unpack(packed);
return unpacked;
}else{
return ''
}
}
}
});
$.ajax({
type: "GET",
url: "/t",
dataType: "msgpack",
success: function(data) {
alert(data)
}
})
}
$(document).ready(r)
</script>
問題は、データを取り戻すと、多くの文字がサーバー側のバージョンから0xfffd
.
次に、2 つのバリアントを試しました。
content_type 'application/octet-stream'
と
content_type 'application/octet_stream', :charset => 'binary'
サーバー側で。前者は何も変更しませんでしたが、後者は近づき、1 つの例外を除いてほとんどのメッセージは変更されませんでした: 最初の文字が から に変換され0x82
ました0x201a
。
まだ試していない、これを修正する文字セット/コンテンツタイプの組み合わせがあると思います。いつでも Base64 にフォールバックすることもできますが、最初に Base64 なしで機能させるには何が必要かを理解したいと思います。