如何读取来自 twilio webhook 的事件?
How to read events that come from twilio webhook?
我正在 twilio 上创建一个视频室,并且我创建了一个 webhook 端点到 twilio 发送事件的地方。一个问题是我不知道如何读取这些事件,因为关于状态回调的 twilio 文档没有任何关于它实际如何工作的示例。
读取该数据的最佳方式是什么,因为我的端点看起来像这样
Public async Task<IActionResult> statuscallbackwebhook(){
//read data that is recieved from twilio
}
为了对此进行测试,我创建了一个 console app to create rooms for Twilio Video,您可以在其中指定 statusCallback
:
using Twilio;
using Twilio.Rest.Video.V1;
using HttpMethod = Twilio.Http.HttpMethod;
// make sure to configure your Twilio Account SID and Auth Token as environment variables before running this program
var accountSid = Environment.GetEnvironmentVariable("TwilioAccountSid");
var authToken = Environment.GetEnvironmentVariable("TwilioAuthToken");
TwilioClient.Init(accountSid, authToken);
Console.Write("What is the room status callback URL?");
var roomStatusCallbackUrl = Console.ReadLine();
Console.WriteLine();
await RoomResource.CreateAsync(
statusCallback: new Uri(roomStatusCallbackUrl),
statusCallbackMethod: HttpMethod.Post
);
无论您以何种方式创建房间,请务必将 statusCallback
配置为与您的 controller-action.
相匹配的路线
然后在您的控制器操作中,您可以通过两种方式接受 webhook 参数:使用 strongly-typed 对象作为参数,或者使用像 string
、int
这样的简单类型参数, DateTime
, 等等
如果要将 webhook 请求参数绑定到 strongly-typed 对象,请使用以下代码:
using Microsoft.AspNetCore.Mvc;
using RoomStatusCallback.Models;
namespace RoomStatusCallback.Controllers;
public class RoomController : Controller
{
private readonly ILogger<RoomController> logger;
public RoomController(ILogger<RoomController> logger)
{
this.logger = logger;
}
public ActionResult Status(RoomStatusRequest statusRequest)
{
logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
statusRequest.RoomName,
statusRequest.RoomSid,
statusRequest.RoomStatus,
statusRequest.RoomType
);
return Ok();
}
}
然后添加 class,它定义了 strongly-typed 对象的属性,这些属性必须将名称与 webhook 请求参数的名称相匹配。 webhook request parameters for video room status are documented here。这是我为 room-created
状态获取数据而创建的 class:
namespace RoomStatusCallback.Models;
public class RoomStatusRequest
{
public string AccountSid { get; set; }
public string RoomName { get; set; }
public string RoomSid { get; set; }
public string RoomStatus { get; set; }
public string RoomType { get; set; }
public string StatusCallbackEvent { get; set; }
public DateTime Timestamp { get; set; }
}
您可以根据应用程序的需要随意 add/remove 属性。 ASP.NET Core MVC's model binding 会将 webhook 请求参数绑定到 strongly-typed 对象的属性。
第二种方法是使用像这样的简单类型参数:
using Microsoft.AspNetCore.Mvc;
using RoomStatusCallback.Models;
namespace RoomStatusCallback.Controllers;
public class RoomController : Controller
{
private readonly ILogger<RoomController> logger;
public RoomController(ILogger<RoomController> logger)
{
this.logger = logger;
}
public ActionResult Status(
string roomName,
string roomSid,
string roomStatus,
string roomType
)
{
logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
roomName,
roomSid,
roomStatus,
roomType
);
return Ok();
}
}
结果是完全一样的,但是通过给动作添加参数,ASP.NETCore的绑定特性会将webhook请求参数绑定到动作的参数上,只要它们匹配名称。
要使用 the sample 进行测试:
- 启动包含您的 webhook 的 ASP.NET 核心项目
- 启动ngrok隧道服务
- 运行 控制台应用程序并传入 public ngrok 转发 URL + 到您的 controller-action.
的路由
还有更多方法可以做到这一点,但是对于 MVC controller-actions,这两个选项将是推荐的方法。
我正在 twilio 上创建一个视频室,并且我创建了一个 webhook 端点到 twilio 发送事件的地方。一个问题是我不知道如何读取这些事件,因为关于状态回调的 twilio 文档没有任何关于它实际如何工作的示例。
读取该数据的最佳方式是什么,因为我的端点看起来像这样
Public async Task<IActionResult> statuscallbackwebhook(){
//read data that is recieved from twilio
}
为了对此进行测试,我创建了一个 console app to create rooms for Twilio Video,您可以在其中指定 statusCallback
:
using Twilio;
using Twilio.Rest.Video.V1;
using HttpMethod = Twilio.Http.HttpMethod;
// make sure to configure your Twilio Account SID and Auth Token as environment variables before running this program
var accountSid = Environment.GetEnvironmentVariable("TwilioAccountSid");
var authToken = Environment.GetEnvironmentVariable("TwilioAuthToken");
TwilioClient.Init(accountSid, authToken);
Console.Write("What is the room status callback URL?");
var roomStatusCallbackUrl = Console.ReadLine();
Console.WriteLine();
await RoomResource.CreateAsync(
statusCallback: new Uri(roomStatusCallbackUrl),
statusCallbackMethod: HttpMethod.Post
);
无论您以何种方式创建房间,请务必将 statusCallback
配置为与您的 controller-action.
然后在您的控制器操作中,您可以通过两种方式接受 webhook 参数:使用 strongly-typed 对象作为参数,或者使用像 string
、int
这样的简单类型参数, DateTime
, 等等
如果要将 webhook 请求参数绑定到 strongly-typed 对象,请使用以下代码:
using Microsoft.AspNetCore.Mvc;
using RoomStatusCallback.Models;
namespace RoomStatusCallback.Controllers;
public class RoomController : Controller
{
private readonly ILogger<RoomController> logger;
public RoomController(ILogger<RoomController> logger)
{
this.logger = logger;
}
public ActionResult Status(RoomStatusRequest statusRequest)
{
logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
statusRequest.RoomName,
statusRequest.RoomSid,
statusRequest.RoomStatus,
statusRequest.RoomType
);
return Ok();
}
}
然后添加 class,它定义了 strongly-typed 对象的属性,这些属性必须将名称与 webhook 请求参数的名称相匹配。 webhook request parameters for video room status are documented here。这是我为 room-created
状态获取数据而创建的 class:
namespace RoomStatusCallback.Models;
public class RoomStatusRequest
{
public string AccountSid { get; set; }
public string RoomName { get; set; }
public string RoomSid { get; set; }
public string RoomStatus { get; set; }
public string RoomType { get; set; }
public string StatusCallbackEvent { get; set; }
public DateTime Timestamp { get; set; }
}
您可以根据应用程序的需要随意 add/remove 属性。 ASP.NET Core MVC's model binding 会将 webhook 请求参数绑定到 strongly-typed 对象的属性。
第二种方法是使用像这样的简单类型参数:
using Microsoft.AspNetCore.Mvc;
using RoomStatusCallback.Models;
namespace RoomStatusCallback.Controllers;
public class RoomController : Controller
{
private readonly ILogger<RoomController> logger;
public RoomController(ILogger<RoomController> logger)
{
this.logger = logger;
}
public ActionResult Status(
string roomName,
string roomSid,
string roomStatus,
string roomType
)
{
logger.LogInformation(@"Room created
Name: {RoomName}
Sid: {RoomSid}
Status: {RoomStatus}
Type: {RoomType}",
roomName,
roomSid,
roomStatus,
roomType
);
return Ok();
}
}
结果是完全一样的,但是通过给动作添加参数,ASP.NETCore的绑定特性会将webhook请求参数绑定到动作的参数上,只要它们匹配名称。
要使用 the sample 进行测试:
- 启动包含您的 webhook 的 ASP.NET 核心项目
- 启动ngrok隧道服务
- 运行 控制台应用程序并传入 public ngrok 转发 URL + 到您的 controller-action. 的路由
还有更多方法可以做到这一点,但是对于 MVC controller-actions,这两个选项将是推荐的方法。