0

Sinatra と MessagePack を使用して API を構築しようとしていますが、自分自身を撃とうとしています :)

したがって、curl を使用して POST を実行しています。

curl -X POST -H "Content-Type: application/x-msgpack" --data-binary '\x82\xA4uuid\xBD8asd76a-a8s7a6d87-asd76as8d76\xABcampaign_id\xA12' http://localhost:9393/

今シナトラで私はただやります:

MessagePack.unpack request.body.read

そして、これは次のエラーにつながります:

MessagePack::MalformedFormatError Exception: extra bytes follow after a deserialized object

request.body.read が返されるため:

"\\x82\\xA4uuid\\xBD8asd76a-a8s7a6d87-asd76as8d76\\xABcampaign_id\\xA12"

instead of
"\x82\xA4uuid\xBD8asd76a-a8s7a6d87-asd76as8d76\xABcampaign_id\xA12"

force_encoding(Encode::BINARY) やその他のばかげたことなど、考えられることはすべて試しました。ルビー、ラック、シナトラのどちらが問題を引き起こしているのかわかりません。

4

1 に答える 1

2

curl --data-binary問題は、コマンドラインから何を期待するかです。'\x82'Ruby のような構文を使用してバイト値に処理することはありません。文字をそのまま投稿します ( "\\x82"Ruby で文字列を調べると、このようになります)。

代わりに curlの構文を使用し、@filename代わりに MessagePack を使用して生成したデータ ファイルを保存します ( 'wb'Ruby でモードを に設定してください)。

curl -X POST -H "Content-Type: application/x-msgpack" --data-binary @test.dat http://localhost:9393/

テストファイルを作成する Ruby:

msg = MessagePack.pack( 
  "uuid" => "8asd76a-a8s7a6d87-asd76as8d76", 
  "campaign_id" => "2"
) 
File.open( 'test.dat', 'wb' ) do |file|
  file.write( msg )
end
于 2014-04-28T15:24:16.490 に答える