首页 > 其他分享 >.NET6之MiniAPI(二十三):Refit

.NET6之MiniAPI(二十三):Refit

时间:2022-11-29 21:02:48浏览次数:39  
标签:MiniAPI oldUser return app Refit user NET6 Logger public

  本篇是与上篇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

相关文章

  • .NET6之MiniAPI(二十三):Refit
    本篇是与上篇HttpClient有关联的,有前篇中,我们是直接使用HttpClient来发出请求的,所有的请求信息都是我们根据需要自己来填充的。那Refit是什么呢?它是一个让我们调用API就......
  • .NET6之MiniAPI(二十二):HttpClient
    说明:本篇不是说明HttpClient怎么使用,而以分享在asp.netcoreminiapi框架下,HttpClient的引入和使用方式。我们在业务开发中,免不了调用三方的服务,这时就会用到Htt......
  • .NET6之MiniAPI(二十二):HttpClient
    说明:本篇不是说明HttpClient怎么使用,而以分享在asp.netcoreminiapi框架下,HttpClient的引入和使用方式。我们在业务开发中,免不了调用三方的服务,这时就会用到Htt......
  • .NET6之MiniAPI(二十一):限流
    限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量......
  • .NET6之MiniAPI(二十一):限流
    限流,可以网络的基础设施进行配置实现,也可以在网关的地方进行限流,但服务本身的限流也不可或缺,因为当多副本时,一个副本故障,流量对于其他副本来说会提高,如果超过其承受请求量......
  • .NET6之MiniAPI(十九):NLog
    在本系例文章的第八篇中,我们聊过官方的日志实现,即《.NET6之MiniAPI(八):日志》。但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是......
  • .NET6之MiniAPI(二十):实体验证FluentValidation
    为了验证apipost上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net)。在asp.netmvc中,使用的是模型验证,通过在实体类上添加特性达到......
  • .NET6之MiniAPI(二十):实体验证FluentValidation
    为了验证apipost上来的数据的有效性,我们可以引入FluentValidation(详见https://fluentvalidation.net)。在asp.netmvc中,使用的是模型验证,通过在实体类上添加特性达到......
  • .NET6之MiniAPI(十九):NLog
    在本系例文章的第八篇中,我们聊过官方的日志实现,即《.NET6之MiniAPI(八):日志》。但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是有......
  • Net6 CodeFirst注入MySQL数据库上下文
    十年河东,十年河西,莫欺少年穷学无止境,精益求精 2022太难了,好多公司倒闭,互联网不景气,工作难找,苏州的C#/Net程序员的招聘更是少之又少,java,C,等其他语言也是供大于求,总之,难上......