如何在Twilio redirect中传递请求体 突破header长度限制传大量数据
Twilio Redirect传递请求体的解决方案
Twilio 原生的<Redirect> TwiML 动词本身不支持附加自定义请求体,默认仅会将通话相关的标准系统参数(如CallSid、主叫、被叫等)通过指定的请求方法发送到目标地址,无法直接满足大量数据跨函数传输的需求,你可以选择以下两种成熟方案实现:
方案1:自建临时存储+唯一标识传递(适合超大量数据传输)
- 先将需要传递的大量数据存储到你自己的服务端存储介质中(如Redis、内存缓存、数据库均可),为该组数据生成一个全局唯一的标识(如UUID、随机字符串)
- 将唯一标识作为URL查询参数拼接到Redirect的目标地址中
- 目标接口收到请求后,读取查询参数中的唯一标识,去对应存储介质中拉取完整的大量数据即可
调整后的示例代码如下:
const VoiceResponse = require('twilio').twiml.VoiceResponse; const { v4: uuidv4 } = require('uuid'); // 引入你自己初始化后的存储客户端,示例用Redis const redisClient = require('./redis-init'); const response = new VoiceResponse(); // 你需要跨函数传递的大量数据 const largePayload = { userContext: {}, businessData: {}, // 可存放任意大小的业务数据 }; // 生成数据对应的唯一key const payloadKey = uuidv4(); // 存储数据,设置1小时过期足够覆盖通话时长 await redisClient.setEx(payloadKey, 3600, JSON.stringify(largePayload)); // 将唯一key拼到Redirect目标地址 response.redirect({ method: 'POST' }, `http://pigeons.com/twiml.xml?payloadKey=${payloadKey}`); console.log(response.toString());目标接口的对应处理逻辑:
// 目标地址http://pigeons.com/twiml.xml对应的处理函数 app.post('/twiml.xml', async (req, res) => { const { payloadKey } = req.query; // 取出存储的全量数据 const largePayload = JSON.parse(await redisClient.get(payloadKey)); // 拿到数据后即可处理后续业务逻辑 })方案2:存储到Twilio通话自定义属性(适合中小体积数据,无需自建存储)
你可以直接将需要传递的数据序列化后,通过Twilio REST API更新到当前通话的自定义属性中,目标接口收到请求自带的CallSid参数后,调用Twilio REST API拉取对应通话的自定义属性即可
示例代码如下:const VoiceResponse = require('twilio').twiml.VoiceResponse; const twilio = require('twilio'); // 初始化Twilio客户端,替换为你自己的账号凭证 const twilioClient = twilio('你的ACCOUNT_SID', '你的AUTH_TOKEN'); const response = new VoiceResponse(); const largePayload = { // 要传递的业务数据 }; // 当前通话的CallSid可从当前请求的Body参数中获取 const currentCallSid = req.body.CallSid; // 将数据更新到通话自定义参数中 await twilioClient.calls(currentCallSid) .update({ parameters: JSON.stringify(largePayload) }); response.redirect({ method: 'POST' }, 'http://pigeons.com/twiml.xml'); console.log(response.toString());目标接口的对应处理逻辑:
app.post('/twiml.xml', async (req, res) => { const callSid = req.body.CallSid; // 拉取当前通话的完整信息 const call = await twilioClient.calls(callSid).fetch(); const largePayload = JSON.parse(call.parameters); // 拿到数据后即可处理后续业务逻辑 })
注意:Twilio通话自定义参数的存储上限为128KB,超过这个大小请选择自建临时存储的方案
内容的提问来源于stack exchange,提问作者Puneeth Shetty
相关产品推荐
相关产品推荐

