生活随笔
收集整理的這篇文章主要介紹了
                                
.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也不是萬能的,只是把常用的場景作了適配,所以擇優而用,不必糾結大而完美的解決方案,畢竟它是一個庫而已。
                            總結
                            
                                以上是生活随笔為你收集整理的.NET6之MiniAPI(二十三):Refit的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。