写点什么

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

作者:为自己带盐
  • 2022 年 5 月 30 日
  • 本文字数:2837 字

    阅读完需:约 9 分钟

背景

下一篇在继续 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 对不对,如果验证是通过的,就可以继续接入服务端接口了,这样可以稍微提高一点效率~



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

接口函数

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 的魅力,总体来说非常舒服,如果只是开发小型甚至中型的一些接口,这种形式无疑非常适合,而且效率奇高!

好了今天就这样了。

发布于: 刚刚阅读数: 3
用户头像

学着码代码,学着码人生。 2019.04.11 加入

狂奔的小码农

评论

发布
暂无评论
通过集成腾讯IM来浅尝一下.net 6的MINI API_.net core_为自己带盐_InfoQ写作社区