如何用Cro、HTTP::Tiny等库实现等价于curl的音频文件POST请求?
将curl POST命令转换为Raku实现(HTTP::Tiny & Cro::HTTP::Client)
1. HTTP::Tiny 实现
利用HTTP::Tiny自动处理multipart编码的能力,直接映射curl参数即可:
use HTTP::Tiny; my $audio-file = '/path/to/file/audio.mp3'.IO; my $token = 'TOKEN'; # 替换为你的实际授权令牌 my $response = HTTP::Tiny.post: 'https://api.someservice.com/v1/', headers => { Authorization => "Bearer $token" }, content => { file => $audio-file, transformer => 'trans-2', format => 'text' }; # 处理响应结果 if $response<success> { say $response<content>.decode; } else { say "请求失败: {$response<status>} {$response<reason>}"; say $response<content>.decode if $response<content>; }
2. Cro::HTTP::Client 实现
Cro需要手动构建multipart/form-data请求体,示例如下:
use Cro::HTTP::Client; use Cro::HTTP::Body::MultiPart; my $audio-file = '/path/to/file/audio.mp3'.IO; my $token = 'TOKEN'; # 替换为你的实际授权令牌 # 构建multipart表单 my $form = Cro::HTTP::Body::MultiPart.new; $form.add-part( name => 'file', filename => $audio-file.basename, content-type => 'audio/mpeg', body => $audio-file.slurp(:bin) ); $form.add-part(name => 'transformer', body => 'trans-2'); $form.add-part(name => 'format', body => 'text'); # 发送POST请求 my $response = await Cro::HTTP::Client.post( 'https://api.someservice.com/v1/', headers => { Authorization => "Bearer $token", 'Content-Type' => $form.content-type }, body => $form ); # 处理响应结果 if $response.status ~~ 200..299 { say await $response.body-text; } else { say "请求失败: {$response.status} {$response.reason-phrase}"; say await $response.body-text if $response.has-body; }
补充说明
- HTTP::Tiny会自动识别
content中的IO对象,将其作为文件字段处理,并自动生成正确的multipart/form-data请求头。 - Cro需手动创建
MultiPart对象,分别添加文件字段(需指定文件名、内容类型并读取二进制内容)和普通文本字段,确保请求体格式符合要求。
内容的提问来源于stack exchange,提问作者Anton Antonov
相关产品推荐
相关产品推荐

