本篇是与上篇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也不是万能的,只是把常用的场景作了适配,所以择优而用,不必纠结大而完美的解决方案,毕竟它是一个库而已。
想要更快更方便的了解相关知识,可以关注微信公众号
标签:MiniAPI,oldUser,return,app,Refit,user,NET6,Logger,public From: https://www.cnblogs.com/axzxs2001/p/16936668.html