如何在 ASP.NET Core 中使用Refit

作者:微信公众号:【架构师老卢】
11-15 9:33
118

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时。
相关留言评论
昵称:
邮箱:
阅读排行