0%

.NET(C#)后台发送Get和Post请求的几种方法总结-CJavaPy

Excerpt

.NET (C#) 中,发送 HTTP GET 和 POST 请求可以通过多种方式实现,主要依赖于 .NET Framework 或 .NET Core/5+ 的版本。.NET中提供了多种方法来发送HTTP请求,每种方法都有其优缺点。选择哪种方法取决于具体需求和环境。


1、HttpClient 类 (推荐)

HttpClient 是 .NET 中处理 HTTP 请求的现代方法。它是线程安全的,支持异步操作,并且可以用于多个请求。

适用平台:.NET Framework 4.5+, .NET Standard 1.1+, .NET Core 1.0+

其它平台的移植版本可以通过Nuget来安装。(Nuget使用方法:http://www.cjavapy.com/article/21/)

命名空间:using System.Net.Http;

HttpClient推荐使用单一实例共享使用,发关请求的方法推荐使用异步的方式,代码如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<span>using</span> System;
<span>using</span> System.Collections.Generic;
<span>using</span> System.Linq;
<span>using</span> System.Text;
<span>using</span> System.Threading.Tasks;
<span>using</span> System.Net.Http;

<span>namespace</span> <span>ConsoleApplication</span>
{
<span>class</span> <span>Program</span>
{
<span>private</span> <span>static</span> <span>readonly</span> HttpClient client = <span>new</span> HttpClient();
<span><span>static</span> <span>void</span> <span>Main</span>(<span><span>string</span>[] args</span>)
</span>{

<span>var</span> responseString = <span>await</span> client.GetStringAsync(<span>"http://www.example.com/recepticle.aspx"</span>);

<span>var</span> values = <span>new</span> Dictionary
{
{ <span>"thing1"</span>, <span>"hello"</span> },
{ <span>"thing2"</span>, <span>"world"</span> }
};
<span>var</span> content = <span>new</span> FormUrlEncodedContent(values);
<span>var</span> response = <span>await</span> client.PostAsync(<span>"http://www.example.com/recepticle.aspx"</span>, content);
<span>var</span> responseString = <span>await</span> response.Content.ReadAsStringAsync();
}
}
}<br>

2、使用第三方类库

除了上述方法,还有许多第三方库可以用于发送HTTP请求,例如 RestSharpFlurl。这些库通常提供更高级的功能,例如支持多种身份验证方法和自动重试机制。

1)Flurl.Http(可以通过Nuget来安装)

Flurl.Http 是一个在 .NET 环境下使用的流行的 HTTP 客户端库。它提供了一个简洁的 API 来创建 HTTP 请求,并支持异步操作。Flurl.Http 使得发送 HTTP 请求、接收响应、处理异常和解析数据变得非常简单。

命名空间:using Flurl.Http;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<span>using</span> System;
<span>using</span> System.Collections.Generic;
<span>using</span> System.Linq;
<span>using</span> System.Text;
<span>using</span> System.Threading.Tasks;
<span>using</span> Flurl.Http;

<span>namespace</span> <span>ConsoleApplication</span>
{
<span>class</span> <span>Program</span>
{
<span><span>public</span> <span>static</span> <span>async</span> Task <span>Main</span>(<span><span>string</span>[] args</span>)
</span>{

<span>string</span> getUrl = <span>"https://example.com"</span>;
<span>string</span> postUrl = <span>"https://example.com/post"</span>;


<span>string</span> htmlContent = <span>await</span> GetHtmlAsync(getUrl);
Console.WriteLine(<span>"GET请求结果:"</span>);
Console.WriteLine(htmlContent);


<span>var</span> postData = <span>new</span> { Name = <span>"John"</span>, Age = <span>30</span> };
<span>var</span> postResponse = <span>await</span> PostJsonAsync&lt;<span>object</span>&gt;(postUrl, postData);
Console.WriteLine(<span>"POST请求结果:"</span>);
Console.WriteLine(postResponse);


<span>string</span> htmlContentWithHeaders = <span>await</span> GetHtmlWithHeadersAsync(getUrl);
Console.WriteLine(<span>"带查询参数和头信息的GET请求结果:"</span>);
Console.WriteLine(htmlContentWithHeaders);


<span>string</span> safeHtmlContent = <span>await</span> SafeRequestAsync(getUrl);
Console.WriteLine(<span>"安全GET请求结果:"</span>);
Console.WriteLine(safeHtmlContent);
}
<span><span>public</span> <span>static</span> <span>async</span> Task&lt;<span>string</span>&gt; <span>GetHtmlAsync</span>(<span><span>string</span> url</span>)
</span>{
<span>return</span> <span>await</span> url.GetStringAsync();
}

<span>public</span> <span>static</span> <span>async</span> Task&lt;TResponse&gt; PostJsonAsync&lt;TResponse &gt;(<span>string</span> url, <span>object</span> data)
{
<span>return</span> <span>await</span> url
.PostJsonAsync(data)
.ReceiveJson&lt;TResponse&gt;();
}

<span><span>public</span> <span>static</span> <span>async</span> Task&lt;<span>string</span>&gt; <span>GetHtmlWithHeadersAsync</span>(<span><span>string</span> url</span>)
</span>{
<span>return</span> <span>await</span> url
.SetQueryParams(<span>new</span> { param1 = <span>"value1"</span>, param2 = <span>"value2"</span> })
.WithHeader(<span>"Accept"</span>, <span>"application/json"</span>)
.GetStringAsync();
}

<span><span>public</span> <span>static</span> <span>async</span> Task&lt;<span>string</span>&gt; <span>SafeRequestAsync</span>(<span><span>string</span> url</span>)
</span>{
<span>try</span>
{
<span>return</span> <span>await</span> url.GetStringAsync();
}
<span>catch</span> (FlurlHttpException ex)
{
<span>return</span> <span>"HTTP Error: "</span> + ex.Message;
}
<span>catch</span> (Exception ex)
{
<span>return</span> <span>"General Error: "</span> + ex.Message;
}
}
}
}<br>

2)RestSharp(可以通过Nuget来安装)

RestSharp 是一个用于在 .NET 中发送 HTTP 请求的简单 REST 和 HTTP API 客户端。它可以用于构建和发送各种 HTTP 请求,并处理响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<span>using</span> System;
<span>using</span> System.Collections.Generic;
<span>using</span> System.Linq;
<span>using</span> System.Text;
<span>using</span> System.Threading.Tasks;
<span>using</span> RestSharp;

<span>namespace</span> <span>ConsoleApplication</span>
{
<span>class</span> <span>Program</span>
{
<span><span>static</span> <span>void</span> <span>Main</span>(<span><span>string</span>[] args</span>)
</span>{

RestClient client = <span>new</span> RestClient(<span>"http://example.com"</span>);
RestRequest req = <span>new</span> RestRequest(<span>"resource/{id}"</span>, Method.GET);
request.AddParameter(<span>"name"</span>, <span>"value"</span>);
request.AddUrlSegment(<span>"id"</span>, <span>"123"</span>);




IRestResponse response = client.Execute(request);


<span>var</span> content = response.Content;


IRestResponse response2 = client.Execute(request);
<span>var</span> name = response2.Data.Name;

client.DownloadData(request).SaveAs(path);

<span>await</span> client.ExecuteAsync(request);

<span>var</span> asyncHandle = client.ExecuteAsync(request, response =&gt; {
Console.WriteLine(response.Data.Name);
});

asyncHandle.Abort();
}

}
}<br>

3、WebRequest 和 WebResponse

较旧的方法,现在通常推荐使用 HttpClient。但在一些旧项目或特定场景下,WebRequestWebResponse 仍然有用。

适用平台:.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 1.0+

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<span>using</span> System;
<span>using</span> System.Collections.Generic;
<span>using</span> System.Linq;
<span>using</span> System.Text;
<span>using</span> System.Threading.Tasks;
<span>using</span> System.Net;
<span>using</span> System.IO;

<span>namespace</span> <span>ConsoleApplication</span>
{
<span>class</span> <span>Program</span>
{
<span><span>static</span> <span>void</span> <span>Main</span>(<span><span>string</span>[] args</span>)
</span>{

<span>var</span> request = (HttpWebRequest)WebRequest.Create(<span>"http://www.example.com/recepticle.aspx"</span>);
<span>var</span> response = (HttpWebResponse)request.GetResponse();
<span>var</span> responseString = <span>new</span> StreamReader(response.GetResponseStream()).ReadToEnd();

<span>var</span> request = (HttpWebRequest)WebRequest.Create(<span>"http://www.example.com/recepticle.aspx"</span>);
<span>var</span> postData = <span>"thing1=hello"</span>;
postData += <span>"&amp;thing2=world"</span>;
<span>var</span> data = Encoding.ASCII.GetBytes(postData);
request.Method = <span>"POST"</span>;
request.ContentType = <span>"application/x-www-form-urlencoded"</span>;
request.ContentLength = data.Length;
<span>using</span> (<span>var</span> stream = request.GetRequestStream())
{
stream.Write(data, <span>0</span>, data.Length);
}
<span>var</span> response = (HttpWebResponse)request.GetResponse();
<span>var</span> responseString = <span>new</span> StreamReader(response.GetResponseStream()).ReadToEnd();
}

}
}<br>

4、通过WebClient的方式发送请求

C#中,WebClient类提供了一个简单的方法来发送和接收数据到和从一个URI(如一个网页或Web服务)上。

适用平台:.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 2.0+

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<span>using</span> System;
<span>using</span> System.Collections.Generic;
<span>using</span> System.Linq;
<span>using</span> System.Text;
<span>using</span> System.Threading.Tasks;
<span>using</span> System.Net;
<span>using</span> System.Collections.Specialized;

<span>namespace</span> <span>ConsoleApplication</span>
{
<span>class</span> <span>Program</span>
{
<span><span>static</span> <span>void</span> <span>Main</span>(<span><span>string</span>[] args</span>)
</span>{

<span>string</span> url = <span>string</span>.Format(<span>"http://localhost:28450/api/values?p1=a&amp;p2=b"</span>);
<span>using</span> (<span>var</span> wc = <span>new</span> WebClient())
{
Encoding enc = Encoding.GetEncoding(<span>"UTF-8"</span>);
Byte[] pageData = wc.DownloadData(url);
<span>string</span> re = enc.GetString(pageData);
}

<span>using</span> (<span>var</span> client = <span>new</span> WebClient())
{
<span>var</span> values = <span>new</span> NameValueCollection();
values[<span>"thing1"</span>] = <span>"hello"</span>;
values[<span>"thing2"</span>] = <span>"world"</span>;
<span>var</span> response = client.UploadValues(<span>"http://www.example.com/recepticle.aspx"</span>, values);
<span>var</span> responseString = Encoding.Default.GetString(response);
}
}

}
}<br>