使用 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 问题的主要内容,如果未能解决你的问题,请参考以下文章