我想在本地测试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;}
}
}
}
我想念什么?
答案 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