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
相关产品推荐
相关产品推荐

