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

一、什么是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日

相关文章

  • Javascript 使用ajax与C#获取文件大小实例详解

    下面我将详细讲解 “Javascript使用ajax与C#获取文件大小实例详解” 的完整攻略。 什么是Ajax? Ajax(Asynchronous JavaScript And XML),指异步的JavaScript和XML。可以在不重新加载整个网页的情况下与服务器交换数据并更新部分网页内容。 通过Ajax获取文件大小的步骤 创建XMLHttpReques…

    C# 2023年5月15日
    00
  • .NET 6 即将到来的新特性 隐式命名空间引用

    .NET 6 即将到来的新特性:隐式命名空间引用 在 .NET 6 中,引入了一项新特性:隐式命名空间引用。这项特性可以让我们在项目中使用命名空间时更加方便,无需显式地引用命名空间。本攻略将详细介绍隐式命名空间引用的使用方法,并提供两个示例说明。 隐式命名空间引用 在 .NET 6 中,我们可以使用隐式命名空间引用来简化项目中的命名空间引用。隐式命名空间引用…

    C# 2023年5月17日
    00
  • c# 怎样简洁高效的实现多个 Enum 自由转换

    C#怎样简洁高效的实现多个Enum自由转换 在C#中,Enum是一种常用的数据类型,它可以用于定义一组常量。在实际开发中,我们经常需要将不同的Enum类型进行转换,以便在不同的上下文中使用。本文将介绍如何使用C#实现多个Enum自由转换,并提供两个示例来演示如何使用这些技术。 示例1:使用扩展方法实现Enum转换 以下是使用扩展方法实现Enum转换的步骤: …

    C# 2023年5月15日
    00
  • 图文详解C#中的协变与逆变

    图文详解C#中的协变与逆变 什么是协变与逆变 协变和逆变是指可以使用派生类型来代替基类型的能力。协变用于返回值类型,逆变用于参数类型。在C#中,协变和逆变可以应用于委托(delegate)和泛型(generic)类型。 协变 协变可用于返回类型,指一个方法返回类型可以使用它继承的类型。使用out关键字可实现协变。 示例1 class Program { st…

    C# 2023年5月15日
    00
  • 在.NET Core使用 HttpClient 的正确方式

    前言 HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类,用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法,如 GET、POST、PUT 和 DELETE,可以很容易地构造和发送 HTTP 请求,并处理响应数据。它是我们比较常用的官方HTTP请求组件,那么你们都正确…

    C# 2023年4月17日
    00
  • Sql Server下数据库链接的使用方法

    下面是Sql Server下数据库链接的使用方法的完整攻略: 创建数据库链接 要在 SQL Server 中创建数据库链接,可以使用以下语法: EXEC sp_addlinkedserver @server = ‘SERVER_NAME’, @srvproduct = ‘PRODUCT_NAME’, @provider = ‘PROVIDER_NAME’, …

    C# 2023年5月31日
    00
  • C#如何连接MySQL数据库

    下面是关于如何连接MySQL数据库的详细攻略: 准备工作 在使用 C# 连接MySQL数据库之前,我们需要先进行一些准备工作: 安装 MySQL Connector/NET。下载链接:https://dev.mysql.com/downloads/connector/net/ 在我们的项目中添加对 MySQL Connector/NET 的引用。 为了便于操…

    C# 2023年5月15日
    00
  • VS中C#读取app.config数据库配置字符串的三种方法

    下面是详细讲解“VS中C#读取app.config数据库配置字符串的三种方法”的攻略。 1. 前言 在我们编写C#程序时,经常需要获取app.config文件中的数据库连接字符串。在Visual Studio中,我们可以通过以下三种方法来实现该功能。 2. 方法一:通过ConfigurationManager读取 使用System.Configuration…

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