如何在现有项目中使用`Masa MiniApi`?

如何,现有,项目,使用,masa,miniapi · 浏览次数 : 590

小编点评

**项目模板介绍** 该项目是一个用于开发和测试Minimal APIs的模板项目,它不与MasaFramework本身有任何直接关联。该模板包含以下文件: * `Program.cs`:该文件包含用于启动服务的代码。 * `DemoService.cs`:该文件定义了服务类 `DemoService`,该服务用于处理与 `UserService` 和 `User` 相关的 API 操作。 * `UserService.cs`:该文件定义了 `UserService` 类,该类用于处理与 `User` 相关的 API 操作。 **主要功能** * 定义了用于获取和管理用户数据的 API 路由。 * 使用 `Microsoft.AspNetCore.Mvc` 中的 `RouteOptions` 和 `[FromBody]` 注解定义了用于添加和更新用户数据的 API 方法。 * 使用 `Task` 返回类型表示 API 操作的结果。 **使用说明** 1. 创建一个新的 ASP.NET Core 项目。 2. 将该模板的 `MASA.json` 文件中的默认值更改为所需的配置。 3. 启动服务器。 4. 使用 `localhost:5000` 访问 API 接口。

正文

首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFrameworkMiniApi的包

  1. 创建Asp.NET Core 空的项目模板

  1. 项目名称MFMiniApi

  1. 其他信息看图,取消Https配置,也可以选择,

  1. 这就是一个空的项目模板

  2. 安装Masa MiniApi

    搜索Masa.Contrib.Service.MinimalAPIs ,请注意选择到包括发行版,由于1.0未发版,所以先用预览版

  1. 安装一下Swagger

    搜索Swashbuckle.AspNetCore安装

  2. 使用MasaMiniApi

    修改Program.cs代码

    using Microsoft.OpenApi.Models;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddEndpointsApiExplorer();
    
    builder.Services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    });
    
    var app = builder.AddServices();
    
    app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    });
    
    await app.RunAsync();
    
    

    创建Service文件夹然后创建DemoService.cs

    内部代码:

    namespace MFMiniApi.Service;
    
    public class DemoService : ServiceBase
    {
        public string PostAsync()
        {
            return "成功了吗";
        }
    }
    
    
  3. 启动项目,通过MiniApi实现了注册Api服务

MasaMiniApi功能:

Minimal APIs十分轻量,写法十分简单,可正因为如此,也给我们带来一些编码上的问题,下面我们来看一下原生Minimal APIs的写法与Masa提供的Minimal APIs的写法的区别

原生写法

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/api/v1/users/{id}", (Guid id)=>
{
    // todo: 查询用户信息
    var user = new User()
    {
        Id = id,
        Name = "Tony"
    };
    return Task.FromResult(Results.Ok(user));
});

app.MapPost("/api/v1/users", ([FromBody] UserRequest request)=>
{
    //todo: 添加用户逻辑
    return Task.FromResult(Results.Accepted());
});

app.MapDelete("/api/v1/users/{id}",(Guid id)=>
{
    //todo: 删除用户逻辑
    return Task.FromResult(Results.Accepted());
});

app.MapPut("/api/v1/users/{id}",(Guid id, [FromBody] EditUserRequest request)=>
{
    //todo: 修改用户逻辑
    return Task.FromResult(Results.Accepted());
});

app.Run();

MasaMiniApi

创建UserService.cs,使用案例自动注册

using Microsoft.AspNetCore.Mvc;

namespace MFMiniApi.Service;

public class UserService : ServiceBase
{
    /// <summary>
    /// Get: /api/v1/users/{id}
    /// </summary>
    public Task<IResult> GetAsync(Guid id)
    {
        // todo: 查询用户信息
        var user = new User()
        {
            Id = id,
            Name = "Tony"
        };
        return Task.FromResult(Results.Ok(user));
    }

    /// <summary>
    /// Post: /api/v1/users
    /// </summary>
    public Task<IResult> AddAsync([FromBody] UserRequest request)
    {
        //todo: 添加用户逻辑
        return Task.FromResult(Results.Accepted());
    }

    /// <summary>
    /// Delete: /api/v1/users/{id}
    /// </summary>
    public Task<IResult> DeleteAsync(Guid id)
    {
        //todo: 删除用户逻辑
        return Task.FromResult(Results.Accepted());
    }

    /// <summary>
    /// Put: /api/v1/users/{id}
    /// </summary>
    public Task<IResult> UpdateAsync(Guid id, [FromBody] EditUserRequest request)
    {
        //todo: 修改用户逻辑
        return Task.FromResult(Results.Accepted());
    }
}

UserService.cs,使用案例手动注册

public class UserService : ServiceBase
{
    public UserService()
    {
        RouteOptions.DisableAutoMapRoute = true;//当前服务禁用自动注册路由

        App.MapGet("/api/v1/users/{id}", GetAsync);
        App.MapPost("/api/v1/users", AddAsync);
        App.MapDelete("/api/v1/users/{id}", DeleteAsync);
        App.MapPut("/api/v1/users/{id}", UpdateAsync);
    }

    public Task<IResult> GetAsync(Guid id)
    {
        // todo: 查询用户信息
        var user = new User()
        {
            Id = id,
            Name = "Tony"
        };
        return Task.FromResult(Results.Ok(user));
    }

    public Task<IResult> AddAsync([FromBody] UserRequest request)
    {
        //todo: 添加用户逻辑
        return Task.FromResult(Results.Accepted());
    }

    public Task<IResult> DeleteAsync(Guid id)
    {
        //todo: 删除用户逻辑
        return Task.FromResult(Results.Accepted());
    }

    public Task<IResult> UpdateAsync(Guid id, [FromBody] EditUserRequest request)
    {
        //todo: 修改用户逻辑
        return Task.FromResult(Results.Accepted());
    }
}

MasaMiniApi全局配置

参数名 参数描述 默认值
DisableAutoMapRoute 禁用自动映射路由 false
Prefix 前缀 api
Version 版本 v1
AutoAppendId 路由中是否包含{Id}, 例如: /api/v1/user/ true
PluralizeServiceName 服务名称是否启用复数 true
GetPrefixes 用于识别当前方法类型为Get请求 new List<string> { "Get", "Select", "Find" }
PostPrefixes 用于识别当前方法类型为Post请求 new List<string> { "Post", "Add", "Upsert", "Create", "Insert" }
PutPrefixes 用于识别当前方法类型为Put请求 new List<string> { "Put", "Update", "Modify" }
DeletePrefixes 用于识别当前方法类型为Delete请求 new List<string> { "Delete", "Remove" }
DisableTrimMethodPrefix 禁用移除方法前缀(上方GetPostPutDelete请求的前缀) false
MapHttpMethodsForUnmatched 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 支持PostGetDeletePut 此方式Swagger不支持, 无法正常显示API
Assemblies 用于扫描服务所在的程序集 MasaApp.GetAssemblies()(全局Assembly集合,默认为当前域程序集集合)
RouteHandlerBuilder 基于RouteHandlerBuilder的委托,可用于权限认证、CORS null

服务内配置

参数名 参数描述 默认值(未赋值为null)
BaseUri 根地址
ServiceName 服务名称
RouteHandlerBuilder 基于RouteHandlerBuilder的委托,可用于权限认证、CORS
RouteOptions(对象) 局部路由配置
DisableAutoMapRoute 禁用自动映射路由
Prefix 前缀
Version 版本
AutoAppendId 路由中是否包含{Id}font>, 例如: /api/v1/user/
PluralizeServiceName 服务名称是否启用复数
GetPrefixes 用于识别当前方法类型为Get请求
PostPrefixes 用于识别当前方法类型为Post请求
PutPrefixes 用于识别当前方法类型为Put请求
DeletePrefixes 用于识别当前方法类型为Delete请求
DisableTrimMethodPrefix 禁用移除方法前缀(上方GetPostPutDelete请求的前缀)
MapHttpMethodsForUnmatched 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 此方式Swagger不支持, 无法正常显示API

MiniApi文档

MASA Framework (masastack.com)

这是官方文档地址,MasaFramework提供了很多的包都没有存在什么强依赖,都可以单独拿到项目中使用,这也是我目前一直学习Masaframework的原因,

好了MasaMiniApi的使用案例介绍到这里

来自token的分享

技术交流群:737776595

与如何在现有项目中使用`Masa MiniApi`?相似的内容:

如何在现有项目中使用`Masa MiniApi`?

首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFramework的MiniApi的包 创建Asp.NET Core 空的项目模板 项目名称MFMiniApi 其他信息看图,取消Https配置,也可以选择, 这就是

如何在现有的Vue项目中嵌入 Blazor项目?

目前官方只提供了angular和react俩种示例,所以本教程将来讲解如何在Vue的现有项目中使用,上期已经做好了react的教材! 准备流程 Vue 项目创建流程 使用Vue创建一个Demo项目 全部选择默认No即可 然后项目名称就用demo了 npm init vue@latest cd dem

如何实现在react现有项目中嵌入Blazor?

如何实现在react现有项目中嵌入Blazor? 目前官方只提供了angular和react俩种示例所以本教程只讲react教程 思路讲解: 首先在现有react项目中我们可能某些组件是在Blazor中完成,但是我们没办法找到怎么在react中轻量级使用blazor组件,可能会有人会使用iframe

头疼,大事务问题如何解决?

前言 最近有个网友问了我一个问题:系统中大事务问题要如何处理? 正好前段时间我在公司处理过这个问题,我们当时由于项目初期时间比较紧张,为了快速完成业务功能,忽略了系统部分性能问题。项目顺利上线后,专门抽了一个迭代的时间去解决大事务问题,目前已经优化完成,并且顺利上线。现给大家总结了一下,我们当时使用

头疼,又遇到大事务问题了。。。

前言 最近有个网友问了我一个问题:系统中大事务问题要如何处理? 正好前段时间我在公司处理过这个问题,我们当时由于项目初期时间比较紧张,为了快速完成业务功能,忽略了系统部分性能问题。项目顺利上线后,专门抽了一个迭代的时间去解决大事务问题,目前已经优化完成,并且顺利上线。现给大家总结了一下,我们当时使用

包管理工具npm和Yarn的区别,我们该如何选择?

好家伙,学习新工具 1.为什么我们需要包管理器? 关于npm我们已经知道了,这是我们项目的包管理器, 我们现在用的无比顺手的工具,都是在无数的竞争中杀出来的,他们淘汰了无数的产品 首先,倘若我们不使用npm,那么我们应该如何去新建一个前端项目? 纯手工,把我们项目需要的项目一个个下载到我们的项目里面

go高并发之路——go语言如何解决并发问题

一、选择GO的原因 作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但21年之后的新项目基本上就都

SQLite vs MySQL vs PostgreSQL对比总结

开发业务系统时,是绕不开RDBMS(关系型数据库)的。虽然现在诞生了各种NoSQL的数据库,RDBMS在业务系统中的严谨和优势依然无法取代。 近几年大大小小的项目中,常用的三种RDBMS(SQLite,MySQL,Postgres)都有多次接触过,一些使用心得记录如下,供大家参考。 1. SQLit

Django更换数据库和迁移数据方案

前言 双十一光顾着买东西都没怎么写文章,现在笔记里还有十几篇半成品文章没写完… 今天来分享一下 Django 项目切换数据库和迁移数据的方案,网络上找到的文章方法不一,且使用中容易遇到各类报错,本文根据 Django 官方文档和工作中的经验,稳定可靠,在博客中长期更新~ 如果你遇到同样的问题,阅读本

如何正确使用:has和:nth-last-child

我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的`grid`。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会根据子元素的数量而改变。 这在CSS中已经存在很多年了,但现在通过CSS `:has`,它变得更加强大。我们可以把`nt