.NET6之MiniAPI(二十三):Refit

发布一下 0 0

本篇是与上篇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 被调用APIapp.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);//配置RefitClientbuilder.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);});#endregionapp.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也不是万能的,只是把常用的场景作了适配,所以择优而用,不必纠结大而完美的解决方案,毕竟它是一个库而已。

版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除

本文地址:http://0561fc.cn/76282.html