C#爬虫基础之HttpClient获取HTTP请求与响应

yizhihongxing

一、什么是HttpClient?

HttpClientC# 中的一种 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技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • ASP.Net Core中使用枚举类而不是枚举的方法

    ASP.Net Core是一个开源的Web应用程序框架,支持多种操作系统和平台。其中使用枚举类而不是枚举的方法,可以使代码更加可读,可维护和可扩展。 1.枚举类的定义 在ASP.Net Core中定义枚举类可以使用如下方法: public class CardSuit { public const int Hearts = 0; public const i…

    C# 2023年6月6日
    00
  • ASP.Net Core MVC基础系列之中间件

    ASP.NET Core MVC基础系列之中间件 在ASP.NET Core MVC中,中间件是非常重要的。本攻略将提供详细的步骤和示例说明,演示如何使用ASP.NET Core MVC中的中间件。 步骤 步骤1:创建一个新的ASP.NET Core MVC应用程序 首先,需要创建一个新的ASP.NET Core MVC应用程序。可以使用以下命令在命令行中创…

    C# 2023年5月17日
    00
  • ASP.NET Core中的Caching组件简介

    ASP.NET Core中的Caching组件简介 ASP.NET Core中的Caching组件是一种用于缓存数据的机制。它允许我们将数据缓存在内存、分布式缓存或其他缓存存储中,以提高应用程序的性能和响应速度。本攻略将详细介绍ASP.NET Core中的Caching组件的概念、用法和示例。 什么是Caching组件? Caching组件是一种用于缓存数据…

    C# 2023年5月16日
    00
  • ASP.NET Core基础之异常中间件

    ASP.NET Core 中间件是一种非常强大的工具,可以用于处理请求和响应。异常中间件是一种特殊的中间件,用于处理应用程序中的异常。以下是 ASP.NET Core 基础之异常中间件的完整攻略: 步骤一:创建 ASP.NET Core 应用程序 首先,需要一个 ASP.NET Core 应用程序。可以使用以下命令在 Visual Studio 中创建一个 …

    C# 2023年5月17日
    00
  • C# 泛型字典 Dictionary的使用详解

    C# 泛型字典 Dictionary的使用详解 什么是C#泛型字典 在C#中,泛型字典Dictionary是一种可用于存储键值对的数据结构。它是一个强类型的数据结构,其中每个键和值都具有指定的数据类型。 如何使用C#泛型字典 创建一个字典 在C#中创建一个字典可以使用Dictionary类,其中K和V分别代表键和值的数据类型。以下是一个创建字符串键与整数值的…

    C# 2023年6月1日
    00
  • 对C# 多态的理解

    对C#多态的理解 什么是多态 多态是定义在父类中的函数被子类继承之后,可以具有不同的实现方式的一种能力。C#中的多态主要有两种实现方式:重载和重写。 重载 重载是通过定义同名的方法,但拥有不同的参数列表,实现多态的一种方式。C#中的重载函数必须拥有不同的参数个数或参数类型,否则编译器无法识别。 下面是一个求两个整数和的函数Add的重载示例: public i…

    C# 2023年5月15日
    00
  • 利用多线程句柄设置鼠标忙碌状态的实现方法

    实现鼠标忙碌状态的方法一般有两种,分别是使用win32api的SetCursor和自定义控件来实现。使用多线程句柄设置鼠标忙碌状态需要采用自定义控件的方法,因为SetCursor属于UI线程接口,不能在多线程中直接调用。 以下是实现方法的完整攻略: 创建自定义控件 首先需要创建一个自定义控件来替代系统的鼠标指针。这个自定义控件可以是一个静态图片,也可以是一个…

    C# 2023年6月7日
    00
  • .net三层结构初探分析

    我为您详细讲解“.Net三层结构初探分析”的完整攻略。 什么是“.Net三层结构初探分析”? 在我们开发软件的过程中,为了保证开发的高效性以及软件的易于维护性,我们通常使用三层结构进行开发。所谓三层结构,指的是数据访问层、业务逻辑层以及表现层。这样分层设计的好处是显而易见的,它可以将各个业务之间相互独立,同时也能够方便后期的维护。 在.Net三层结构初探分析…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部