C# 使用.Net HttpClient()创建日历webhook订阅时出错

C# 使用.Net HttpClient()创建日历webhook订阅时出错,c#,curl,dotnet-httpclient,calendly,C#,Curl,Dotnet Httpclient,Calendly,我正在尝试使用.net HttpClient()为Calendly创建webhook订阅 我正在尝试将此Curl命令转换为.Net curl --header "X-TOKEN: <your_token>" --data "url=https://blah.foo/bar&events[]=invitee.created&events[]=invitee.canceled" https://calendly.com/api/v1/hooks curl--heade

我正在尝试使用.net HttpClient()为Calendly创建webhook订阅

我正在尝试将此Curl命令转换为.Net

curl --header "X-TOKEN: <your_token>" --data "url=https://blah.foo/bar&events[]=invitee.created&events[]=invitee.canceled" https://calendly.com/api/v1/hooks
curl--header“X-TOKEN:”--data”url=https://blah.foo/bar&events[]=invitee.created&events[]=invitee.cancelled”https://calendly.com/api/v1/hooks
这是我的.Net代码:

private static async Task<HttpResponseMessage> PostCreateWebhookSubscription()
{
    var client = new HttpClient {BaseAddress = new Uri("https://calendly.com")};
    var request = new HttpRequestMessage(HttpMethod.Post, "/api/v1/hooks/");
    var keyValues = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("url",
            "https://requestb.in/17ruxqh1&events[]=invitee.created&events[]=invitee.canceled")
    };
    request.Content = new FormUrlEncodedContent(keyValues);
    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded") {CharSet = "UTF-8"};
    request.Content.Headers.Add("X-TOKEN", "<my_calendly_token>");
    return await client.SendAsync(request);
}
私有静态异步任务PostCreateWebhookSubscription()
{
var client=new-HttpClient{BaseAddress=new-Uri(“https://calendly.com")};
var request=newhttprequestmessage(HttpMethod.Post,“/api/v1/hooks/”;
var keyValues=新列表
{
新的KeyValuePair(“url”,
"https://requestb.in/17ruxqh1&events[]=invitee.created&events[]=invitee.cancelled”)
};
request.Content=newformurlencodedcontent(keyValues);
request.Content.Headers.ContentType=new-MediaTypeHeaderValue(“application/x-www-form-urlencoded”){CharSet=“UTF-8”};
request.Content.Headers.Add(“X-TOKEN”和“”);
返回wait client.sendaync(请求);
}
我得到了这个错误422错误,但无法弄清楚要改变什么才能使它工作

获取不可处理实体时出错

{“类型”:“验证\错误”,“消息”:“验证失败”,“错误”:{“事件”:[“不能为空”]}

我能够运行Curl命令,并且在同一台机器上运行良好,因此我知道这是可行的

我创建了一个.net HttpClient调用来测试基本令牌,效果很好


有什么建议吗

最后,当我再次查看代码时,我发现了这一点

最初,我将整个URL看作一个大字符串,但起初没有意识到&符号用于分隔要传递的值

下面是错误代码:

var keyValues = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("url",
        "https://requestb.in/17ruxqh1&events[]=invitee.created&events[]=invitee.canceled")
};
var keyValues=新列表
{
新的KeyValuePair(“url”,
"https://requestb.in/17ruxqh1&events[]=invitee.created&events[]=invitee.cancelled”)
};
应更改为将每个值与其文档分开:

var keyValues = new List<KeyValuePair<string, string>>
{
     new KeyValuePair<string, string>("url","https://requestb.in/17ruxqh1"),
     new KeyValuePair<string, string>("events[]","invitee.created"),
     new KeyValuePair<string, string>("events[]","invitee.canceled")
};
var keyValues=新列表
{
新的KeyValuePair(“url”https://requestb.in/17ruxqh1"),
新的KeyValuePair(“events[]”,“invitee.created”),
新的KeyValuePair(“事件[]”,“被邀请者已取消”)
};
因此,对于那些希望使用.Net来使用Calendally创建webhook订阅的用户,这里有一个完整的TestMethod代码来试用。只需将第一个参数替换为requestb.in或post url。同时输入Calendly api密钥

    [TestMethod]
    public void CreateCalendlyWebhookSubscription()
    {
        var task = PostCreateWebhookSubscription();
        task.Wait();
        var response = task.Result;
        var body = response.Content.ReadAsStringAsync().Result;
    }

    private static async Task<HttpResponseMessage> PostCreateWebhookSubscription()
    {
        var client = new HttpClient {BaseAddress = new Uri("https://calendly.com")};
        var request = new HttpRequestMessage(HttpMethod.Post, "/api/v1/hooks/");
        var keyValues = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("url","https://requestb.in/17ruxqh1"),
            new KeyValuePair<string, string>("events[]","invitee.created"),
            new KeyValuePair<string, string>("events[]","invitee.canceled")
        };
        request.Content = new FormUrlEncodedContent(keyValues);
        request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded") {CharSet = "UTF-8"};
        request.Content.Headers.Add("X-TOKEN", "<your Calendly ApiKey>");
        return await client.SendAsync(request);
    }
[TestMethod]
public void createCalendaryWebHookSubscription()的
{
var task=PostCreateWebhookSubscription();
task.Wait();
var response=task.Result;
var body=response.Content.ReadAsStringAsync().Result;
}
私有静态异步任务PostCreateWebhookSubscription()
{
var client=new-HttpClient{BaseAddress=new-Uri(“https://calendly.com")};
var request=newhttprequestmessage(HttpMethod.Post,“/api/v1/hooks/”;
var keyValues=新列表
{
新的KeyValuePair(“url”https://requestb.in/17ruxqh1"),
新的KeyValuePair(“events[]”,“invitee.created”),
新的KeyValuePair(“事件[]”,“被邀请者已取消”)
};
request.Content=newformurlencodedcontent(keyValues);
request.Content.Headers.ContentType=new-MediaTypeHeaderValue(“application/x-www-form-urlencoded”){CharSet=“UTF-8”};
request.Content.Headers.Add(“X-TOKEN”和“”);
返回wait client.sendaync(请求);
}
希望这对别人有帮助