如何在基于TNetHTTPRequest的Twilio客户端中处理statusCallback?
解决方案
要实现通过TNetHTTPRequest发起Twilio呼叫并接收状态回调,核心分为发起呼叫时配置回调参数和在Intraweb中处理回调请求两个步骤:
1. 发起呼叫时配置StatusCallback参数
你使用的Twilio客户端基于TNetHTTPRequest,只需在呼叫请求参数中添加Twilio要求的回调相关字段即可,对应C++Builder代码如下:
TStringList* allParams = new TStringList(); try { allParams->Add("From=+18668675310"); // 你的Twilio号码 allParams->Add("To=+14155551212"); // 目标呼叫号码 allParams->Add("Url=http://demo.twilio.com/docs/voice.xml"); // Twilio执行的语音流程XML // 设置回调地址:指向你的Intraweb应用的回调处理路径(需公网可访问) allParams->Add("StatusCallback=http://你的公网域名/callstatus"); // 指定回调请求方法,推荐使用POST allParams->Add("StatusCallbackMethod=POST"); // 可选:指定需要监听的呼叫事件,多个事件用逗号分隔(如completed/ringing/busy等) allParams->Add("StatusCallbackEvent=completed,ringing"); // 发送POST请求到Twilio的Calls接口 TNetHTTPResponse* response = client->Post("Calls", allParams); try { // 可选:解析响应获取CallSid等信息 String responseContent = response->ContentAsString(); } __finally { delete response; } } __finally { delete allParams; }
2. 在Intraweb中实现回调处理逻辑
需要在你的Intraweb应用中创建一个能接收POST请求的端点,用来接收Twilio发送的呼叫状态数据,以下提供两种实现方式:
方式1:使用TIWForm作为回调端点
创建一个新的TIWForm(例如命名为frmCallStatus),在其OnCreate事件中处理POST参数:
void __fastcall TfrmCallStatus::IWFormCreate(TObject *Sender) { // 校验请求方法为POST if (WebApplication->Request->Method != "POST") { WebApplication->Response->StatusCode = 405; // 返回方法不允许状态码 WebApplication->Terminate; return; } // 提取Twilio传递的呼叫状态参数 String callSid = WebApplication->Request->Params->Values["CallSid"]; String callStatus = WebApplication->Request->Params->Values["CallStatus"]; String fromNumber = WebApplication->Request->Params->Values["From"]; String toNumber = WebApplication->Request->Params->Values["To"]; // 按需获取其他参数:CallDuration、RecordingUrl等 // 处理业务逻辑:写入数据库、触发应用内通知等 // ... 你的自定义代码 ... // 返回200状态码和空Twiml响应,告知Twilio回调已接收 WebApplication->Response->StatusCode = 200; WebApplication->Response->ContentText = "<Response></Response>"; WebApplication->Terminate; }
之后将Intraweb路由中的/callstatus路径映射到该表单,或直接使用表单的访问URL作为回调地址。
方式2:使用TIWAjaxCallback(轻量实现)
如果不需要单独表单,可使用TIWAjaxCallback组件:
- 在现有表单中添加
TIWAjaxCallback组件,命名为ajaxCallStatus - 在其
OnAsyncEvent事件中处理回调参数:
void __fastcall TMainForm::ajaxCallStatusAsyncEvent(TObject *Sender, TStringList *Params, TStringList *Result) { // 直接提取Twilio传递的参数 String callSid = Params->Values["CallSid"]; String callStatus = Params->Values["CallStatus"]; // ... 处理业务逻辑 ... // 返回空响应即可 Result->Add(""); }
回调URL为该Ajax组件的访问路径(可在Intraweb调试信息中查看具体地址)。
关键注意事项
- 公网可访问性:你的Intraweb应用必须能被Twilio服务器访问,需部署在公网服务器或通过端口映射、反向代理暴露到公网。
- 请求验证:建议验证回调请求来源为Twilio(通过官方签名验证机制),防止恶意请求。
- 响应要求:Twilio要求回调端点返回200状态码,响应内容可返回空Twiml,否则会重复发送回调。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

