.NET6之MiniAPI(二十三):Refit

2023-11-05 19:08
文章标签 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也不是万能的,只是把常用的场景作了适配,所以择优而用,不必纠结大而完美的解决方案,毕竟它是一个库而已。

这篇关于.NET6之MiniAPI(二十三):Refit的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/351888

相关文章

Flink实战案例(二十三):自定义时间和窗口的操作符(四)window functions之增量聚合函数(一)ReduceFunction

实例一 例子: 计算每个传感器15s窗口中的温度最小值 val minTempPerWindow = sensorData.map(r => (r.id, r.temperature)).keyBy(_._1).timeWindow(Time.seconds(15)).reduce((r1, r2) => (r1._1, r1._2.min(r2._2))) 实例二 ReduceFun

原 荐 Mybatis3.4.x技术内幕(二十三):Mybatis面试问题集锦(大结局)

http://toutiao.com/a6331394026365780226/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=5367969992&utm_medium=toutiao_ios

基于.NET6的WPF基础总结(上)

目录 一.常用属性介绍 二、 程序退出方式 三、布局样式 3.1 Panel的附加属性ZIndex 3.2 Grid(网格)布局 3.3 UniformGrid(均分布局) 3.4 StackPanel(堆积面板) 3.5 WrapPanel(换行面板)  3.6  DockPanel(停靠面板) 3.7 Canvas(画布布局)  3.8 个性化Border 3.9  G

ARM32开发——(二十三)存储器介绍

1. 存储器分类 存储器按其存储介质特性主要分为“易失性存储器”和“非易失性存储器”两大类。 “易失/非易失”是指存储器断电后, 它存储的数据内容是否会丢失的特性。 在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘。 2. RAM Random access memory 随机存取存储器,缩写:RAM,也叫主存,是与CPU直接交换数据的内部存储器。它可以随

net6 core 接入nacos 实现服务注册入门使用,心跳检测和负载均衡

net6 core 接入nacos 实现服务注册入门使用,心跳检测和负载均衡 配置中心比较Apollo与Nacos_appollo 和 nacos-CSDN博客 一:安装nacos  Release 2.2.3 (May 25th, 2023) · alibaba/nacos · GitHub 二、配置Nacos 注*Nacos 是使用的mysql 数据库,需要先自行安装好数据库

剑指Offer之二十三-从上往下打印二叉树

二叉树结构 class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}} 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 解析 考察层序遍历每一次打印一个结点的时候,如果该结点有子节点,则把该结点的子

redis面试(二十三)写锁释放

先加了写锁,后面再次加写锁或者读锁 anyLock: { “mode”: “write”, “UUID_01:threadId_01:write”: 2, “UUID_01:threadId_01”: 1 } 写锁的释放lua脚本在这里 RedissonWriteLock.unlockInnerAsync() 比如说现在的参数是这 KEYS[1] = anyLock KEYS[2] = r

二十三、错误处理

目录 一、使用errors包 1、处理读取文件时 2、创建错误 3、创建错误格式 4、从函数中返回错误 二、慎用panic 1、错误使用方式 2、正确使用方式 错误处理,其实就是居安思危,预想到某块可能会出现问题,进而编辑好代码进行处理 一、使用errors包 1、处理读取文件时 在go语言中err非常独特,可以将err信息传递给函数和方法 func main()

Java二十三种设计模式-中介者模式(22/23)

本文深入探讨了中介者模式,这是一种行为型设计模式,通过定义一个中介者对象来简化对象间的通信,降低耦合度,并提高系统的模块化,同时提供了实现示例、使用场景、优缺点分析、与其他设计模式的比较,以及最佳实践和替代方案。 中介者模式:简化对象间通信的中心化设计 引言 中介者模式(Mediator Pattern)是一种行为型设计模式,用于定义一个中介者对象来简化对象间的通信。中介者使对象之间不再

Java二十三种设计模式-状态模式(20/23)

本文深入探讨了状态模式,一种允许对象根据其内部状态变化而改变行为的软件设计模式。文章从定义、组成部分、实现方式、使用场景、优缺点分析、与其他模式的比较,到最佳实践和建议,全面介绍了状态模式的各个方面。通过Java语言的实现示例和实际应用案例,我们展示了状态模式如何提高代码的封装性和可扩展性,同时指出了其可能带来的系统复杂性增加和状态转换管理的挑战。最终,文章旨在帮助读者全面理解状态模式,并在适合的