Refit简单使用

Refit简单使用Refit是一个类型安全的REST开源库,是一套基于RESTful架构的.NET客户端实现,内部使用HttpClient类封装,可通过Refit更加简单安全地访问WebAPI接口,要使用Refit框架,只需要在项目中通过NuGet包安装器安装即可。三、使用创建两个weiapi==01_Publisher和02_Subscriber==2.ThriftAController3.Person02_Subscriber1.ThriftBController

一、简介

Refit 是一个类型安全的 REST 开源库,是一套基于 RESTful 架构的 .NET 客户端实现,内部使用 HttpClient 类封装,可通过 Refit 更加简单安全地访问 Web API 接口,要使用 Refit 框架,只需要在项目中通过 NuGet 包安装器安装即可。

二、安装nuget

Install-Package refit
只听到从架构师办公室传来架构君的声音:
一日不思量,也攒眉千度。有谁来对上联或下联?

三、使用

在这里插入图片描述

创建两个weiapi ==01_Publisher 和02_Subscriber ==

01_Publisher 代码

1.InterfaceA(接口)

此代码由Java架构师必看网-架构君整理
public interface InterfaceA { //以上方法定义一个 REST API 接口,该接口定义了 GetPerson 函数,该函数通过 HTTP GET 请求去访问服务器的 //api/ThriftB/{name}路径并把返回的结果封装为 Person 对象返回,其中 URL 路径中 name的值为 GetPerson 函数的 name 参数取值 //然后,通过 RestService 类生成 InterfaceA 的代理实现,通过代理直接调用 Web API 接口。 [Post("/api/ThriftB/{id}")] Task<Person> GetPerson(string id); }

2.ThriftAController

   [Route("api/[controller]/[action]")]
    [ApiController]
    public class ThriftAController : ControllerBase
    { 
   
    public async Task<IActionResult> Index()
        { 
   
        //通过接口访问,同时将地址端口与路由拼接
            var gitPerson = RestService.For<InterfaceA>("http://localhost:50615");
            //调用GetPerson方法
            //所以插入name值,拼接出来的地址是http://localhost:50615/api/ThriftB/name
            var octcat = await gitPerson.GetPerson("name");
            return Ok(octcat);
        }
    }

3.Person

此代码由Java架构师必看网-架构君整理
public class Person { public int Id { get; set; } public string Name { get; set; } }

02_Subscriber

1.ThriftBController

[Route("api/[controller]")]
    [ApiController]
    public class ThriftBController : Controller
    { 
   
 		[HttpPost]
        [Route("name")]
        public IActionResult name()
        { 
   
            Person person = new Person();
            person.Name = "B";
            person.Id = 1;
            return Ok(person);
        }
    }

2.Person

同上

四、测试

1.运行两个webapi

2.打开PostMan

在这里插入图片描述

五、批量注入

微软官网

//configure自己定义,读取存放配置的配置文件
   public static IServiceCollection AddHttpServices(this IServiceCollection services, IConfiguration configuration)
        { 
   
            JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions()
            { 
   
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true,
                DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            };
            var refitSettings = new RefitSettings()
            { 
   
                ContentSerializer = new SystemTextJsonContentSerializer(jsonSerializerOptions)
            };
           
            var messageSettings = configuration.GetSection(MessageSettings.SectionName).Get<MessageSettings>();

            services.AddRefitClient<IMessageApi>(refitSettings)
                 .ConfigureHttpClient(c =>
                 { 
   
                     c.BaseAddress = new Uri(messageSettings.ApiHost);
                     c.Timeout = TimeSpan.FromSeconds(5);
                 });
            return services;
        }

    public class MessageSettings
    { 
   
        public const string SectionName = "Message";
        public string ApiHost { 
    get; set; }
    }
  "Message": { 
   
    "ApiHost": "http://xxxx:xxxx"
  },
//定义接口 
  public interface IMessageApi
    { 
   
        [Post("/api/Sms/signin")]
        Task<AjaxResponse<PhoneValidResponse>> GetPhoneValidCodeAsync([Body(BodySerializationMethod.Serialized)] PhoneValidRequest request);
    }
//添加服务
    .builder.Services.AddHttpServices(configuration);

//注入
 private ICapPublisher _capBus;
        private readonly IMessageApi _messageApi;
        public ValuesController(IMessageApi messageApi)
        { 
   
          
            _messageApi = messageApi;

        }
使用
  public async Task<IActionResult> MessageLoginAsync([FromBody] PhoneValidRequest model)
        { 
   

            var result = await _messageApi.GetPhoneValidCodeAsync(model);
            
            return new JsonResult(result.Data);
        }

五、总结

Refit可以通过类似访问路由的方式,进行跨服务访问数据

本文来源有诗亦有远方,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/209551
0
   

发表评论