如何在本地测试Podio Webhooks

时间:2019-06-04 04:44:12

标签: c# podio

我想在本地测试Podio Webhooks。我正在使用Conveyor.cloud进行隧道传输,并通过其Twilio示例成功对其进行了测试。我将代码转换为可与Podio一起使用时遇到的问题是Twilio示例使用了控制器,而http://podio.github.io/podio-dotnet/webhooks/上的Podio Webhook示例使用了IHttpHandler。

我尝试在下面的代码中向控制器实现IHttpHandler,但无法正常工作。

using System;
using System.Web;
using System.Web.Mvc;
using PodioAPI;

namespace WebhooksProject.Controllers
{
    public class WebController : IHttpHandler
    {
        public static string clientId = "abcd";
        public static string clientSecret = "abcd";
        public static string username = "a@b.com";
        public static string password = "abcd";

        public static Podio podio = new Podio(clientId, clientSecret);

        public void ProcessRequest(HttpContext context)
        {
            podio.AuthenticateWithPassword(username, password);

            var request = context.Request;

            switch (request["type"])
            {
                case "hook.verify":
                    podio.HookService.ValidateHookVerification(int.Parse(request["hook_id"]), request["code"]);
                    break;
                // An item was created
                case "item.create":
                    // For item events you will get "item_id", "item_revision_id" and "external_id". in post params
                    int itemIdOfCreatedItem = int.Parse(request["item_id"]);
                    // Fetch the item and do what ever you want
                    break;

                // An item was updated
                case "item.update":
                    // For item events you will get "item_id", "item_revision_id" and "external_id". in post params
                    int itemIdOfUpdatedItem = int.Parse(request["item_id"]);
                    // Fetch the item and do what ever you want
                    break;

                // An item was deleted    
                case "item.delete":
                    // For item events you will get "item_id", "item_revision_id" and "external_id". in post params
                    int deletedItemId = int.Parse(request["item_id"]);
                    break;
            }
        }

        public bool IsReusable
        {
            get{return false;}
        }
    }
}

我想念什么?

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作,而不使用HttpContext。我基本上使用requestbin来获取请求,然后直接使用Postman尝试。

    [HttpPost]
    public HttpResponseMessage ProcessRequest(PodioHook hook)
    {
        var oAuth = _podio.AuthenticateWithApp(_appId, _appToken); // keep the oauth if you are reusing it.

        switch (hook.type)
        {
            case "hook.verify":
                _podio.HookService.ValidateHookVerification(hook.hook_id, hook.code);
                break;
            // An item was created
            case "item.create":
                // For item events you will get "item_id", "item_revision_id" and "external_id". in post params
                long itemIdOfCreatedItem = hook.item_id;
                // Fetch the item and do what ever you want
                break;

            // An item was updated
            case "item.update":
                // For item events you will get "item_id", "item_revision_id" and "external_id". in post params
                long itemIdOfUpdatedItem = hook.item_id;
                // Fetch the item and do what ever you want
                break;

            // An item was deleted    
            case "item.delete":
                // For item events you will get "item_id", "item_revision_id" and "external_id". in post params
                long deletedItemId = hook.item_id;
                break;
        }

        return new HttpResponseMessage(HttpStatusCode.OK);
    }

我的PodioHook模型如下所示

public class PodioHook
{
    public string code { get; set; }
    public string type { get; set; }
    public long item_id { get; set; }
    public int hook_id { get; set; }
}

.NET框架将处理对模型转换的请求。

链接到请求bin https://requestbin.com/

答案 1 :(得分:0)

有两种方法可以在本地测试Webhook。

单元测试

您可以单元编写一个单元测试,然后使用诸如Moq for .NET的模拟库在方法中模拟context参数。这是最快的方法,但是最好做得最好,因为您需要了解webhook请求格式的确切结构才能对其进行模拟。

集成测试

您可以使用Postman或类似工具,或使用与Webhook相同的请求格式,编写代码向端点创建http请求。同样,您还需要知道Webhook提供商将向您发送的请求格式。

端到端测试

在这里您可以触发提供者点击您的网络挂钩。与生产中发生的情况相比,这是最现实的方法。我喜欢先做这种方法,因为一旦工作,就可以在集成测试和单元测试中重新使用webhook请求的请求结构。

您需要将端点公开在公共URL上。虽然可以将代码部署到公共服务器,但更简单的方法是使用Exposure.sh。例如,您可以运行expose 80,它将通过公共URL(例如https://a2cD.expose.sh)公开您的本地服务器。

通过在端到端测试期间在本地运行服务,您将可以访问IDE进行更改以及所有调试工具,这意味着您将提高工作效率并节省时间。有使用指南来测试网钩here

免责声明:我建立了Exposure.sh