本篇是与上篇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相关推荐

  1. .NET6之MiniAPI(二十七):Metrics

    应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库. prometheus-net的工作原理是,在应用内部埋点, ...

  2. .NET6之MiniAPI(二十九):UnitTest

    MiniAPI的单元测试与asp.net web api的单元测试大体是相同的(毕竟都是asp.net core),只是在小细节上有一些差异,文章中会说到这点. 本文测试框架是XUnit,Mock框架 ...

  3. .NET6之MiniAPI(二十五):Dapper

    注:如果你使用Dapper一段时间了,这篇你可以跳过去了. 在第十二篇中,我们聊过官方的ORM--EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目非常便捷.今 ...

  4. .NET6之MiniAPI(二十四):用Polly重试

    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断.重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止:熔断是为了防止太多的次数的无效访问,导致系统不可知异常. Poll ...

  5. .NET6之MiniAPI(二十二):HttpClient

    说明:本篇不是说明HttpClient怎么使用,而以分享在asp.net core mini api框架下,HttpClient的引入和使用方式. 我们在业务开发中,免不了调用三方的服务,这时就会用到 ...

  6. .NET6之MiniAPI(二十一):限流

    限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量的范围,会引起服务连续崩塌, ...

  7. .NET6之MiniAPI(二十):实体验证FluentValidation

    为了验证api post上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net).在asp.net mvc中,使用的是模型验证, ...

  8. .NET6之MiniAPI(三十):结束篇(附链接)

    不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...

  9. 云计算设计模式(二十三)——Throttling节流模式

    云计算设计模式(二十三)--Throttling节流模式 控制由应用程序使用,一个单独的租户或整个服务的一个实例的资源的消耗.这样的模式能够同意系统继续执行并满足服务水平协议.即使当添加需求的资源放置 ...

最新文章

  1. 欧洲估值最高的5家人工智能创业公司
  2. Redis 限流的 3 种方式
  3. linux卸载dev中的设备,Linux /dev 常见特殊设备介绍与应用
  4. 数值分箱与one-hot
  5. Intellij IDEA连接Spark集群
  6. vue 花括号里面的变量_二、Vue条件指令
  7. 干货:Java并发编程系列之volatile(二)
  8. C#中的常量、类型推断和作用域
  9. 深入浅出统计学 笔记 总结 学习心得
  10. js将阿拉伯数字转换成大写金额
  11. 删除目录以及子目录以下所有目录和文件
  12. 17229 Lry,你除了2还是2[C]
  13. 冰点还原_8.60.020.5592_Standard版本手动卸载
  14. python: 百度地图api爬虫
  15. TDSQL“相似查询工具MSQL+”入选VLDB论文 1
  16. 小米3的卡槽,卡住了
  17. 分享123个ASP整站程序源码,总有一款适合您
  18. 目标网站怎么样才能收集尽可能详细信息
  19. 对linux系统4T硬盘分区
  20. 居转户问题1-被退回之后附件如何删除?

热门文章

  1. nginx安装及负载均衡配置
  2. android--Activity有返回值的跳转
  3. Android USB Host与HID通讯(二)
  4. RHEL5.3下MRTG+SNMP的搭建
  5. C#判断某软件是否安装
  6. did双重差分法_Stata中双重差分操流程及代码
  7. oo面向对象第一单元总结
  8. Python基础七(函数)
  9. UI自动化web端框架path.py代码
  10. 聊一聊promise的前世今生