跳到主要内容

C# HTTP 客户端

介绍

在现代应用程序开发中,与远程服务器进行 HTTP 通信是非常常见的需求。无论是获取数据、提交表单还是调用 API,HTTP 请求都是不可或缺的一部分。C# 提供了强大的工具来处理这些任务,其中最常用的就是 HttpClient 类。

HttpClient 是 .NET 中用于发送 HTTP 请求和接收 HTTP 响应的类。它支持异步操作,能够高效地处理多个请求,并且可以配置各种 HTTP 选项,如超时、请求头和身份验证。

在本教程中,我们将逐步学习如何使用 HttpClient 进行基本的 HTTP 请求,并通过实际案例展示其应用。

基本用法

创建 HttpClient 实例

首先,我们需要创建一个 HttpClient 的实例。通常情况下,建议将 HttpClient 实例作为单例使用,以避免频繁创建和销毁实例带来的性能开销。

csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
using HttpClient client = new HttpClient();
string url = "https://jsonplaceholder.typicode.com/posts/1";
HttpResponseMessage response = await client.GetAsync(url);

if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
else
{
Console.WriteLine($"Error: {response.StatusCode}");
}
}
}

发送 GET 请求

在上面的代码中,我们使用 GetAsync 方法发送了一个 GET 请求。GetAsync 方法返回一个 HttpResponseMessage 对象,其中包含了服务器的响应信息。

  • response.IsSuccessStatusCode:检查请求是否成功(状态码为 2xx)。
  • response.Content.ReadAsStringAsync():将响应内容读取为字符串。

发送 POST 请求

除了 GET 请求,我们还可以发送 POST 请求。以下是一个发送 JSON 数据的 POST 请求示例:

csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
using HttpClient client = new HttpClient();
string url = "https://jsonplaceholder.typicode.com/posts";
var json = "{\"title\": \"foo\", \"body\": \"bar\", \"userId\": 1}";
var content = new StringContent(json, Encoding.UTF8, "application/json");

HttpResponseMessage response = await client.PostAsync(url, content);

if (response.IsSuccessStatusCode)
{
string responseContent = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseContent);
}
else
{
Console.WriteLine($"Error: {response.StatusCode}");
}
}
}

在这个示例中,我们使用 PostAsync 方法发送了一个 POST 请求,并将 JSON 数据作为请求体发送。

实际应用场景

调用 REST API

假设我们正在开发一个天气应用程序,需要从远程 API 获取天气数据。我们可以使用 HttpClient 来调用该 API 并获取数据。

csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
using HttpClient client = new HttpClient();
string apiKey = "your_api_key";
string city = "London";
string url = $"https://api.weatherapi.com/v1/current.json?key={apiKey}&q={city}";

HttpResponseMessage response = await client.GetAsync(url);

if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
else
{
Console.WriteLine($"Error: {response.StatusCode}");
}
}
}

在这个例子中,我们通过 HttpClient 调用了一个天气 API,并获取了伦敦的当前天气数据。

处理异常

在实际应用中,网络请求可能会失败,因此我们需要处理可能出现的异常。以下是一个处理网络请求异常的示例:

csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
using HttpClient client = new HttpClient();
string url = "https://jsonplaceholder.typicode.com/posts/1";

try
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode(); // 如果状态码不是 2xx,抛出异常
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (HttpRequestException e)
{
Console.WriteLine($"Request error: {e.Message}");
}
}
}

在这个示例中,我们使用 try-catch 块来捕获 HttpRequestException 异常,并处理请求失败的情况。

总结

通过本教程,我们学习了如何在 C# 中使用 HttpClient 进行 HTTP 请求。我们介绍了如何发送 GET 和 POST 请求,并展示了如何在实际应用中使用 HttpClient 调用 REST API 和处理异常。

HttpClient 是 C# 网络编程中非常强大的工具,掌握它的使用将帮助你轻松处理各种 HTTP 通信需求。

附加资源

练习

  1. 修改上面的天气应用程序代码,使其能够获取多个城市的天气数据。
  2. 尝试使用 HttpClient 发送 PUT 和 DELETE 请求,并处理响应。
  3. 编写一个简单的控制台应用程序,使用 HttpClient 调用 GitHub API 获取用户的仓库列表。

通过完成这些练习,你将进一步巩固对 HttpClient 的理解和应用。