首页 > 编程语言 >Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库

Asp .Net Core 系列:集成 Refit 和 RestEase 声明式 HTTP 客户端库

时间:2024-04-11 20:57:33浏览次数:28  
标签:Core Asp HTTP WeatherForecast weatherForecastApi Refit API RestEase public

背景

.NET 中 有没有类似 Java 中 Feign 这样的框架?经过查找和实验,发现 在 .NET 平台上,虽然没有直接的 Feign 框架的端口,但是有一些类似的框架和库,它们提供了类似的功能和设计理念。下面是一些在 .NET 中用于声明式 HTTP 客户端的框架和库:

  1. Refit:
    Refit 是一个用于构建声明式、类型安全的 HTTP 客户端的库。它允许您通过定义接口来描述 HTTP API,并生成客户端代码。Refit 使用属性路由的方式定义 API 调用,类似于 Feign。它支持各种 HTTP 方法,如 GET、POST、PUT、DELETE 等,并支持异步操作。
    https://github.com/reactiveui/refit
  2. RestEase:
    RestEase 也是一个用于创建类型安全的 HTTP 客户端的库。它提供了类似于 Refit 的声明式 API 定义方式,允许您通过编写接口来描述 HTTP API。RestEase 支持各种 HTTP 方法,并提供了简单易用的 fluent API。
    https://github.com/canton7/RestEase
  3. Feign.net
    feign.net 是一个基于 .NET Standard 2.0 的库,它实现了与 Feign 类似的接口定义和调用方式。feign.net 支持异步操作,并提供了与 Refit 和 RestEase 类似的特性。
    https://github.com/daixinkai/feign.net

集成 Refit

要在 ASP.NET Core 中集成 Refit,首先需要安装 Refit 包。可以通过 NuGet 包管理器或者 .NET CLI 来完成:

dotnet add package Refit

接下来,您可以创建一个接口,用于定义对远程 API 的调用。例如:

using Microsoft.AspNetCore.Mvc;
using Refit;
using RefitDemo.Models;

namespace RefitDemo.WebApi
{

    public interface IWeatherForecastApi
    {
        [Get("/WeatherForecast/Get")]
        Task<string> GetWeatherForecast(string id);

        [Post("/WeatherForecast/Post")]
        Task<WeatherForecast> PostWeatherForecast(WeatherForecast weatherForecast);
    }
}

然后,您可以在 ASP.NET Core 应用程序中使用 Refit 客户端。一种常见的方法是将其注入到服务中,以便在需要时进行使用。例如,在 Startup.cs 中配置:

            builder.Services.AddRefitClient<IWeatherForecastApi>(new RefitSettings
            {
                ContentSerializer = new NewtonsoftJsonContentSerializer(
                     new JsonSerializerSettings
                     {
                         ContractResolver = new CamelCasePropertyNamesContractResolver()
                     }
              )
            }).ConfigureHttpClient(c => c.BaseAddress = new Uri("http://localhost:5237"));


    //封装
    builder.Services.AddRefitClients("RefitDemo.WebApi", "http://localhost:5237");

    public static class RefitExtensions
    {
        public static void AddRefitClients(this IServiceCollection services, string targetNamespace, string baseAddress, RefitSettings? refitSettings = null)
        {
            // 获取指定命名空间中的所有类型
            var types = Assembly.GetExecutingAssembly().GetTypes()
               .Where(t => t.Namespace == targetNamespace && t.IsInterface).ToList();

            foreach (var type in types)
            {
                services.AddRefitClient(type, refitSettings).ConfigureHttpClient(c => c.BaseAddress = new Uri(baseAddress));
            }
        }
    }

最后,您可以在需要使用 API 客户端的地方注入 IWeatherForecastApi 接口,并使用它来调用远程 API:

using Microsoft.AspNetCore.Mvc;
using RefitDemo.WebApi;

namespace RefitDemo.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly ILogger<WeatherForecastController> _logger;

        private readonly IWeatherForecastApi _weatherForecastApi;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IWeatherForecastApi weatherForecastApi)
        {
            _logger = logger;
            _weatherForecastApi = weatherForecastApi;
        }
        [HttpGet("GetWeatherForecast")]
        public async Task<string> GetWeatherForecast()
        {
            return await _weatherForecastApi.GetWeatherForecast("1111");
        }

        [HttpGet("PostWeatherForecast")]
        public async Task<WeatherForecast> PostWeatherForecast()
        {
            return await _weatherForecastApi.PostWeatherForecast(new WeatherForecast { Date = DateOnly.MaxValue,Summary = "1111" });
        }

        [HttpGet("Get")]
        public string Get(string id)
        {
            return id;
        }

        [HttpPost("Post")]
        public WeatherForecast Post(WeatherForecast weatherForecast)
        {
            return weatherForecast;
        }
    }
}

image

其它功能:https://github.com/reactiveui/refit?tab=readme-ov-file#table-of-contents

集成 RestEase

要在 ASP.NET Core 中集成 RestEase,首先需要安装 RestEase 包。可以通过 NuGet 包管理器或者 .NET CLI 来完成:

dotnet add package RestEase

接下来,您可以创建一个接口,用于定义对远程 API 的调用。例如:

using Microsoft.AspNetCore.Mvc;
using RestEase;
using RestEaseDemo.Models;


namespace RestEaseDemo.WebApi
{

    public interface IWeatherForecastApi
    {
        [Get("/WeatherForecast/Get")]
        Task<string> GetWeatherForecast(string id);

        [Post("/WeatherForecast/Post")]
        Task<WeatherForecast> PostWeatherForecast(WeatherForecast weatherForecast);
    }
}

然后,您可以在 ASP.NET Core 应用程序中使用 RestEase 客户端。一种常见的方法是将其注入到服务中,以便在需要时进行使用。例如,在 Startup.cs 中配置:

builder.Services.AddRestEaseClient<IWeatherForecastApi>("http://localhost:5252");

然后,您可以在 ASP.NET Core 应用程序中使用 RestEase 客户端。与 Refit 不同的是,RestEase 不需要额外的配置,您只需要直接使用接口即可。在需要使用 API 客户端的地方注入 IMyApi 接口,并使用它来调用远程 API:

using Microsoft.AspNetCore.Mvc;
using RestEaseDemo.WebApi;

namespace RestEaseDemo.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly ILogger<WeatherForecastController> _logger;

        private readonly IWeatherForecastApi _weatherForecastApi;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, IWeatherForecastApi weatherForecastApi)
        {
            _logger = logger;
            _weatherForecastApi = weatherForecastApi;
        }
        [HttpGet("GetWeatherForecast")]
        public async Task<string> GetWeatherForecast()
        {
            return await _weatherForecastApi.GetWeatherForecast("1111");
        }

        [HttpGet("PostWeatherForecast")]
        public async Task<WeatherForecast> PostWeatherForecast()
        {
            return await _weatherForecastApi.PostWeatherForecast(new WeatherForecast { Date = DateOnly.MaxValue,Summary = "1111" });
        }

        [HttpGet("Get")]
        public string Get(string id)
        {
            return id;
        }

        [HttpPost("Post")]
        public WeatherForecast Post(WeatherForecast weatherForecast)
        {
            return weatherForecast;
        }
    }
}

其它功能:https://github.com/canton7/RestEase?tab=readme-ov-file#table-of-contents

标签:Core,Asp,HTTP,WeatherForecast,weatherForecastApi,Refit,API,RestEase,public
From: https://www.cnblogs.com/vic-tory/p/18130002

相关文章

  • docker nginx监听80端口 同一 IP 多域名配置方法--多子配置文件包含 https
    下载nginx镜像文件dockerpullnginx:1.24.0宿主机上创建nginx_80目录htmlcertconflogs创建配置文件nginx.conf一、Nginx配置文件nginx.conf操作:在http模块增加(子配置文件的路径和名称):include/etc/nginx/conf.d/*.conf;usernginx;worker_processes1;err......
  • 【教程】MuMu模拟器HTTPS抓包实践
    ✨所需工具MuMu模拟器:https://mumu.163.com/Charles:https://www.charlesproxy.com/OpenSSL:https://slproweb.com/products/Win32OpenSSL.html✨签发证书下载安装Charles(需要学习版请点击)Help>SSLProxying>SaveCharlesRootCertificate导出证书,命名为charles.pe......
  • 限制异步HTTP请求并发:简单、有效的20个并发下载控制策略
     概述:通过使用`SemaphoreSlim`,可以简单而有效地限制异步HTTP请求的并发量,确保在任何给定时间内不超过20个网页同时下载。`ParallelOptions`不适用于异步操作,但可考虑使用`Parallel.ForEach`,尽管在异步场景中谨慎使用。对于并发异步I/O操作的数量限制,可以使用SemaphoreSlim,......
  • 第五节:框架版本打升级(CoreMvc8.x + EFCore8.x)
    一.基础升级1. 版本升级  将各个类库、项目都升级为.Net8.0  2.AutoFac升级  【AutoFac6.4.0】升级到 【8.0.0】  【Autofac.Extensions.Depend8.0.0】升级到 【9.0.0】 3.基本库升级  【System.Text.Json7.0.2】升级到【8.0.3】  ......
  • stm32采集烟雾和温湿度+ESP8266转发解析+python构造http
      https://www.cnblogs.com/gooutlook/p/16061136.html  http://192.168.1.103/Control_SensorPin?sensor=sensor_all&action=GetDatapython#-*-coding:utf-8-*-importrequestsimporturllib.parse#pipinstallrequestsdefSendHttp():#ht......
  • SpingBoot项目Tomcat假死,导致http(openfeign)请求无法响应问题定位
    项目简介:<spring-boot.version>2.3.2.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version>使用docker进行项目部署问题描述:项目中代码中大量使用异步多线程操作,没个异步过程中大量掺杂数据库查询、Redis查询、Feign调用、RabbitMq发送接收......
  • 网站使用nginx部署ssl证书开启https(开启http2)
    目录网站部署ssl证书就是将网站的http协议转换为更加安全的https协议1、腾讯云申请ssl证书2、下载证书3、xftp将下载的证书上传到服务器指定的目录下4、nginx配置对应域名的443端口,开启ssl5、nginx监听对应域名的80端口返回301强制重定向到该域名下的ssl443端口测试HTTP......
  • 将http转为https访问需要费用吗
    首先,需要了解http和https的概念的区别。http本身是一种超文本传输协议,目前是互联网在进行数据访问过程中最广泛运用的一种网络协议,http工作于客户端与服务器端之间。浏览器作为http客户端通过URL向http服务器端发送所有请求。Web服务器则根据接收到的请求,向客户端发送响应信......
  • 52 Things: Number 2: What is the difference between a multi-core processor and a
    52Things:Number2:Whatisthedifferencebetweenamulti-coreprocessorandavectorprocessor?52件事:数字2:多核处理器和矢量处理器有什么区别?Onthefaceofit,youmaybeconfusedastowhatthedifferenceisbetweenthesetwoprocessors.Afterall,yo......
  • ASP.NET Core 依赖注入中的Scope
    每个请求是一个Scope为什么不能直接从RootScope中Resolve实例,会造成内存泄漏,原因是RootScope不会Dispose,长命持有短命问题注意CreateScope()Scope的范围Refhttps://andrewlock.net/the-dangers-and-gotchas-of-using-scoped-services-when-configuring-options-in-asp-n......