声明式RESTful客户端在asp.net core中的应用

1 声明式RESTful客户端

声明式服务调用的客户端,常见有安卓的Retrofit、SpringCloud的Feign等,.net有Refit和WebApiClient,这些客户端都是以java或.net某个语言来声明接口,描述如何请求RESTful api。

1.1 WebApiClient

WebApiClient由c#开发,但适用于任意.net语言,包括c#、vb.net、f#等项目,其提供两个nuget包:WebApiClient.JIT和WebApiClient.AOT,均支持.net framework4.5.NET Standard 1.3

WebApiClient.JIT

在运行时使用Emit创建Http请求接口的代理类,HttpApiClient.Create()时,在新的程序集创建了TInterface的代理类,类名与TInterface相同,命名空间也相同,由于代理类和TInterface接口不在同一程序集,所以要求TInterface为public。

  • 可以在项目中直接引用WebApiClient.JIT.dll就能使用;
  • 不适用于不支持JIT技术的平台(IOS、UWP);
  • 接口要求为public;

WebApiClient.AOT

在编译过程中使用Mono.Cecil修改编译得到的程序集,向其插入Http请求接口的代理类IL指令,这一步是在AOT编译阶段之前完成。代理类型所在的程序集、模块、命名空间与接口类型的一样,其名称为$前缀的接口类型名称,使用反编译工具查看项目编译后的程序集可以看到这些代理类。

  • 项目必须使用nuget安装WebApiClient.AOT才能正常使用;
  • 没有JIT,支持的平台广泛;
  • 接口不要求为public,可以嵌套在类里面;

1.2 Refit

Refit是一个开发很早的项目,在github有很高的人气,由c#开发,目前仅支持c#语言项目,支持.NET Standard 1.4,.net framework需要4.6.1得以支持。

Refit的内部实现与WebApiClient.AOT有相似之处,都是在编译阶段向声明接口项目插入接口实现类的代码或IL指令,我们可以称之为静态代理的编译时织入。Refit使用Microsoft.CodeAnalysis.CSharp来分析接口语法,编译前补充生成接口的代理类代码用来与项目代码一起编译。

2 WebApiClient的声明式接口

WebApiClient支持GET/HEAD、PUT/POST/DELETE、PATCH请求方法,请求内容体支持json、xml、multipart/form-data、application/x-www-form-urlencoded和自定义无结构内容等,其声明式接口风格与asp.net core的接口声明非常相似。

2.1 接口声明

远程服务asp.net core接口示例

[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
    // GET api/users
    [HttpGet]
    public UserInfo[] Get()
    {
        return new UserInfo[]
        {
            new UserInfo { Account="laojiu" },
            new UserInfo { Account="webapicleint" }
        };
    }

    // GET api/users/id001
    [HttpGet("{id}")]
    public UserInfo Get(string id)
    {
        return new UserInfo { Id = id, Account = "laojiu" };
    }

    // POST api/users
    [HttpPost]
    public bool Post([FromBody] UserInfo value)
    {
        return true;
    }

    // PUT api/users
    [HttpPut]
    public bool Put([FromBody] UserInfo value)
    {
        return true;
    }

    // PATCH api/users/id001
    [HttpPatch("{id}")]
    public bool Patch(string id, [FromBody] JsonPatchDocument<UserInfo> value)
    {
        var user = new UserInfo { Account = "laojiu" };
        value.ApplyTo(user);

        return true;
    }


    // DELETE api/users/id001
    [HttpDelete("{id}")]
    public bool Delete(string id)
    {
        return true;
    }
}

WebApiClient声明式调用接口

[TraceFilter]
public interface IUsersApi : IHttpApi
{
    [HttpGet("api/users")]
    ITask<UserInfo[]> GetAsync();

    [HttpGet("api/users/{id}")]
    ITask<UserInfo> GetAsync(string id);

    [HttpPost("api/users")]
    ITask<bool> PostAsync([JsonContent] UserInfo value);

    [HttpPut("api/users")]
    ITask<bool> PutAsync([JsonContent] UserInfo value);

    [HttpPatch("api/users/{id}")]
    ITask<bool> PatchAsync(string id, JsonPatchDocument<UserInfo> value);

    [HttpDelete("api/users/{id}")]
    ITask<bool> DeleteAsync(string id);
}

3 WebApiClient与DI结合

asp.net core环境中,我们可以使用WebApiClient.Extensions项目简单WebApiClient的DI的配置,目前有DependencyInjection和HttpClientFactory的扩展等。

3.1 WebApiClient.Extensions.DependencyInjection

引入nuget包

PM> install-package WebApiClient.Extensions.DependencyInjection 

Startup相关配置

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpApi<IUsersApi>().ConfigureHttpApiConfig((c,p) =>
    {
        c.HttpHost = new Uri("https://localhost:5001/");
        c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
        c.LoggerFactory = p.GetRequiredService<ILoggerFactory>();
    });
    ...
}

Controller

public class HomeController : Controller
{
    public async Task<string> Index([FromServices]IUsersApi usersApi)
    {
        var u = new UserInfo { Id = "id001", Account = "webapiclient", Password = "123456" };
        var doc = new JsonPatchDocument<UserInfo>();
        doc.Replace(item => item.Password, "888888");

        var users = await usersApi.GetAsync();
        var user = await usersApi.GetAsync("id001");
        var postState = await usersApi.PostAsync(u);
        var putState = await usersApi.PutAsync(u);
        var patchState = await usersApi.PatchAsync("id001", doc);
        var deleteState = await usersApi.DeleteAsync("id001");
        return "ok";
    }
}

3.2 WebApiClient.Extensions.HttpClientFactory

引入nuget包

PM> install-package WebApiClient.Extensions.HttpClientFactory 

Startup相关配置

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{   
    services.AddHttpApiTypedClient<IUsersApi>((c, p) =>
    {
        c.HttpHost = new Uri("https://localhost:5001/");
        c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
        c.LoggerFactory = p.GetRequiredService<ILoggerFactory>();
    });
    ...
}

4 总结

本文讲解了声明式客户端的概念、列表几个声明式客户端项目,同时讲解声明式客户端WebApiClient在asp.net core项目中的简单使用,有关更多高级的应用,可以到WebApiClient的github上查看相关wiki。

转载于:https://www.cnblogs.com/kewei/p/9786319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是ASP.NET CoreASP.NET Core是一个跨平台的开源Web应用程序框架,它可以在Windows、Linux和macOS等操作系统上运行。它是.NET Core的一部分,可以使用C#、F#和Visual Basic等语言进行开发。 2. ASP.NET CoreASP.NET有什么区别? ASP.NET Core是一个轻量级的框架,它比ASP.NET更加灵活和可扩展。它可以在不同的操作系统上运行,而ASP.NET只能在Windows上运行。ASP.NET Core还提供了更好的性能和安全性,以及更好的支持Docker和云计算等新技术。 3. 什么是间件? 间件是ASP.NET Core应用程序的一个组件,它可以处理HTTP请求和响应。间件可以是一个单独的函数或一个类,它可以在请求到达应用程序之前或之后执行一些操作,例如记录日志、验证身份、压缩响应等。 4. 什么是依赖注入? 依赖注入是一种设计模,它可以帮助我们解耦应用程序的组件。在ASP.NET Core,我们可以使用依赖注入来管理应用程序的服务和组件。依赖注入可以使代码更加可测试、可维护和可扩展。 5. 什么是Razor视图引擎? Razor视图引擎是ASP.NET Core的一个组件,它可以帮助我们创建动态的HTML页面。Razor视图引擎使用C#或VB.NET等语言来编写视图代码,它还提供了一些特殊的语法和标记,例如@符号、@model指令、@if语句等。 6. 什么是MVC模? MVC模是一种软件架构模,它将应用程序分为三个部分:模型、视图和控制器。模型表示应用程序的数据和业务逻辑,视图表示应用程序的用户界面,控制器负责处理用户请求并更新模型和视图。 7. 什么是Web API? Web API是一种用于创建RESTful Web服务的框架。在ASP.NET Core,我们可以使用Web API来创建基于HTTP协议的API,它可以返回JSON、XML等格的数据。Web API还提供了一些特殊的特性,例如路由、过滤器、模型绑定等。 8. 什么是SignalR? SignalR是ASP.NET Core的一个组件,它可以帮助我们创建实时Web应用程序。SignalR使用WebSocket协议或其他技术来实现双向通信,它可以在服务器和客户端之间传输数据和消息。 9. 什么是Identity框架? Identity框架是ASP.NET Core的一个组件,它可以帮助我们管理应用程序的用户和身份验证。Identity框架提供了一些特殊的类和方法,例如UserManager、SignInManager、IdentityRole等,它还可以与ASP.NET Core的其他组件集成,例如间件、授权等。 10. 什么是EF Core? EF CoreASP.NET Core的一个组件,它可以帮助我们管理应用程序的数据访问。EF Core是Entity Framework的轻量级版本,它可以在不同的数据库上运行,例如SQL Server、MySQL、PostgreSQL等。EF Core提供了一些特殊的类和方法,例如DbContext、DbSet、LINQ查询等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值