Perl WebService :: Soundcloud - 如何在上传到Soundcloud时传递轨道参数

fhu*_*ern 6 perl soundcloud

我正在尝试将声音上传到soundcloud使用WebService::Soundcloud.到目前为止,我已经能够按照WebService::Soundcloud文档提供的示例进行一些GET/POST请求.

但是,我无法在传递所需参数(如轨道)的任何地方找到一个体面的例子,其中包括asset_data,title等.我想知道我是否应该发送多部分消息.

任何例子将不胜感激!

此外,这是我到目前为止所尝试的:在验证并获得有效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.'"}}' );
Run Code Online (Sandbox Code Playgroud)

这失败,"请求实体包含无效的字节序列.请传输有效的UTF-8"

小智 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
Run Code Online (Sandbox Code Playgroud)

这表明 JSON 使用 UTF-8 表示来处理二进制数据:

{"track":{"asset_data":"ascii, quotes (\"'), non-ascii: \u0000\u0001\u0002\u0003","title":"My test title"}}
Run Code Online (Sandbox Code Playgroud)

键/值在那里重新排序,但它是等效的 JSON。