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/

现在在 Sinatra 我只是这样做:

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) 和其他愚蠢的东西。而且我不确定是谁导致了 ruby​​、rack 或 sinatra 问题?

4

1 回答 1

2

问题是您希望curl --data-binary从命令行执行的操作。它不'\x82'使用类似 Ruby 的语法处理成字节值。它按原样发布字符("\\x82"如果您在 Ruby 中检查字符串,看起来就像这样)。

请改用@filenamecurl 的语法,并保存使用 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 回答