如何在 ASP.NET Core 中使用Refit

科技   2024-12-06 05:57   山东  


Refit是一个库,它通过在C#中生成类型安全、强类型的HTTP客户端接口,简化了对REST API的调用。它允许开发人员在无需编写显式的HTTP请求处理代码的情况下创建API客户端代码,从而减少了样板代码并提高了可维护性。

在这篇博客文章中,我们将逐步介绍在ASP.NET Core应用程序中使用Refit的过程,包括如何进行设置、创建服务接口以及无缝地进行API调用。

什么是Refit?

Refit是一个适用于.NET的REST库,它能帮助你使用C#接口来调用REST API。它会自动生成用于发起HTTP请求、反序列化响应以及在幕后处理复杂操作的代码。这样一来,你无需手动编写HTTP客户端代码——只需定义一个接口,其余的事情Refit都会处理好。

使用Refit的好处:

  • 减少样板代码:自动处理HTTP请求的创建、序列化以及反序列化。

  • 类型安全:强类型的请求和响应可防止错误并提高代码的清晰度。

  • 易于集成:与ASP.NET Core依赖注入(Dependency Injection,简称DI)无缝集成。

  • 支持现代.NET特性:能与异步/等待(async/await)、HttpClientFactory以及ASP.NET Core中的其他常见模式良好配合。

步骤1:安装Refit

首先,你需要安装Refit的NuGet包。在你的ASP.NET Core项目中,打开“包管理器控制台”(Package Manager Console)或者编辑你的.csproj文件,并添加以下内容:

在“包管理器控制台”中使用: Install-Package Refit 使用.NET CLI时: dotnet add package Refit

步骤2:创建一个Refit接口

Refit使用C#接口来定义API调用的结构。接口方法直接映射到诸如GET、POST、PUT和DELETE之类的HTTP方法。

假设我们正在构建一个简单的客户端,用于与一个公共API进行交互。在这个示例中,我们将使用JSONPlaceholder API,这是一个用于测试和原型开发的免费模拟API。我们将定义一个接口来获取文章。

定义一个API接口

在你的项目中创建一个名为“Services”的新文件夹,然后添加一个接口“IPostService.cs”:

using Refit;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace YourApp.Services
{
public interface IPostService
{
[Get("/posts")]
Task<List<Post>> GetPostsAsync();

[Get("/posts/{id}")]
Task<Post> GetPostByIdAsync(int id);

[Post("/posts")]
Task<Post> CreatePostAsync([Body] Post newPost);
}

public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
}

以下是该接口中各部分的作用:

  • [Get("/posts")]——这个特性表示向/posts端点发起一个GET请求。

  • [Get("/posts/{id}")]——一个带参数的GET请求,用于根据id获取单篇文章。

  • [Post("/posts")]——一个POST请求,用于使用请求体中的Post对象创建一篇新文章。

在这个示例中,我们使用Post类来表示我们正在交互的数据。Refit在发起请求时会自动对该对象进行序列化和反序列化。

步骤3:将Refit注册到依赖注入中

ASP.NET Core使用依赖注入(DI)来管理服务生命周期并解析依赖项。要在你的控制器或其他服务中使用Refit的API客户端,你需要将它注册到依赖注入容器中。

打开Startup.csProgram.cs文件(取决于你使用的是.NET 5还是更高版本),并在ConfigureServices方法中添加以下代码。

using Refit;
using YourApp.Services;

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 注册Refit客户端
services.AddRefitClient<IPostService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("https://jsonplaceholder.typicode.com"));

// 注册其他服务
services.AddControllersWithViews();
}
}

在这段代码中:

  • AddRefitClient<IPostService>():将IPostService接口注册用于依赖注入。

  • ConfigureHttpClient():使用API的基础URL(https://jsonplaceholder.typicode.com)来配置HttpClient

AddRefitClient扩展方法简化了为Refit注册和创建HTTP客户端的过程。

步骤4:在控制器或服务中使用Refit

一旦Refit客户端注册完成,你就可以将IPostService接口注入到你的控制器或服务中,并进行API调用。

示例控制器

创建一个新的控制器PostsController.cs来使用Refit API客户端:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using YourApp.Services;

namespace YourApp.Controllers
{
public class PostsController : Controller
{
private readonly IPostService _postService;

public PostsController(IPostService postService)
{
_postService = postService;
}

public async Task<IActionResult> Index()
{
List<Post> posts = await _postService.GetPostsAsync();
return View(posts);
}

public async Task<IActionResult> Details(int id)
{
Post post = await _postService.GetPostByIdAsync(id);
return View(post);
}

[HttpPost]
public async Task<IActionResult> Create(Post newPost)
{
if (ModelState.IsValid)
{
Post createdPost = await _postService.CreatePostAsync(newPost);
return RedirectToAction(nameof(Index));
}
return View(newPost);
}
}
}

解释:

  • Index():通过调用IPostService中的GetPostsAsync()方法来获取所有文章。

  • Details():使用GetPostByIdAsync()方法根据ID获取单篇文章。

  • Create():使用CreatePostAsync()方法向API发送一篇新文章。

视图

为简单起见,假设你有像Index.cshtmlDetails.cshtml这样的基本Razor视图来显示文章。你可以根据项目需求自定义这些视图。

步骤5:测试应用程序

一旦你设置好了控制器和视图,运行应用程序,导航到/Posts路由,并测试以下内容:

  • Index视图中获取所有文章。

  • 通过点击文章标题查看单篇文章(这会将你带到Details视图)。

  • 使用一个简单的表单创建一篇新文章(例如,向/Posts/Create发起POST请求)。

示例输出:

当你导航到/Posts时,你应该会看到从JSONPlaceholder API获取的文章列表。如果你访问某篇文章的详情页面,你应该能看到那篇文章的详细信息。

Refit是一个很棒的库,用于简化ASP.NET Core中的HTTP API调用。通过为你的API交互定义一个清晰、强类型的接口,你可以专注于业务逻辑,同时避免手动创建HTTP请求代码这种重复且容易出错的任务。

关键要点:

  • Refit通过自动处理HTTP请求、序列化和反序列化,有助于减少样板代码。

  • 你使用诸如[Get][Post]等特性来定义API接口,Refit会利用这些特性生成必要的HTTP客户端代码。

  • 它与ASP.NET Core的依赖注入系统无缝集成,便于进行轻松且高效的服务管理。

  • Refit使得API集成更加简单且更具可维护性,特别是在ASP.NET Core应用程序中处理RESTful API时。


  • 如果你喜欢我的文章,请给我一个赞!谢谢

架构师老卢
资深软件架构师, 分享编程、软件设计经验, 教授前沿技术, 分享技术资源(每天发布电子书),每天进步一点点...
 最新文章