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
推荐使用单一实例共享使用,发关请求的方法推荐使用异步的方式,代码如下,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Http; namespace ConsoleApplication { class Program { private static readonly HttpClient client = new HttpClient(); static void Main(string[] args) { //发送Get请求 var responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx"); //发送Post请求 var values = new Dictionary { { "thing1", "hello" }, { "thing2", "world" } }; var content = new FormUrlEncodedContent(values); var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content); var responseString = await response.Content.ReadAsStringAsync(); } } }
2、使用第三方类库
除了上述方法,还有许多第三方库可以用于发送HTTP请求,例如 RestSharp
和 Flurl
。这些库通常提供更高级的功能,例如支持多种身份验证方法和自动重试机制。
1)Flurl.Http(可以通过Nuget来安装)
Flurl.Http 是一个在 .NET 环境下使用的流行的 HTTP 客户端库。它提供了一个简洁的 API 来创建 HTTP 请求,并支持异步操作。Flurl.Http 使得发送 HTTP 请求、接收响应、处理异常和解析数据变得非常简单。
命名空间:using Flurl.Http;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Flurl.Http; namespace ConsoleApplication { class Program { public static async Task Main(string[] args) { // 示例URL string getUrl = "https://example.com"; string postUrl = "https://example.com/post"; // 发送GET请求 string htmlContent = await GetHtmlAsync(getUrl); Console.WriteLine("GET请求结果:"); Console.WriteLine(htmlContent); // 发送POST请求 var postData = new { Name = "John", Age = 30 }; var postResponse = await PostJsonAsync<object>(postUrl, postData); Console.WriteLine("POST请求结果:"); Console.WriteLine(postResponse); // 发送带有查询参数和头信息的GET请求 string htmlContentWithHeaders = await GetHtmlWithHeadersAsync(getUrl); Console.WriteLine("带查询参数和头信息的GET请求结果:"); Console.WriteLine(htmlContentWithHeaders); // 安全地发送GET请求 string safeHtmlContent = await SafeRequestAsync(getUrl); Console.WriteLine("安全GET请求结果:"); Console.WriteLine(safeHtmlContent); } public static async Task<string> GetHtmlAsync(string url) { return await url.GetStringAsync(); } public static async Task<TResponse> PostJsonAsync<TResponse >(string url, object data) { return await url .PostJsonAsync(data) .ReceiveJson<TResponse>(); } public static async Task<string> GetHtmlWithHeadersAsync(string url) { return await url .SetQueryParams(new { param1 = "value1", param2 = "value2" }) .WithHeader("Accept", "application/json") .GetStringAsync(); } public static async Task<string> SafeRequestAsync(string url) { try { return await url.GetStringAsync(); } catch (FlurlHttpException ex) { return "HTTP Error: " + ex.Message; } catch (Exception ex) { return "General Error: " + ex.Message; } } } }
2)RestSharp(可以通过Nuget来安装)
RestSharp 是一个用于在 .NET 中发送 HTTP 请求的简单 REST 和 HTTP API 客户端。它可以用于构建和发送各种 HTTP 请求,并处理响应。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RestSharp; namespace ConsoleApplication { class Program { static void Main(string[] args) { //发送Get和Post请求 RestClient client = new RestClient("http://example.com");//指定请求的url RestRequest req = new RestRequest("resource/{id}", Method.GET);//指定请求的方式,如果Post则改成Method.POST request.AddParameter("name", "value"); // 添加参数到 URL querystring request.AddUrlSegment("id", "123"); //替换上面指定请求方式中的{id}参数 //req.AddBody(body); /*如发送post请求,则用req.AddBody ()指定body内容*/ //发送请求得到请求的内容 //如果有header可以使用下面方法添加 //request.AddHeader("header", "value"); IRestResponse response = client.Execute(request); //上传一个文件 //request.AddFile("file", path); var content = response.Content; // 未处理的content是string //还可以下面几种方式发送请求 //发送请求,反序列化请求结果 IRestResponse response2 = client.Execute(request); var name = response2.Data.Name; //发送请求下载一个文件,并保存到path路径 client.DownloadData(request).SaveAs(path); // 简单发送异步请求 await client.ExecuteAsync(request); // 发送异常请求并且反序列化结果 var asyncHandle = client.ExecuteAsync(request, response => { Console.WriteLine(response.Data.Name); }); //终止异步的请求 asyncHandle.Abort(); } } }
3、WebRequest 和 WebResponse
较旧的方法,现在通常推荐使用 HttpClient
。但在一些旧项目或特定场景下,WebRequest
和 WebResponse
仍然有用。
适用平台:.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 1.0+
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.IO; // for StreamReader namespace ConsoleApplication { class Program { static void Main(string[] args) { //发送Get请求 var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx"); var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); //发送Post请求 var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx"); var postData = "thing1=hello"; postData += "&thing2=world"; var data = Encoding.ASCII.GetBytes(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); } } }
4、通过WebClient的方式发送请求
C#中,WebClient类提供了一个简单的方法来发送和接收数据到和从一个URI(如一个网页或Web服务)上。
适用平台:.NET Framework 1.1+, .NET Standard 2.0+, .NET Core 2.0+
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Collections.Specialized; namespace ConsoleApplication { class Program { static void Main(string[] args) { //发送Get请求 string url = string.Format("http://localhost:28450/api/values?p1=a&p2=b"); using (var wc = new WebClient()) { Encoding enc = Encoding.GetEncoding("UTF-8"); Byte[] pageData = wc.DownloadData(url); string re = enc.GetString(pageData); } //发送Post请求 using (var client = new WebClient()) { var values = new NameValueCollection(); values["thing1"] = "hello"; values["thing2"] = "world"; var response = client.UploadValues("http://www.example.com/recepticle.aspx", values); var responseString = Encoding.Default.GetString(response); } } } }