.NET6之MiniAPI(二十三):Refit
阿新 • • 發佈:2022-11-29
本篇是與上篇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也不是萬能的,只是把常用的場景作了適配,所以擇優而用,不必糾結大而完美的解決方案,畢竟它是一個庫而已。
想要更快更方便的瞭解相關知識,可以關注微信公眾號