C#:带有 POST 参数的 HttpClient

Posted

技术标签:

【中文标题】C#:带有 POST 参数的 HttpClient【英文标题】:C#: HttpClient with POST parameters 【发布时间】:2014-12-09 10:01:54 【问题描述】:

我使用以下代码向服务器发送 POST 请求:

string url = "http://myserver/method?param1=1&param2=2"    
HttpClientHandler handler = new HttpClientHandler();
HttpClient httpClient = new HttpClient(handler);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
HttpResponseMessage response = await httpClient.SendAsync(request);

我无权访问要调试的服务器,但我想知道,这个请求是作为 POST 还是 GET 发送的?

如果是 GET,我如何更改代码以将 param1 和 param2 作为 POST 数据(不在 URL 中)发送?

【问题讨论】:

它以邮递方式发送,new HttpRequestMessage(HttpMethod.Post, url),通过传入HttpMethod.Post,您正在创建一个 POST 请求。什么是 param1 和 param2? @BenRobinson 谢谢。 param1 & param2 是我的参数,我想将它们作为 POST 参数但查询字符串发送。 @SandySands 谢谢。它在 Windows Phone 模拟器中,很难为 Fiddler 配置它。 【参考方案1】:

更简洁的替代方法是使用Dictionary 来处理参数。毕竟它们是键值对。

private static readonly HttpClient httpclient;

static MyClassName()

    // HttpClient is intended to be instantiated once and re-used throughout the life of an application. 
    // Instantiating an HttpClient class for every request will exhaust the number of sockets available under heavy loads. 
    // This will result in SocketException errors.
    // https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.7.1
    httpclient = new HttpClient();    
 

var url = "http://myserver/method";
var parameters = new Dictionary<string, string>   "param1", "1" ,  "param2", "2"  ;
var encodedContent = new FormUrlEncodedContent (parameters);

var response = await httpclient.PostAsync (url, encodedContent).ConfigureAwait (false);
if (response.StatusCode == HttpStatusCode.OK) 
    // Do something with response. Example get content:
    // var responseContent = await response.Content.ReadAsStringAsync ().ConfigureAwait (false);

另外别忘了Dispose()httpclient,如果你不使用关键字using

正如Microsoft docs 中 HttpClient 类的备注部分所述,HttpClient 应该被实例化一次并重复使用。

编辑:

您可能想查看response.EnsureSuccessStatusCode(); 而不是if (response.StatusCode == HttpStatusCode.OK)

你可能想保留你的 httpclient 而不要Dispose() 它。见:Do HttpClient and HttpClientHandler have to be disposed?

编辑:

不用担心在 .NET Core 中使用 .ConfigureAwait(false)。更多详情请查看https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html

【讨论】:

那个版本不适合我。控制器动作接收到的参数始终为空。 @d00d 随时发布与此问题相关的新问题,解释您的问题。 那么通过参数发送Get请求呢? @HoseinAqajani 我认为在新帖子中提出一个很好的问题。随意在此处链接作为评论。 List&lt;KeyValuePair&lt;string, string&gt;&gt; 更简洁,因为查询参数键不一定是唯一的。【参考方案2】:

正如 Ben 所说,您正在发布您的请求(代码中指定了 HttpMethod.Post)

url 中包含的查询字符串(get)参数可能不会做任何事情。

试试这个:

string url = "http://myserver/method";    
string content = "param1=1&param2=2";
HttpClientHandler handler = new HttpClientHandler();
HttpClient httpClient = new HttpClient(handler);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
HttpResponseMessage response = await httpClient.SendAsync(request,content);

HTH,

bovako

【讨论】:

@JohnCroneh 这不再起作用了。请接受下面的其他答案! @JohnCroneh 请将接受的答案更改为有效的答案 @R.McManaman 实际上,如果您要创建一个未知的方法类型,这是一个很好的答案。它缺少一些“使用”来确保它被处理和一个“确保它被转换”,但它遵循 PostAsync 包装器实现。

以上是关于C#:带有 POST 参数的 HttpClient的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段

在 Android 中使用带有 post 参数的 HttpClient 和 HttpPost

C# HttpClient 不发送 POST 变量

使用带有表单编码参数和标头的 C# httpclient 发布

来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文

在 C# 中使用 Post 方法 HttpClient 时请求超时