1. 程式人生 > 其它 >.NET6之MiniAPI(二十三):Refit

.NET6之MiniAPI(二十三):Refit

  本篇是與上篇HttpClient有關聯的,有前篇中,我們是直接使用HttpClient來發出請求的,所有的請求資訊都是我們根據需要自己來填充的。那Refit是什麼呢?它是一個讓我們呼叫API就像呼叫一個物件的方法一樣簡單,是通過把http請求資訊,配置到一個介面,由refit把這些資訊轉成一個標準的http請求,然後再把請求回的結果轉成標準的實體返回給我們,所以我們更像在使用一個物件的方法。

  下面是一個get,post,put,delete的極簡事例。

  這裡定義了一個記憶體集合來充當資料庫,User是實體類。

#region 儲存和實體類
/// <summary>
/// 假裝資料庫
/// </summary> public static class DB { /// <summary> /// 假裝資料表 /// </summary> public static List<User> users = new List<User>() { new User{ID=1,UserName="gsw",Name="張三",Password="ABCDE",CreateTime=DateTime.Now} }; } /// <summary> /// 實體類 /// </summary> public
class User { public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } public string Name { get; set; } public DateTime CreateTime { get; set; } public DateTime ModifyTime { get; set; } } #endregion

  被呼叫的API如下,對記憶體集合進行增刪改查。

#region
被呼叫API app.MapGet("/users/{username}", (ILogger<Program> Logger, string userName) => { Logger.LogInformation("被呼叫 get user"); return DB.users.SingleOrDefault(s => s.UserName == userName); }); app.MapPost("/user", (ILogger<Program> Logger, User user) => { Logger.LogInformation("被呼叫 add user"); user.ID = DB.users.Count + 1; DB.users.Add(user); return user; }); app.MapPut("/user", (ILogger<Program> Logger, User user) => { Logger.LogInformation("被呼叫 modify user"); var oldUser = DB.users.SingleOrDefault(s => s.ID == user.ID); if (oldUser != null) { oldUser.UserName = user.UserName; oldUser.Password = user.Password; oldUser.Name = user.Name; oldUser.ModifyTime = DateTime.Now; } return oldUser; }); app.MapDelete("/user/{id}", (ILogger<Program> Logger, int id) => { Logger.LogInformation("被呼叫 remove user"); var oldUser = DB.users.SingleOrDefault(s => s.ID == id); if (oldUser != null) { return DB.users.Remove(oldUser); } else { return false; } }); #endregion

  這是Refit的使用方式,首先引入Refit.HttpClientFactory NuGet包,注入RefitClient服務到服務容器中,這裡要把IUserAPI帶上,並配置BaseAddress。IUserAPI定義的是API介面型別,各個方法上的特性決定了請求下游API的資訊。再用就是三個呼叫方法,這裡只是演示簡單的呼叫,所以引數都是固定的。

using Refit;

var builder = WebApplication.CreateBuilder(args);
//配置RefitClient
builder.Services
    .AddRefitClient<IUserAPI>()
    .ConfigureHttpClient(httpclient => httpclient.BaseAddress = new Uri("http://localhost:5026"));

var app = builder.Build();

#region 呼叫者
app.MapGet("/user", async (ILogger<Program> Logger, IUserAPI userAPI) =>
 {
     Logger.LogInformation("呼叫者 get user");
     var user = await userAPI.GetUser("gsw");
     user.Name += "";
     return user;
 });
app.MapPost("/user", async (ILogger<Program> Logger, IUserAPI userAPI) =>
{
    Logger.LogInformation("呼叫者 add user");
    var user = new User { UserName = "ls", Name = "李四", Password = "EDCBA", CreateTime = DateTime.Now };
    var newUser = await userAPI.AddUser(user);
    return newUser;
});
app.MapPut("/user", async (ILogger<Program> Logger, IUserAPI userAPI) =>
{
    Logger.LogInformation("呼叫者 modify user");
    var user = new User { ID = 2, UserName = "ls", Name = "李四收", Password = "AAAAA" };
    return await userAPI.ModifyUser(user);
});
app.MapDelete("/user", async (ILogger<Program> Logger, IUserAPI userAPI) =>
{
    Logger.LogInformation("呼叫者 remove user");
    return await userAPI.RemoveUser(2);
});
#endregion
app.Run();

/// <summary>
/// 定義Refit介面
/// </summary>
public interface IUserAPI
{
    [Get("/users/{username}")]
    Task<User> GetUser(string userName);
    [Post("/user")]
    Task<User> AddUser(User user);
    [Put("/user")]
    Task<User> ModifyUser(User user);
    [Delete("/user/{id}")]
    Task<bool> RemoveUser(int id);
}

  其實HttpClient呼叫API是個大知識點,很多API不可能這麼簡單,Refit也提供了一些複雜的配置介面方式,詳見https://github.com/reactiveui/refit,;因為場景很多,大家可以按文件找適合自己的配置,但Refit也不是萬能的,只是把常用的場景作了適配,所以擇優而用,不必糾結大而完美的解決方案,畢竟它是一個庫而已。

  想要更快更方便的瞭解相關知識,可以關注微信公眾號