【问题标题】:C# converting httpclient post into restsharp post without async method on autopilotC#在自动驾驶仪上将httpclient post转换为restsharp post而没有异步方法
【发布时间】:2021-09-15 16:26:08
【问题描述】:

我有这段代码,我正在尝试将异步任务 [Http 客户端帖子] 转换为休息敏锐的帖子方法。这是与 httpclient 一起使用的异步任务方法的工作示例:

 static async Task addEmailToListAsync(string ListName, string Email, string FirstName, string LastName)
    {
        try
        {
            var baseAddress = new Uri("https://api2.autopilothq.com/");

            using (var httpClient = new HttpClient { BaseAddress = baseAddress })
            {

                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("autopilotapikey", "mykey");

                using (var content = new StringContent(""))
                {
                    using (var response = await httpClient.PostAsync("v1/list/" + ListName + "/contact/" + Email, content))
                    {
                        string responseData = await response.Content.ReadAsStringAsync();
                    }
                }
            }
        }
        catch (Exception)
        {

            await addEmailToListAsync(ListName, Email, FirstName, LastName);
        }


    }

此方法有效,自动驾驶仪以“{}”的形式返回响应 - 这表明一切顺利。

现在我正在尝试使用 restsharp 库对其进行转换并实现该方法不是异步任务 - 而是一个简单的 void 函数:

 public static void addEmailToList(string ListName, string Email, string FirstName, string LastName)
        {

            var client = new RestClient("https://api2.autopilothq.com/");

            
            client.AddDefaultHeader("autopilotapikey", "mykey");

            var request = new RestRequest("v1/list",Method.POST);

            var jsonObj = JsonSerializer.Serialize(new 
            { 
                ListName = ListName,
                Contact = Email
            });

            request.AddParameter("application/json", jsonObj, ParameterType.RequestBody);

            var res = client.Execute(request).Content;

            var test = "";
        }

这是我在转换时尝试的示例 - 但我不断收到来自 restsharp 的消息,表明正文数据无效...

我在这里做错了什么?我把头发拉出来了,我想不通..

谁能帮帮我?

【问题讨论】:

  • 为什么要把它从异步变为非异步?这与我们通常采取的相反方向。无论如何,如果您遇到错误,那么您需要在问题中发布确切的详细信息。它发生在哪条线上?完整的消息和堆栈跟踪是什么?有没有内部异常?
  • @mason 代码中没有错误-而是在形成请求的方式中-只是在我尝试的第二个示例中的方法中-我从API获得了请求的响应没有很好地创建......只是无法理解为什么......我不明白这种类型的帖子应该如何:httpClient.PostAsync(“v1/list/”+ ListName +“/contact/”+电子邮件,内容)) - 看起来像在 restsharp 中:/
  • 在第一个示例中,您似乎正在向请求正文为空且 URL 包含您的值的 URL 发出 POST 请求。在第二个示例中,您似乎正在发出一个 POST 请求,其中值位于正文而不是 URL 中。这是本意吗?如果服务器回复请求无效,可能是这个意图是错误的?
  • 好吧,您的 HttpClient 尝试发布到 https://api2.autopilothq.com/v1/list/<List Name>/contact/<Email>,而您的 RestSharp 尝试发布到 https://api2.autopilothq.com/v1/list。你看到它们有什么不同吗?使它们相同。

标签: c# asp.net asp.net-mvc restsharp autopilot


【解决方案1】:

您的工作代码在 URL 中发送列表名称和电子邮件地址,以及一个空字符串作为请求正文。

您的非工作版本将列表名称和电子邮件地址作为 JSON 序列化字符串发送到正文中,并从 URL 中省略。

错误消息表明您调用的 API 不支持第二种传递数据的方法。更改您的 RestSharp 代码以匹配您的 HttpClient 代码中的 URL 和请求正文。

var request = new RestRequest("v1/list/" + ListName + "/contact/" + Email, Method.POST);
var res = client.Execute(request).Content;

【讨论】:

  • 哦,是的,这是有效的,只是一个小改动而不是最后一行 - 这使它有效:var res = client.Post(request).Content;
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多