You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基于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组件:

  1. 在现有表单中添加TIWAjaxCallback组件,命名为ajaxCallStatus
  2. 在其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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:22:25