如何使用ASp.net Web Api编写REST API以通过Twilio号接收SMS

Dit*_*tty 4 sms twilio asp.net-web-api

我是Web Api/Rest API概念的新手,但我打算使用Visual Studio 2012 MVC4 Web Api.我是如何创建一个应用程序通过Twilio接收文本/ SMS消息并发回响应?我在这里和Twilio网站上搜索了几篇文章,但没有一篇能给我任何关于如何使用MVC4 Web Api的见解.有人可以帮助我并展示/举一些例子吗?

Que*_*esi 12

我真的不喜欢我发现的有关Web API的任何文档,所以我想回答这个问题,即使它有点陈旧.

Twilio将向您创建的端点和您的HTTP响应发出HTTP请求(您可以在Twilio站点上选择GET或POST谓词),如果正文形成正确,将向用户发出SMS响应.我在这里显示底部的Twilio配置屏幕截图.

我通常只从我的端点返回json,但对于Twilio,你必须返回XML.将路由设置为具有扩展映射路由(这允许您设置将为Twilio请求返回XML的URL).这是必要的,因为Twilio不会在Accept标头中发布text/xml.它们实际上有一个Accept标头,但是它包含*/*但是除了XML之外的任何东西都会失败:

        config.Routes.MapHttpRoute(
            name: "DefaultApiWithExtension",
            routeTemplate: "xml/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional, ext="xml" }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{id}",
            defaults: new { id = RouteParameter.Optional}
        );

        config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "application/xml");
        config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
Run Code Online (Sandbox Code Playgroud)

现在使用包管理器控制台安装TwiML nuget包.这将仅用于TwilioResponse类.

Install-Package Twilio.TwiML
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以添加此类,但如果您只想将params放在控制器操作方法中,则不需要.

public class TwilioRequest
{
    public string MessageSid { get; set; }
    public string AccountSid { get; set; }
    public string From { get; set; }
    public string To { get; set; }
    public string Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你的控制器动作是这样的:

    public virtual HttpResponseMessage Get([FromUri]TwilioRequest request)
    {            
        TwilioResponse tr = new TwilioResponse();

        if (request.Body == "Hello World")
            tr.Message("Hello back!");
        else
            tr.Message("Text 'Hello World' for a friendly message.");

        return Request.CreateResponse(HttpStatusCode.OK, tr.Element);
    }
Run Code Online (Sandbox Code Playgroud)

或者如果您不想使用我制作的TwilioRequest类:

    public virtual HttpResponseMessage Get(string body)
    {            
        TwilioResponse tr = new TwilioResponse();

        if (body == "Hello World")
            tr.Message("Hello back!");
        else
            tr.Message("Text 'Hello World' for a friendly message.");

        return Request.CreateResponse(HttpStatusCode.OK, tr.Element);
    }
Run Code Online (Sandbox Code Playgroud)

最后,为了测试它,您需要配置Twilio以对端点执行GET请求.这是在发布时他们网站上的样子:

在此输入图像描述

请注意,配置URL中包含/ xml/controllername模式.您可以在使用Twilio进行测试之前在浏览器,邮递员或提琴手中进行测试.如果正常工作,响应正文应该看起来像这样:

<response>
<message>Hello Back!</message>
</response>
Run Code Online (Sandbox Code Playgroud)

最后的说明:

从技术上讲,您甚至不需要TwiML库,因为它只提供了一个序列化为XML的包装类,您可以在几分钟内编写自己的包装类.此外,我发现在防火墙上打开一个端口是非常有用的,该端口直接从Twilio向我的机器发送http请求,以便我可以在Twilio正常工作时进行调试.