Refit for C# (.NET): 完整指南及示例

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

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

开始课程
\n

Refit for C# (.NET): 类型安全的 REST 客户端

\n\n
\n

1. 什么是 Refit 及其用途

\n

Refit 是一个面向 .NET 平台的开源库,它能根据开发者定义的接口自动生成 HTTP 客户端的实现。它可以将普通的 C# 接口转变为一个功能完整的 REST 客户端,从而免去手动编写执行 HTTP 请求、JSON 序列化/反序列化以及错误处理的样板代码。

\n

Refit 解决的核心问题是在使用 REST API 时与重复代码作斗争。无需为每个端点创建带有 HttpClient 的单独方法、配置标头、处理响应和异常,开发者只需声明一个带有 Refit 属性的接口即可。该库会自行生成实现,使用 HttpClientFactory(推荐方法)或直接使用 HttpClient。

\n

Refit 在开发微服务架构、与第三方 API(如 GitHub、Stripe、Telegram 等)集成,以及任何需要类型安全地与 HTTP 服务交互的项目中特别有用。它支持所有主要的 HTTP 方法(GET、POST、PUT、DELETE、PATCH),并能处理标头、查询参数、请求体、多部分表单和文件。

\n
\n\n
\n

2. 安装

\n

Refit 通过 NuGet 分发。请使用以下任一命令进行安装:

\n
# 通过 .NET CLI\ndotnet add package Refit\n\n# 通过 Package Manager Console (Visual Studio)\nInstall-Package Refit\n\n# 或通过 IDE 中的 NuGet Package Manager
\n

为了使用异步方法并与 ASP.NET Core 集成,建议同时安装 Refit.HttpClientFactory 包:

\n
dotnet add package Refit.HttpClientFactory
\n

如果您使用 System.Text.Json(.NET Core 3.1+ 默认),则无需额外包。如需使用 Newtonsoft.Json,请安装 Refit.Newtonsoft.Json。

\n
\n\n
\n

3. 快速入门 — 最小工作示例

\n

让我们创建一个简单的客户端,用于从 JSONPlaceholder(一个测试 REST API)获取数据。

\n

步骤 1:定义数据模型:

\n
public class Todo\n{\n    public int Id { get; set; }\n    public int UserId { get; set; }\n    public string Title { get; set; }\n    public bool Completed { get; set; }\n}
\n

步骤 2:创建带有 Refit 属性的接口:

\n
using Refit;\n\npublic interface ITodoApi\n{\n    [Get("/todos/{id}")]\n    Task<Todo> GetTodoAsync(int id);\n\n    [Get("/todos")]\n    Task<List<Todo>> GetAllTodosAsync();\n}
\n

步骤 3:使用 Refit 创建客户端:

\n
using Refit;\n\nclass Program\n{\n    static async Task Main(string[] args)\n    {\n        // 直接创建客户端(不使用依赖注入)\n        var todoApi = RestService.For<ITodoApi>("https://jsonplaceholder.typicode.com");\n        \n        // 获取一个 Todo\n        var todo = await todoApi.GetTodoAsync(1);\n        Console.WriteLine($"Todo: {todo.Title}, Completed: {todo.Completed}");\n        \n        // 获取所有 Todos\n        var todos = await todoApi.GetAllTodosAsync();\n        Console.WriteLine($"Total todos: {todos.Count}");\n    }\n}
\n

此示例展示了基本机制:您定义接口,Refit 生成实现,该实现执行 HTTP 请求并反序列化响应。

\n
\n\n
\n

4. 主要方法/函数/类

\n \n

4.1. RestService.For<T>()

推荐