Java调用Twilio SMS API报缺少'To'手机号错误的问题咨询
问题根因
你的表单请求体编码逻辑存在错误:你将拼接好的完整参数字符串To=%s&From=%s&Body=%s整体做了URL编码,导致参数键值分隔符=、参数间分隔符&都被转义为特殊编码字符,Twilio服务端解析请求体时无法拆分出独立的参数键,自然识别不到To参数,最终返回21604报错。
你当前逻辑生成的请求体实际内容为:
To%3D%2B1123456789%26From%3D%2B1223456789%26Body%3DHello
服务端会将这整串内容识别为一个无键名的参数值,完全读取不到To、From、Body这些表单字段。
修复方法
URL编码只需要作用在每个参数的具体值上,编码完成后再用=连接键和编码后的值,用&连接不同键值对,最终生成合法的application/x-www-form-urlencoded格式请求体。
修正后可运行代码
var url = UriBuilder.fromUri( "https://api.twilio.com/2010-04-01/Accounts/MyAccount/Messages.json").build(); // 单独对每个参数值做URL编码 String encodedTo = URLEncoder.encode("+1123456789", StandardCharsets.UTF_8); String encodedFrom = URLEncoder.encode("+1223456789", StandardCharsets.UTF_8); String encodedBody = URLEncoder.encode("Hello", StandardCharsets.UTF_8); String formBody = String.format("To=%s&From=%s&Body=%s", encodedTo, encodedFrom, encodedBody); var request = HttpRequest.newBuilder(url) .headers("Authorization", "Basic " + base64, "Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(formBody)) .build(); HttpClient httpClient = HttpClient.newBuilder().build(); try { var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); // 调试时可打印状态码和响应内容排查问题 System.out.println(response.statusCode()); System.out.println(response.body()); } catch (IOException | InterruptedException e) { throw new RuntimeException(e); }
注意事项
- 代码中URL路径里的
MyAccount占位符需要替换为你自己的Twilio账号Account SID - 发信使用的
From号码必须是你在Twilio后台已完成购买、验证的有效号码,否则会触发权限类报错 - Basic认证的凭据对为「你的Account SID作为用户名,Auth Token作为密码」,注意不要泄露Auth Token
内容的提问来源于stack exchange,提问作者Georgi Georgiev
相关产品推荐
相关产品推荐

