RPGLE中使用IBM i QSYS2 SQL HTTP函数调用Twilio发短信报21604错误
RPGLE调用QSYS2 SQL HTTP函数对接Twilio发短信报21604错误解决方案
核心错误根因
你写的两段代码都存在直接触发报错的问题,具体如下:
- 两段代码的
Content-Type头均存在拼写错误:你配置的是application/x-www-form-urlencode,末尾缺少字母d,正确值为application/x-www-form-urlencoded。该拼写错误会导致Twilio服务端不会按表单格式解析请求体,所有传入的参数都会被丢弃,直接返回「缺少To号码」的21604错误。 - 变量传参版本额外错误:Twilio的消息发送接口不支持JSON格式请求体,你用
JSON_OBJECT生成JSON串作为请求内容,即使Content-Type拼写正确,服务端也无法解析到任何参数。 - 全硬编码版本额外错误:收发信号码未加
+开头的完整国家码前缀,不符合Twilio的号码格式规范,即使请求头正确也会触发号码校验错误。
排查修正步骤
- 第一步修正Content-Type拼写:将options配置里的
application/x-www-form-urlencode改为application/x-www-form-urlencoded,不要多字少字。 - 第二步修正请求体格式:放弃JSON格式请求体,必须拼接为
key=value&key=value的标准URL编码表单格式;短信内容、号码等参数值建议用QSYS2.URL_ENCODE函数做转义,避免特殊字符(空格、&、中文等)导致参数解析失败。 - 第三步修正号码格式:所有传入的To、From号码必须以
+开头,后跟完整国家码+手机号,例如中国手机号格式为+86185xxxxxxxx,美国Twilio号码格式为+194xxxxxxxx,不能省略+号。 - 第四步校验鉴权配置:你用的
basicAuth格式是正确的,注意账号SID和鉴权Token之间的逗号前后不要加空格,避免鉴权失败。 - 额外环境校验:确认IBM i分区已开启TLS 1.2及以上版本支持、有访问外网的权限,Twilio接口不支持低版本TLS协议。
可直接运行的正确代码示例
dcl-s account_Sid varchar(40) inz('AC替换为你的Twilio账号SID'); dcl-s auth_Token varchar(40) inz('替换为你的Twilio鉴权Token'); dcl-s url varchar(2000); dcl-s request varchar(2000); dcl-s response varchar(5000); dcl-s options varchar(1000); dcl-s to_num varchar(20) inz('+86185xxxxxxxx'); // 替换为实际收件人号码,带+和国家码 dcl-s from_num varchar(20) inz('+194xxxxxxxx'); // 替换为你在Twilio申请的发信号码 dcl-s sms_content varchar(1000) inz('This is a test text'); // 拼接URL编码表单格式请求体 exec sql values 'To=' concat QSYS2.URL_ENCODE(:to_num) concat '&From=' concat QSYS2.URL_ENCODE(:from_num) concat '&Body=' concat QSYS2.URL_ENCODE(:sms_content) into :request; // 拼接请求地址 url = 'https://api.twilio.com/2010-04-01/Accounts/' concat account_Sid concat '/Messages.json'; // 配置请求头和鉴权,注意Content-Type拼写 options = '{"basicAuth":"' concat account_Sid concat ',' concat auth_Token concat '",' concat '"header":"content-type,application/x-www-form-urlencoded"}'; // 发起POST请求 exec sql values QSYS2.HTTP_POST(:url, :request, :options) into :response; // 调试时可放开下面行打印返回结果 // dsply response;
调试技巧
如果修正后仍有问题,可以先把拼接完成的request、options、url变量值打印出来,用接口调试工具构造完全一致的请求发送,先排除参数拼接错误,再排查IBM i侧的系统配置问题。
内容的提问来源于stack exchange,提问作者Drstoneii
相关产品推荐
相关产品推荐

