Twilio REST API v2持续返回400错误请求,如何用fetch解决?
Zapier中用Fetch调用Twilio Studio API出现400 Bad Request的修复方案
核心问题排查与修复点
Content-Type与请求体不匹配
你当前设置Content-Type: multipart/form-data,但请求体是JSON.stringify处理后的JSON字符串,两者完全不兼容。Twilio Studio执行API支持两种请求格式:- 用JSON请求体时,需将
Content-Type设为application/json - 用表单格式时,需将请求体转为
x-www-form-urlencoded或FormData格式(Twilio大部分API更推荐这种)
- 用JSON请求体时,需将
Authorization认证格式错误
Basic认证要求是AccountSID:AuthToken拼接后做base64编码,你写的{SID:Secret}格式错误,必须替换成实际的你的Twilio账号SID:你的AuthToken再编码。Parameters参数处理错误(若启用)
如果要传递Parameters,不需要额外用JSON.stringify包裹:- JSON格式请求体直接传对象即可
- 表单格式请求体则需要把Parameters转为JSON字符串后作为表单值传递
变量声明与错误处理缺失
output未用let/const声明,属于全局变量;且fetch报错时output会变成undefined,后续访问output.status会抛错,必须增加try/catch做错误捕获。
修复后的JSON格式代码示例
const func = async () => { // 替换为你的Twilio Flow SID const url = "https://studio.twilio.com/v2/Flows/你的Flow ID/Executions"; let phone = "+1" + "目标用户手机号"; phone = phone.replace(/-/g, ''); console.log('running'); try { // 替换为你的Twilio Account SID和Auth Token const auth = Buffer.from('你的AccountSID:你的AuthToken').toString('base64'); const response = await fetch(url, { method: 'POST', body: JSON.stringify({ To: phone, From: '+1你的Twilio手机号', // 启用Parameters直接传对象即可 Parameters: { item_num: "A11113232", agent: "Joel" } }), headers: { 'Authorization': `Basic ${auth}`, 'Content-Type': 'application/json', 'Cache-Control': 'no-cache' }, }); console.log('响应状态:', response.status); // 打印响应内容,Twilio会返回具体错误信息帮助排查 const responseBody = await response.json(); console.log('响应内容:', responseBody); } catch (err) { console.error('请求错误:', err); } } func();
修复后的表单格式代码示例(更推荐)
const func = async () => { const url = "https://studio.twilio.com/v2/Flows/你的Flow ID/Executions"; let phone = "+1" + "目标用户手机号"; phone = phone.replace(/-/g, ''); console.log('running'); try { const auth = Buffer.from('你的AccountSID:你的AuthToken').toString('base64'); const formData = new FormData(); formData.append('To', phone); formData.append('From', '+1你的Twilio手机号'); // 表单格式下Parameters需要转为JSON字符串 formData.append('Parameters', JSON.stringify({ item_num: "A11113232", agent: "Joel" })); const response = await fetch(url, { method: 'POST', body: formData, headers: { 'Authorization': `Basic ${auth}`, 'Cache-Control': 'no-cache' // 用FormData无需手动设置Content-Type,系统会自动生成正确格式 }, }); console.log('响应状态:', response.status); const responseBody = await response.json(); console.log('响应内容:', responseBody); } catch (err) { console.error('请求错误:', err); } } func();
额外排查建议
- 确保所有占位符(Flow ID、手机号、Account SID、Auth Token)都替换为实际有效值
- 打印响应内容,Twilio的400错误会返回具体的错误字段,能快速定位问题
- 登录Twilio控制台查看请求日志,获取更详细的错误追踪信息
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

