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

Posted

技术标签:

【中文标题】Perl WebService::Soundcloud - 如何在上传到 Soundcloud 时传递轨道参数【英文标题】:Perl WebService::Soundcloud - how to pass track parameters while uploading to Soundcloud 【发布时间】:2013-05-03 14:20:03 【问题描述】:

我正在尝试使用 WebService::Soundcloud 将声音上传到 soundcloud。到目前为止,我已经能够按照the WebService::Soundcloud documentation 提供的示例发出几个 GET/POST 请求。

但是,我在任何地方都找不到一个像样的示例,说明如何在传递所需参数(即轨道)以及其中的资产数据、标题等时进行上传。我想知道我是否应该发送多部分消息。

任何示例将不胜感激!

此外,这是我迄今为止所尝试的:在验证并获得有效的 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”

【问题讨论】:

到目前为止您所做的任何代码示例(例如 GET/POST 请求)? 在验证并获得有效的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” 这是完整的错误信息,还是有更多信息?我不知道 Soundcloud API,也没有使用过 WebService::SoundcloudJSON::to_json - 但问题可能出在 JSON::to_json 的语法上。您是否尝试过使用 encode_json() 代替 PUT 请求的 WebService::Soundcloud 文档? @thunk 这就是$response->content() 中的全部内容。我确实尝试过encode_json() 以及我自己编写的 json 字符串。这可能不是问题,因为上面的 PUT 示例适用于 JSON::to_json 感谢您的回复!它必须在 perl 中,我正在做一个更大的项目,它完全是在 perl 中构建的。 【参考方案1】:

您提供的示例手动构建 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。

【讨论】:

以上是关于Perl WebService::Soundcloud - 如何在上传到 Soundcloud 时传递轨道参数的主要内容,如果未能解决你的问题,请参考以下文章

Perl - 如何查看Perl模块路径

Perl 之父同意 Perl 6 改名为 Raku

以后没有 Perl 6 了!Perl 之父同意改名

Perl基础速成

Perl 的 rpm 版本不同于“perl -v”

Perl语言入门