【问题标题】:C# NameValueCollection problem send with HttpClient PostAsync使用 HttpClient PostAsync 发送 C# NameValueCollection 问题
【发布时间】:2020-10-13 07:41:58
【问题描述】:

我关注了这个答案https://stackoverflow.com/a/1877016/3681759

目标是通过HttpCient发送https://my.address.com/api?mail_from=FromEmailAddress&mail_to=ToEmailAdress

找到了这个解决方案:

private static readonly HttpClient client = new HttpClient { BaseAddress = new Uri("https://my.address.com") };

private async void Btn_send_Click(object sender, EventArgs e)
{
    NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);
    
    queryString.Add("mail_from", FromEmailAddress);
    queryString.Add("mail_to", ToEmailAddress);
}

queryString返回我想要的=mail_from=FromEmailAddress&mail_to=ToEmailAddress

现在我想通过 HttpClient 发送它并报错:

var response = client.PostAsync("/api?", queryString).Result;

错误:cannot convert from 'System.Collections.Specialized.NameValueCollection' to 'System.Net.Http.HttpContent'

我知道我很接近,请给点建议?

更新以完成这项工作:

var response = client.PostAsync($"/api?{queryString}", null);

【问题讨论】:

  • 您需要将查询字符串附加到URI字符串上,这是第一个参数。第二个参数是您要在请求正文中发布的内容,它需要是HttpContent 类型,这就是您的代码无法编译的原因..

标签: c# async-await query-string dotnet-httpclient


【解决方案1】:

您只需将查询字符串附加到 URI:

client.PostAsync($"/api?{queryString}", //...

第二个参数是HTTP内容,需要单独生成。

如果您没有要发送的任何内容,则应该使用 HTTP GET:

client.GetAsync($"/api?{queryString}");

顺便说一句,您应该等待返回的Task,而不是通过访问Result 阻塞:

var response = await client.GetAsync($"/api?{queryString}");

【讨论】:

  • 非常感谢,这是可行的! client.PostAsync($"/api?{queryString}", null);
【解决方案2】:

你的解决方案差不多好了,你只需要保存扩展的 uri。

//Init
var apiUri = "https://my.address.com/api";
var uriBuilder = new UriBuilder(apiUri);
var queryString = HttpUtility.ParseQueryString(uriBuilder.Query);

//Extend
queryString.Add("mail_from", FromEmailAddress);
queryString.Add("mail_to", ToEmailAddress);

//Overwrite original
uriBuilder.Query = queryString.ToString();
apiUri = uriBuilder.ToString();

【讨论】:

  • 还有什么要添加到var response = client.PostAsync( , ); ?这有同样的错误var response = client.PostAsync(apiUri, uriBuilder.Query).Result;
  • @novice 正如 Martin Costello 所提到的,PostAsync Reference 的第二个参数是 HttpContent,即您的实际有效负载。还请记住,在 POST 的情况下,大多数框架都会忽略查询字符串(因为它被设计为与 GET 一起使用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2018-04-11
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多