C# (.NET) HTTP客户端:顶级Web请求库

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

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

开始课程

C#(.NET)的HTTP客户端:处理Web请求的顶级库



在现代 .NET 平台开发中,与Web服务和API的交互是一项关键任务。选择合适的HTTP客户端可以显著简化代码、提高可读性和性能。本文将介绍C#中处理HTTP的四个最佳库:从内置的HttpClient到专用解决方案RestSharp、Flurl和Refit。本文对初学者和有经验、希望优化项目的开发者都很有帮助。



1. HttpClient——.NET内置标准



HttpClient是来自System.Net.Http命名空间的主要类,从.NET 4.5开始所有版本均可用。它无需安装额外包,提供对请求发送过程的完全控制。



主要特点:

  • 支持异步操作(async/await)。
  • 原生流式处理(Stream)用于下载大文件。
  • 灵活配置标头、超时、代理。
  • 与IHttpClientFactory集成以管理生命周期(建议在ASP.NET Core中使用)。


基本使用示例:

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

class Program{ static async Task Main(string[] args) { using var client = new HttpClient(); client.BaseAddress = new Uri("https://api.github.com"); client.DefaultRequestHeaders.Add("User-Agent", "C# App");

HttpResponseMessage response = await client.GetAsync("/repos/dotnet/core"); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); Console.WriteLine(content); } }}


何时使用:用于简单请求,不需要复杂错误处理或序列化时。非常适合微服务和后台任务。



2. RestSharp——简单与便利



RestSharp(通过NuGet安装:Install-Package RestSharp)是.NET最流行的第三方库之一。它抽象了HTTP工作,提供流畅接口和自动JSON、XML序列化/反序列化。



优点:

  • 自动将响应转换为C#对象。
  • 内置身份验证支持(Basic、OAuth、JWT)。
  • 便捷处理请求参数(query、header、body)。
  • 支持文件上传(multipart/form-data)。


RestSharp示例:

using RestSharp;using System;

class GithubClient{ public async Task<string> GetRepoInfo(string owner, string repo) { var client = new RestClient("https://api.github.com"); var request = new RestRequest($"/repos/{owner}/{repo}", Method.Get); request.AddHeader("User-Agent", "RestSharpDemo");

var response = await client.ExecuteAsync(request); if (response.IsSuccessful) { return response.Content; } else { throw new Exception($"错误: {response.StatusCode}"); } }}


何时使用:用于快速开发REST API客户端,当代码简单性和最少手动配置很重要时。



3. Flurl——流畅风格与链式调用



Flurl(NuGet:Install-Package Flurl.Http)是一个让HTTP请求像方法链的库。它与LINQ和异步操作完美结合。



特点:

  • 可读语法:url.AppendPathSegment(...).SetQueryParams(...).GetJsonAsync()
  • 内置JSON序列化/反序列化支持
  • 方便的错误处理和重试
  • 通过接口实现可测试性


Flurl示例:

using Flurl;using Flurl.Http;using System;

class Program{ static async Task Main() { try { var result = await "https://api.github.com" .AppendPathSegment("repos/dotnet/core") .WithHeader("User-Agent", "FlurlDemo") .GetJsonAsync(); Console.WriteLine(result); } catch (FlurlHttpException ex) { Console.WriteLine($"错误: {ex.StatusCode}"); } }}


何时使用:用于代码可读性和链式调用很重要的项目。非常适合具有大量请求的API客户端。



4. Refit——声明式方法



Refit(NuGet:Install-Package Refit)是一个通过带属性的接口定义HTTP客户端的库。它会在运行时自动生成实现。



特点:

  • 通过接口声明式定义API
  • 自动代码生成
  • 支持异步方法
  • 与DI容器集成


Refit示例:

using Refit;using System;using System.Threading.Tasks;

public interface IGitHubApi{ [Get("/repos/{owner}/{repo}")] Task<string> GetRepoInfo(string owner, string repo);}

class Program{ static async Task Main() { var client = RestService.For<IGitHubApi>("https://api.github.com"); try { var result = await client.GetRepoInfo("dotnet", "core"); Console.WriteLine(result); } catch (ApiException ex) { Console.WriteLine($"错误: {ex.StatusCode}"); } }}


何时使用:用于具有明确定义API的大型项目。非常适合团队开发和微服务架构。



结论



HTTP客户端的选择取决于项目的具体任务:

  • HttpClient——用于简单场景和最大控制
  • RestSharp——用于快速开发REST客户端
  • Flurl——用于可读且简洁的代码
  • Refit——用于声明式方法和大型项目


所有四个库都得到积极维护并拥有庞大社区。建议在小型测试项目中尝试每一个,以选择最适合您需求的那个。

推荐