通过集成腾讯 IM 来浅尝一下.net 6 的 MINI API

背景

下一篇在继续 Go 的学习笔记,因为这阵子一直有项目压着,确实没有精力去总结学习成果。所以这篇就先换换口味,切回老本行,分享一下.net 6 的一个小知识。

前些天,我们对外提供的一些管理系统,要升级一下消息中心,之前我是用微软的 signalr 框架来做的,但由于用户提供的服务器是 Windows server 2008,版本较低,没办法支持 websocket,所以 signalr 框架自动给降级成了 SSE 机制,降级之后,由于网络抖动问题,导致链接经常莫名其妙的就断开了,也是因为不是长链接,所以判定链接是否断开也有点复杂,也就没办法在准确的时机来执行重连机制。所以不得不说,Windows server 2012 之前的服务器版本真的太拉胯了。

这种情况按说最好的解决办法就是升级一下用户服务器系统,但这几乎是不可能的,所以就想了一个办法,接入一下第三方的 IM 服务,这样,消息的控制中心全部转移到第三方,来回的消息推送也通过第三方来执行,虽然多了一些开发成本,但这已经是目前情况下的最优解了。

正好也可以借此机会,来体验一下.net 6 最新推出的 mini api,话说这还是当时.net 6 框架推出时的一个主打特性,据说是参考了 Go 这样的新型语言特性,推出的一个超级轻量级的 webapi 开发框架,因为采用了"top-level statements"(不知道咋翻译更合适,属于只能意会不能言传吧~哈哈)这样的语法特性,所以新建的项目文件代码非常精炼。

创建项目

创建项目本身没啥好说的,只是因为要用最小化开发,所以在选择的时候注意一下,最下面那个“使用最小 API”和“Do not use top-level statements”的选项不要勾选哦,如果勾选了,就是之前的老面孔了,其余的按需选择就好。

新建好的项目,是这样

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){    app.UseSwagger();    app.UseSwaggerUI();}
var summaries = new[]{    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};
app.MapGet("/weatherforecast", () =>{    var forecast = Enumerable.Range(1, 5).Select(index =>        new WeatherForecast        (            DateTime.Now.AddDays(index),            Random.Shared.Next(-20, 55),            summaries[Random.Shared.Next(summaries.Length)]        ))        .ToArray();    return forecast;}).WithName("GetWeatherForecast");
app.Run();
internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary){    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);}

复制代码

因为我勾选了启用 openapi,所以,代码会对多几行,为了体现它的“最小”特性,我把默认的天气接口和 swagger 相关的配置都去掉。然后就成这样了~

只剩 3 行,甚至这三行还可以简化成 1 行,呈现成 3 行纯纯只是为了清晰。

依赖注入

项目建好后,我们还是老规矩,编写接口和接口方法。这里我是接入的腾讯云 IM 的服务端接口,也就先浅浅的展示一个例子,跑通之后,剩下的就是纯体力劳动了~

接入腾讯云 IM

首先要在腾讯云控制台,开通 IM 服务,这里呢,我们这边因为是后台管理系统使用,所以用户量不多,采用的是免费版,大家有需要的可以到官网了解下。

接入流程官方文档也给的很明白,首先先是获取 usersig,这个呢,官方提供了 sdk,我这里也就是捡了个现成的,直接接入。大家做接入的时候,也可以按官方提供的方案接入,除了可以在服务端生成 usersig,也可以在客户端生成,但为了安全,还是在后端生成吧~

得到这个字符串后,可以先到腾讯云的控制台验证一下自己的生成的 usersig 对不对,如果验证是通过的,就可以继续接入服务端接口了,这样可以稍微提高一点效率~

这样就算是验证通过了,然后开始编写接口方法来。

接口函数

我这里接入 IM 接口的第一个方法,导入用户,这也是接入的第一步,只有导入到 IM 中的用户,才能执行后面的消息推送等功能

public interface IAccountAPI{  Task<dynamic> Import(string userId, string nick = "", string faceUrl = "");}

复制代码

然后实现接口方法

internal class AccountAPI : IAccountAPI{        public AccountAPI()        {        }        public CommonRequestModel requestModel = new CommonRequestModel();
        public async Task<dynamic> Import(string userId,string nick="",string faceUrl="")        {            requestModel.usersig = new TLSSigAPIv2({你的sdkid}, "{你的秘钥}").genUserSig(requestModel.identifier);            AnsiConsole.WriteLine($"usersig:{requestModel.usersig}");            requestModel.sdkappid = {你的sdkid};            HttpClient client = new HttpClient();                        var response = await client.PostAsync("https://console.tim.qq.com/v4/im_open_login_svc/account_import"+requestModel.urlParam, new StringContent(                System.Text.Json.JsonSerializer.Serialize(new { UserID = userId, Nick = nick, FaceUrl = faceUrl })                ));            return await response.Content.ReadAsStringAsync();        }}

复制代码

注入

接口编写好后,就可以注入到容器中了

using API.TecentLib;using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.builder.Services.AddScoped<IAccountAPI, AccountAPI>();//注入接口实例var app = builder.Build();

复制代码

request

app.MapPost("/import", async ([FromBody] ImportModel user, IAccountAPI accountapi) =>{    Console.WriteLine(await accountapi.Import(user.user));});

复制代码

区别于传动的 controller 形式,mini api 最大的特点就是可以通过简单的形式,来构造路由,仅仅需要两个参数就可以实现想要的功能。

app.MapPost 标识这是一个 post 方法,对应的还有 MapGet,MapPut,MatDelete 方法,来区别不同的请求方式,第一个参数标识请求路由,第二个参数是实现方法,而实现方法可以是一个 lambda 表达式,也可以是一个具体的方法。

response

上面的结果,我们就可以实际得到腾讯云返回的实际内容了

但我们的目的并不是让她打印在控制台上,还要作为 json 结构返回到客户端,所以稍加改造(注意我这里只是作为分享例子来简单呈现,实际返回值应该是多样化的,不能只有这一种类型)

app.MapPost("/import", async ([FromBody] ImportModel user, IAccountAPI accountapi) =>{    return new { code = 0, msg = "success", data = await accountapi.Import(user.user) };});

复制代码

在通过 postman 来测试一下

OK,如此,通过集成腾讯云的 IM 这样一个实际的案例,浅尝了一下 MINI API 的魅力,总体来说非常舒服,如果只是开发小型甚至中型的一些接口,这种形式无疑非常适合,而且效率奇高!

好了今天就这样了。

PS.本文已于2022.5.30首发于InfoQ写作社区(原地址:通过集成腾讯IM来浅尝一下.net 6的MINI API_.net core_为自己带盐_InfoQ写作社区),2022.12.5日由作者本人转载至CSDN社区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为自己_带盐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值