.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请求,例如 RestSharp
和 Flurl
。这些库通常提供更高级的功能,例如支持多种身份验证方法和自动重试机制。
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<<span>object</span>>(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<<span>string</span>> <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<TResponse> PostJsonAsync<TResponse >(<span>string</span> url, <span>object</span> data) { <span>return</span> <span>await</span> url .PostJsonAsync(data) .ReceiveJson<TResponse>(); } <span><span>public</span> <span>static</span> <span>async</span> Task<<span>string</span>> <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<<span>string</span>> <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 => { Console.WriteLine(response.Data.Name); }); asyncHandle.Abort(); } } }<br>
|
3、WebRequest 和 WebResponse
较旧的方法,现在通常推荐使用 HttpClient
。但在一些旧项目或特定场景下,WebRequest
和 WebResponse
仍然有用。
适用平台:.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>"&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&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>
|