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日

相关文章

  • C#的Excel导入、导出

    下面给您详细讲解C#中的Excel导入和导出的完整攻略。 导入Excel 使用第三方库 要导入Excel文件到C#程序中,常用的做法是使用第三方库。其中比较常用的库有: NPOI:NPOI是C#的开源库,用于按照Microsoft Office的公开标准读写Excel文件。功能强大,支持.xls、.xlsx、.ppt、.pptx、.doc和.docx等Off…

    C# 2023年5月15日
    00
  • 在C#程序中注入恶意DLL的方法详解

    对于“在C#程序中注入恶意DLL的方法详解”的攻略,我将分为以下几个方面进行详细讲解: DLL注入的定义及原理 DLL注入的方法与过程 两个示例: 使用远程线程注入DLL、使用程序集注入DLL 1. DLL注入的定义及原理 DLL注入指的是将一个DLL文件动态注入到目标进程中的技术,这里的DLL文件可以是自己编写的,也可以是恶意代码,使用DLL注入技术,可以…

    C# 2023年5月15日
    00
  • C#文件操作类分享

    C#文件操作类分享 本文将分享C#中常见的文件操作类以及它们的使用方法,帮助开发者更好地处理文件输入输出。 StreamReader类 StreamReader类可以用于读取文本文件中的数据。 读取整个文件 string path = @"C:\data.txt"; using (StreamReader sr = new StreamR…

    C# 2023年5月31日
    00
  • C#入参使用引用类型要加ref的原因解析

    C#中,我们可以将变量传递给方法,以便在方法内部使用。但是在使用引用类型作为参数时,我们需要使用关键字ref。那么为什么要这么做呢?接下来就进行详细讲解。 1. 值类型和引用类型的区别 在开始解释原因之前,我们必须要先理解值类型和引用类型的不同之处。在C#中,值类型包括int、double、bool等基本数据类型,而引用类型则包括string、object和…

    C# 2023年6月1日
    00
  • C#泛型方法在lua中表示的一种设计详解

    C#泛型方法在lua中表示的一种设计详解 在C#中我们可以使用泛型方法来实现更加灵活的代码设计,而在将C#代码转换为Lua代码时,如何正确地将泛型方法转换为Lua代码也是一项必需的技能。本文将介绍一种C#泛型方法在Lua中表示的设计方法。 泛型方法的基本语法 C#中泛型方法的基本语法如下: public void Method<T>(T inpu…

    C# 2023年5月15日
    00
  • 基于ajax与msmq技术的消息推送功能实现代码

    我可以为你提供一份详细的基于ajax与msmq技术的消息推送功能实现代码攻略。 简介 基于ajax与msmq技术的消息推送功能,本质上是一种实时通信(real-time communication)的方式。通常情况下,网页通信是通过http协议和服务器进行的,即客户端只能在一定的时间间隔内向服务器发送请求,服务器就会在收到请求时返回数据。而基于ajax与ms…

    C# 2023年6月6日
    00
  • C#检测是否有危险字符的SQL字符串过滤方法

    为了防止SQL注入等安全问题,我们需要对用户输入的数据进行安全过滤。下面是一个利用C#实现检测是否有危险字符的SQL字符串过滤方法的完整攻略。 第一步:准备过滤规则 我们需要先定义一些危险字符的规则,用于检测用户输入的字符串是否包含这些危险字符。以下是一些常用的规则: static readonly string[] DangerousStrings = {…

    C# 2023年6月8日
    00
  • c# 配置文件App.config操作类库的方法

    以下是关于”C# 配置文件 App.config 操作类库的方法”的详细攻略。 什么是 App.config 文件? App.config 文件是 C#/.NET 应用程序的配置文件,它包含应用程序的设置和属性。这些设置可以在运行时或在设计时通过 System.Configuration 命名空间来访问和修改。App.config 文件的格式是 XML。 如…

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