使用 HttpClient PostAsync 发送 C# NameValueCollection 问题

Posted

技术标签:

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

我关注了这个答案https://***.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 类型,这就是您的代码无法编译的原因.. 【参考方案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 一起使用)

以上是关于使用 HttpClient PostAsync 发送 C# NameValueCollection 问题的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient.PostAsync 的字符编码问题

为啥 HttpClient.PostAsync 似乎将请求作为 GET 而不是 POST 发送?

异步等待 HttpClient.PostAsync 调用

如何等待PostAsync返回?

HttpClient.PostAsync 用于上传文件

HttpClient 通过 PostAsync 上传文件的奇怪行为