一、什么是HttpClient?
HttpClient
是 C# 中的一种 HTTP 客户端,它可以让我们发送 HTTP 请求,并通过获取 HTTP 响应获取返回结果。它是 .NET Core 中自带的一个类,不需要额外安装插件。
二、如何使用 HttpClient?
要使用 HttpClient
,需先在 .NET Core 的项目中引入 System.Net.Http
。
using System.Net.Http;
接下来,我们可以通过下面的代码创建一个 HttpClient
对象:
HttpClient client = new HttpClient();
接着,我们就可以使用 client
对象来发送 HTTP 请求了。比如,发送 GET 请求:
HttpResponseMessage response = await client.GetAsync("https://www.example.com");
三、发送 HTTP 请求
我们可以使用不同的方法来创建 HTTP 请求,比如 GET、POST、PUT、DELETE 等。这里,我们以 GET 请求为例,讲解一下如何创建并发送一个 HTTP 请求。
1、创建 HTTP 请求
下面是一个 GET 请求的示例代码:
var request = new HttpRequestMessage(HttpMethod.Get, "https://www.example.com");
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
在示例代码中, new HttpRequestMessage(HttpMethod.Get, "https://www.example.com")
用于创建 HTTP GET 请求,其中,HttpMethod.Get
表示请求方法为 GET, https://www.example.com
表示请求的 URL。
2、添加 Headers
如果想要发送的 HTTP 请求需要带有 Headers,我们需要在 HttpRequestMessage
对象上添加 Headers。如示例代码中的 request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
,表示在请求 Headers 中添加了 User-Agent。
3、发送 HTTP 请求
我们可以通过 HttpClient
对象的 SendAsync
方法来发送 HTTP 请求,示例如下:
HttpResponseMessage response = await client.SendAsync(request);
4、获取 HTTP 响应
我们可以从 HttpResponseMessage
对象中获取 HTTP 响应的状态码、Headers、响应内容等信息。示例如下:
string content = await response.Content.ReadAsStringAsync();
四、HttpClient 常见问题
1、HttpClient 使用过程中,如何避免内存泄漏?
由于 HttpClient
使用的是一个长连接,因此在使用的时候应该尽量避免频繁创建和释放 HttpClient
对象,避免内存泄漏问题。
解决这个问题的方法是使用单例模式,将 HttpClient
对象作为单例对象进行使用:
public static class HttpHelper
{
private static readonly HttpClient HttpClient = new HttpClient();
public static async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return await HttpClient.SendAsync(request, cancellationToken);
}
}
2、HttpClient 使用过程中,如何处理网络异常?
在使用 HttpClient
的时候,经常会遇到网络请求失败、超时等异常情况。针对这些异常情况,我们可以使用以下代码进行处理:
try
{
HttpResponseMessage response = await client.SendAsync(request);
string content = await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException ex)
{
Console.WriteLine($"HttpRequestException: {ex.Message}");
}
catch (TaskCanceledException ex)
{
Console.WriteLine($"TaskCanceledException: {ex.Message}");
}
catch (OperationCanceledException ex)
{
Console.WriteLine($"OperationCanceledException: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
五、实例展示
下面是一个使用 HttpClient
获取百度首页 HTML 内容的示例:
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace HttpClientDemo
{
class Program
{
static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://www.baidu.com/");
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
try
{
HttpResponseMessage response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
else
{
Console.WriteLine($"StatusCode: {response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
}
}
}
下面是一个使用 HttpClient
获取百度首页图片的示例:
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
namespace HttpClientDemo
{
class Program
{
static async Task Main(string[] args)
{
HttpClient client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://www.baidu.com/img/bd_logo1.png");
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
try
{
HttpResponseMessage response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
Stream stream = await response.Content.ReadAsStreamAsync();
byte[] bytes = await response.Content.ReadAsByteArrayAsync();
string filename = "bd_logo1.png";
using (var fileStream = new FileStream(filename, FileMode.Create))
{
await stream.CopyToAsync(fileStream);
}
Console.WriteLine($"file {filename} download success.");
}
else
{
Console.WriteLine($"StatusCode: {response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
}
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#爬虫基础之HttpClient获取HTTP请求与响应 - Python技术站