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#动态执行字符串(动态创建代码)的实例代码

    完整攻略: 在C#语言中,可以通过动态执行字符串的方式来动态创建代码。这个过程涉及到C#中的一些重要的关键字和类,比如dynamic、CompilerParameters等。 以下是这个过程的完整示例代码: 示例1 // 创建C#代码字符串 string code = @" public class DynamicCode { public sta…

    C# 2023年5月31日
    00
  • c#入门之循环语句使用详解(for循环、do/while)

    C#入门之循环语句使用详解(for循环、do/while) 引言 在编写程序的过程中,经常需要对某些语句进行重复的执行,这时候就需要使用循环语句。本文将详细讲解C#中for循环和do/while循环的使用。 for循环 for循环是最基本的循环语句之一,在C#中也有完整的语法: for (initialization; condition; incremen…

    C# 2023年5月31日
    00
  • jquery连缀语法如何实现

    jQuery连缀语法(Chaining)可以让我们在一个语句中使用多个jQuery方法,以及对元素进行多个操作。这样可以使代码更加紧凑、可读性更高,提升开发效率。 实现连缀语法的关键在于,每个jQuery方法都可以返回jQuery对象本身,使其在下一个方法中能够被继续使用。 下面将详细介绍如何实现jQuery连缀语法的完整攻略: 创建一个jQuery对象 我…

    C# 2023年6月6日
    00
  • ASP.net 路径问题 详解

    下面我将为你详细讲解ASP.NET路径问题的攻略。 一、背景知识 在ASP.NET中,路径问题是非常常见的。在编写代码或引用文件时,我们需要使用路径来定位所需的资源或文件。但是,不同的路径表示方式有可能导致不同的结果。因此,了解不同路径的含义和规则是非常重要的。 二、基本概念 在ASP.NET中,我们常使用以下几种路径表示方式: 1. 相对路径 相对路径是以…

    C# 2023年6月3日
    00
  • C#使用iCSharpcode进行文件压缩实现方法

    下面是“C#使用iCSharpcode进行文件压缩实现方法”的完整攻略。 1. 引入iCSharpcode.SharpZipLib库 在C#中使用iCSharpcode进行文件压缩需要引入其提供的SharpZipLib库。可以通过NuGet来引入,也可以直接下载安装至本地项目中。 2. 使用ZipOutputStream进行文件压缩 压缩一个文件可以使用如下…

    C# 2023年6月1日
    00
  • C#中的事件介绍

    C#中的事件介绍 在C#中,事件是一种典型的观察者设计模式的应用。事件机制使得对象间的协作变得更加松散,同时也易于扩展。本篇文章将介绍C#中的事件,包括事件的定义、事件的注册和注销以及如何触发事件。 定义事件 在C#中,事件是一种特殊的委托,它定义了一个回调函数的集合。定义事件的方式是使用event关键字,语法如下: public event EventHa…

    C# 2023年5月31日
    00
  • ASP.NET Core Kestrel 中使用 HTTPS (SSL)

    在 ASP.NET Core 中,可以使用 Kestrel 服务器来启用 HTTPS(SSL)协议。以下是 ASP.NET Core Kestrel 中使用 HTTPS 的完整攻略: 步骤一:创建证书 在使用 HTTPS 之前,需要创建一个证书。可以使用 OpenSSL 工具或者 Windows PowerShell 命令来创建证书。以下是使用 OpenSS…

    C# 2023年5月17日
    00
  • JQuery异步加载PartialView的方法

    当需要在页面中通过Ajax加载局部视图(Partial Views)时,可以使用jQuery的ajax()方法和MVC的部分视图(Partial Views)来轻松实现。 下面是JQuery异步加载PartialView的方法的完整攻略: 1、在MVC控制器中创建Partial View 首先,在MVC控制器中创建Partial View方法,具体代码如下:…

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