C# HTTP客户端:从A到Z正确发起请求

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# HTTP客户端:从A到Z正确发起请求

\n\n

在.NET平台的现代开发中,处理HTTP请求是一项关键任务。无论是与外部REST API集成、向服务器发送数据还是下载网页——在C#中正确使用HttpClient对于应用程序的性能和稳定性至关重要。本文将全面解析C#中HTTP客户端的使用:从基础示例到高级技术、错误处理和最佳实践。

\n\n

1. C#中HttpClient的基础知识

\n\n

HttpClient是.NET中用于发送HTTP请求和接收响应的主要类。它位于System.Net.Http命名空间中,从.NET Framework 4.5及所有版本的.NET Core/.NET 5+开始可用。

\n\n

重要规则: HttpClient设计用于重复使用。为每个请求创建新实例是一种反模式,可能导致套接字耗尽(socket exhaustion)。应改用单个静态或单例实例。

\n\n

GET请求的基础示例:

\n\n
using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    private static readonly HttpClient client = new HttpClient();\n\n    static async Task Main(string[] args)\n    {\n        try\n        {\n            HttpResponseMessage response = await client.GetAsync("https://api.example.com/data");\n            response.EnsureSuccessStatusCode();\n            string responseBody = await response.Content.ReadAsStringAsync();\n            Console.WriteLine(responseBody);\n        }\n        catch (HttpRequestException e)\n        {\n            Console.WriteLine($"请求错误: {e.Message}");\n        }\n    }\n}
\n\n

在此示例中,我们创建了一个静态的HttpClient,发送GET请求,使用EnsureSuccessStatusCode()检查响应是否成功,并将响应正文作为字符串读取。

\n\n

2. HTTP请求类型与标头处理

\n\n

除了GET之外,HttpClient支持所有主要的HTTP方法:POST、PUT、DELETE、PATCH等。让我们看看如何发送带有JSON数据的POST请求——这是使用REST API时最常见的场景。

\n\n

带JSON的POST请求示例:

\n\n
using System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    private static readonly HttpClient client = new HttpClient();\n\n    static async Task Main(string[] args)\n    {\n        var data = new { Name = "John", Age = 30 };\n        string json = JsonSerializer.Serialize(data);\n        var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n        try\n        {\n            HttpResponseMessage response = await client.PostAsync("https://api.example.com/users", content);\n            response.EnsureSuccessStatusCode();\n            string result = await response.Content.ReadAsStringAsync();\n            Console.WriteLine($"用户已创建: {result}");\n        }\n        catch (HttpRequestException e)\n        {\n            Console.WriteLine($"错误: {e.Message}");\n        }\n    }\n}
\n\n

处理标头: API通常需要传递身份验证令牌或其他标头。可以通过两种方式添加:

\n\n
    \n
  • 全局设置——通过DefaultRequestHeaders属性(适用于客户端的所有请求)。
  • \n
  • 局部设置——通过HttpRequestMessage对象中的Headers集合(适用于特定请求)。
  • \n
\n\n

添加Authorization标头的示例:

\n\n
// 全局设置\nclient.DefaultRequestHeaders.Authorization = \n    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "your-token");\n\n// 局部设置\nvar request = new HttpR                

博客

书籍推荐