You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl手动构建Twilio短信请求包遇400错误,求正确格式

解决Twilio API 400错误(错误码21604)的方案

问题根源

Twilio的短信发送端点(/2010-04-01/Accounts/{AccountSID}/Messages.json)默认不支持JSON格式的请求体,它要求使用application/x-www-form-urlencoded格式(和HTML表单提交的参数格式一致)。你之前用JSON传递To/From/Body字段,Twilio无法解析这些参数,因此会误判为缺少必填的To字段。

正确的请求格式与Perl实现

1. 核心要求

  • 请求头必须设置 Content-Type: application/x-www-form-urlencoded
  • 必须通过基础认证(Basic Auth)验证身份:用你的Twilio Account SID作为用户名,Auth Token作为密码,编码后放在Authorization头中
  • 所有号码必须使用E.164标准格式(带+号和国家代码,例如中国号码为+8613xxxxxxxxx,美国号码为+1xxxxxxxxx)

2. Perl代码示例(基于LWP::UserAgent)

use LWP::UserAgent;
use URI::Encode qw(uri_encode);
use MIME::Base64;

# 替换为你的Twilio账号信息
my $account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
my $auth_token = 'your_auth_token_here';
my $twilio_from = '+1234567890'; # 你的Twilio发送号码
my $to_number = '+8613xxxxxxxxx'; # 接收短信的号码

# 构建请求参数
my %params = (
    To   => $to_number,
    From => $twilio_from,
    Body => '气温低于冰点,请注意防冻!'
);

# 将参数编码为x-www-form-urlencoded格式
my $encoded_params = join('&', map { 
    uri_encode($_) . '=' . uri_encode($params{$_}) 
} keys %params);

# 初始化请求客户端
my $ua = LWP::UserAgent->new;
my $api_url = "https://api.twilio.com/2010-04-01/Accounts/$account_sid/Messages.json";

# 发送POST请求
my $response = $ua->post(
    $api_url,
    Content        => $encoded_params,
    Authorization  => 'Basic ' . encode_base64("$account_sid:$auth_token", ''),
    Content_Type   => 'application/x-www-form-urlencoded'
);

# 处理响应
if ($response->is_success) {
    print "短信发送成功:" . $response->decoded_content . "\n";
} else {
    print "发送失败:" . $response->status_line . "\n";
    print "错误详情:" . $response->decoded_content . "\n";
}

3. 可选:使用JSON格式发送请求

如果坚持要用JSON格式,需要额外设置Accept: application/json请求头,同时确保请求体是标准JSON格式,但Twilio官方更推荐表单编码格式,兼容性更好。示例片段:

use JSON;

# 构建JSON请求体
my $json_body = encode_json(\%params);

# 发送请求时修改头和内容
my $response = $ua->post(
    $api_url,
    Content        => $json_body,
    Authorization  => 'Basic ' . encode_base64("$account_sid:$auth_token", ''),
    Content_Type   => 'application/json',
    Accept         => 'application/json'
);

验证参考

对比Twilio官方提供的CURL示例,其本质就是使用表单编码格式传参,和上述Perl代码逻辑一致:

curl -X POST "https://api.twilio.com/2010-04-01/Accounts/ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Messages.json" \
--data-urlencode "To=+14155551234" \
--data-urlencode "From=+15017122661" \
--data-urlencode "Body=Hello from Twilio!" \
-u ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:your_auth_token

内容的提问来源于stack exchange,提问作者Mike Lempriere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:14:56