我正在尝试使用WebService::Soundcloud
将声音上传到soundcloud。到目前为止,我已经按照the WebService::Soundcloud
documentation提供的示例提出了几个GET / POST请求。
但是,在传递所需参数(即track)时,我无法在任何地方找到一个体面的例子,其中包括asset_data,title e.t.c.我想知道我是否应该发送多部分消息。
任何例子都将不胜感激!
此外,这是我到目前为止所尝试的:在验证并获得有效的WebService::Soundcloud
实例之后。
GET my $response = $scloud->get( '/me/tracks' );
PUT my $response = $scloud->put( '/me/tracks/91576621', JSON::to_json({track=>{title=>"My test title",description=>"My test description"}}) );
POST my $file = '/home/ski/track1.mp3';
my $asset_data = File::Slurp::read_file( $file, binmode => ':raw' );
my $response = $scloud->post('/me/tracks', '{"track":{"title":"My test title","asset_data":"'.$asset_data.'"}}' );
这失败,“请求实体包含无效的字节序列。请传输有效的UTF-8”
答案 0 :(得分:0)
您提供的示例手动构造了JSON,但没有考虑文件内容的二进制性质,这意味着它不太可能起作用。由于缺乏转义/正确的编码,滥用内容更改您的JSON也很容易。
您引用的文档中有一个 put 示例,该示例演示了需要将内容编码为JSON,然后传递给库。我没有使用过此api,但根据示例,它可能是使用 encode_json 的简单情况。我将展示一个等效于您的手动编码的示例:
use JSON qw(encode_json);
my $asset_data = "ascii, quotes (\"'), non-ascii: \000\001\002\003";
my $content = encode_json({ track => { title => "My test title",
asset_data => $asset_data}});
print $content . "\n"; ### inspection of encoding
这表明JSON使用UTF-8表示形式来处理二进制数据:
{"track":{"asset_data":"ascii, quotes (\"'), non-ascii: \u0000\u0001\u0002\u0003","title":"My test title"}}
键/值在那里被重新排序,但是等效于JSON。