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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置utf8编码问题

注意&#xff1a;乱码和request的具体实现类有关&#xff0c;现在已经查到的是RequestDispatcher.forward调用前使用的是org.apache.catalina.connector.RequestFacade类而RequestDispatcher.forward调用后使用的是org.apache.catalina.core.ApplicationHttpRequest&#xff0c…

王道408数据结构——第八章 排序

文章目录一、排序定义二、插入排序——直接插入排序1. 描述2. 代码和示例3. 空间效率4. 时间效率5. 稳定性6. 适用性三、插入排序——折半插入排序1. 描述2. 时间效率3. 稳定性四、插入排序——希尔排序&#xff08;缩小增量排序&#xff09;1. 描述2. 代码和示例3. 空间效率4.…

C和指针之函数之递归实现厄密多项式

1、厄密多项式介绍 /*Hermite Polynomials(厄密多项式)是这样定义的1 ,n < 0Hn(x) 2x ,n 12xHn-1(x) - 2(n-1)Hn-2(x) ,n > 2*/ 2、代码实现 #include <stdio.h>/*Hermite Polynomials(厄密多项式)是这样定义的…

设置状态栏和导航栏

// 初始化导航栏外观效果 - (void)initialNavigationBarStyle { // 1. 获取导航栏的外观代理对象 UINavigationBar *navBar [UINavigationBar appearance]; // 2. 设置背景图片 [navBar setBackgroundImage:[UIImage imageNamed:"NavBar64"] forBarMetrics:UIBarMet…

PHP 长文章分页函数

<?php function ff_page($content,$page) { global $expert_id; $PageLength 2000; //每页字数 $CLength strlen($content); $PageCount floor(($CLength / $PageLength)) 1; //计算页数 $PageArrayarray(); $Seperator array("n","r","。&q…

Avalonia跨平台入门第二十一篇之玩耍CEF

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题;今…

golang实现自定义驱动的Cache

近期在写 ActivedRouter项目的时候需求一个缓存模型&#xff0c;要求缓存模型支持不同驱动,例如:memory、file、redis、mysql&#xff0c;实现思路代码如下: cache.go文件,定义缓存对外接口 //ActivedRouter //Author:usher.yue //Amail:usher.yuegmail.com //TencentQQ:422366…

C和指针之函数之求最大公约数

1、求最大公约数 求公约数的规则如下/*** M % N 0 : N*gcd(M, N) * M % N R, R > 0 : gcd(N, R)*/ 2、代码实现 #include <stdio.h> /*** M % N 0 : N*gcd(M, N) * M % N R, R > 0 : gcd(N, R)*/int gcd(int …

关于c#调用c编译器

这个已经过了好久了具体的实现代码没得&#xff0c;但是大致思路自己整理了一下&#xff1a; 首先要调用c编译器&#xff0c;process.start&#xff08;&#xff09;&#xff1b; 之后需要自己来进行编译器对代码执行的命令。 转载于:https://www.cnblogs.com/why1115/p/481032…

【自定义控件】c#winform自定义控件实现标签控件

介绍首先我们设计这个控件的时候要明白控件是怎样交互的&#xff0c; 熟悉b站的小伙伴应该知道 &#xff0c;我们上传视频的时候会去选择标签 &#xff0c;我们输入标签文本 按下回车就代表该标签已经添加成功了&#xff0c;效果图如下&#xff01;控件拆分我们首先拆分一下该控…

ASP.NET 使用Ajax(转)

之前在Ajax初步理解中介绍了对Ajax的初步理解&#xff0c;本文将介绍在ASP.NET中如何方便使用Ajax&#xff0c;第一种当然是使用jQuery的ajax&#xff0c;功能强大而且操作简单方便&#xff0c;第二种是使用.NET封装好的ScriptManager。 $.ajax向普通页面发送get请求 这是最简单…

printk函数出现延迟输出的问题

错误描述 关于测试内核read接口 有如下代码片段&#xff1a; static ssize_t hello_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos){int ret 0;printk("[read task]count%ld", count);memcpy(readbuf, kerneldata, sizeof(kerneldata));…

个人博客(05)

昨天&#xff1a;设计并制作了添加图书信息的界面 今天&#xff1a;准备学习制作修改店铺的界面问题&#xff1a;页面消息的提醒转载于:https://www.cnblogs.com/yibao/p/6849805.html

C和指针之函数之把数字字符串转为整数并且返回这个数字(ascii_to_integer)

1、问题 *字符串必须包含一个或多个数字,函数应该把这些数字字符转换为整数并且 *返回这个值,如果脂肪层参数包含了任何非数字字符,函数就要返回0,不考 *虑溢出情况 2、代码实现 #include <stdio.h>/***字符串必须包含一个或多个数字,函数应该把这些数字字符转…

如何有效的在 LINQ 查询中处理异常?

咨询区 Jader Dias参考下面的代码&#xff1a;myEnumerable.Select(a > ThisMethodMayThrowExceptions(a));如何保证在 Linq 的查询过程中即使抛出了异常&#xff0c;查询不会被提前中断&#xff0c;就好像在每层迭代上都有默认的 try catch 块。回答区 LeBaptiste我写了一个…

rman备份,crontab计划任务没有生成备份文件

利用crontab 执行计划和RMAN结合来实现 数据库的自动备份现象&#xff1a;利用计划任务来执行备份&#xff0c;只是生成了目录&#xff0c;却没有生成备份文件1&#xff1a; 手动执行备份脚本&#xff0c;没有问题2&#xff1a;crontab 计划任务&#xff0c;能够生成目录&#…

C和指针之函数之求参数列表中的最大值

1、问题 *编写一个叫max_list函数&#xff0c;它用于检查任意数目的整形参数*并返回他们中的最大值&#xff0c;参数列表必须以一个负数结尾&#xff0c;提*示列表的结束2、代码实现 #include <stdio.h> #include <stdarg.h> /***编写一个叫max_list函数&#xff0…

fir.im 持续集成技术实践

互联网时代&#xff0c;人人都在追求产品的快速响应、快速迭代和快速验证。不论是创业团队还是大中型企业&#xff0c;都在探索属于自己的敏捷开发、持续交付之道。fir.im 团队也在全面实施敏捷&#xff0c;并推出新持续集成服务— flow.ci &#xff0c;以帮助企业将开发测试流…

Redis调用及使用

首先第一步&#xff1a; 添加引用1.ServiceStack.DLLServiceStack.Interfaces.DLLServiceStack.ServiceInterface.DLL以上引用都可以在网上下载到2.调用&#xff1a;demo&#xff1a; stringticket "" ;stringhost "localhost" ;stringelementKey "…

MYSQL-skip-networking

1、跳过tcp/ip协议通信&#xff1a;[mysqld]# The TCP/IP Port the MySQL Server will listen onport3306#log_outputTABLEskip-networking #添加这一行然后重启服务2、测试连接&#xff1a;C:\Documents and Settings\Administrator>mysql -u root -pEnter password:ERROR…