В настоящее время я пытаюсь вернуть msgpack http://msgpack.org/ из службы ruby sinatra и проанализировать его с помощью javascript. Я использую библиотеку javascript, найденную здесь: https://github.com/uupaa/msgpack.js/ (хотя я не думаю, что это имеет отношение к этому вопросу).
У меня есть служба sinatra, которая делает следующее с помощью gem msgpack:
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
.
Затем я попробовал два варианта:
content_type 'application/octet-stream'
и
content_type 'application/octet_stream', :charset => 'binary'
на стороне сервера. Первый ничего не изменил, но последний подошел ближе, оставив большинство сообщений нетронутыми, за одним исключением: первый символ был преобразован из 0x82
в 0x201a
.
Я подозреваю, что есть комбинация типов charset / content, которая исправит это, что я еще не пробовал. Я также всегда мог вернуться к Base64, но я хотел бы понять, что нужно для того, чтобы он работал без Base64.