.NET 8 中的 Mini WebApi

介绍

    .NET 8 中的极简 API 隆重登场,重新定义了我们构建 Web 服务的方式。如果您想知道极简 API 的工作原理以及它们如何简化您的开发流程,让我们通过一些引人入胜的示例来深入了解一下。

.NET 极简主义的诞生

    想想我们曾经不得不为一个简单的 Web 服务编写几页代码。很乏味,对吧?最小 API 就像一股清新的空气。它们在 .NET 6 中引入,并在 .NET 8 中得到改进,消除了传统 ASP.NET Core MVC 模型的复杂性。不再需要控制器,不需要广泛的配置 — 这正是您所需要的。

为什么要使用最少的 API?

    1、效率:少写,多做。这是现代开发人员的口头禅。

    2、性能:它们精简、高效、快速,非常适合高性能场景。

    3、易于使用:.NET 新手?没问题!最少的 API 易于访问和掌握。

    4、灵活性:简单并不意味着受限。从微服务到大型应用程序,它们都能满足您的需求。

入门

    要开始这一旅程,请确保您已安装.NET 8 SDK。打开您最喜欢的代码编辑器,让我们创建我们的第一个最小 API。

重要设置信息:在运行本文提供的示例之前,请确保您已安装必要的 NuGet 包。对于涉及 OpenAPI 文档的功能,您将需要该Microsoft.AspNetCore.OpenApi包。您可以使用以下命令通过 NuGet 包管理器控制台安装它:

Install-Package Microsoft.AspNetCore.OpenApi

此包对于使用以下示例中显示的扩展方法至关重要WithOpenApi。

示例 1:你好,世界!

    经典入门。此 API 返回友好问候语。运行此 API,瞧!您的 API 将在http://localhost:<port>/向全世界问好。请注意,端口号可能会根据您的设置而变化。
    
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;

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

app.MapGet("/", () => "Hello, World!");

app.Run();
Response body:
Hello, World!
Response headers:
content-type: text/plain; charset=utf-8 
date: Tue,21 Nov 2023 13:38:37 GMT 
server: Kestrel 

设置舞台:图书服务

    在进入路由之前,让我们先了解一下设置。我们定义了一个IBookService接口及其实现BookService,它模拟了一个图书数据库。这是将数据访问逻辑封装在服务层中的经典示例,它促进了关注点分离并使代码更易于维护。

背景介绍

    “想象一下,走进一个井然有序的数字图书馆,只需点击一下鼠标即可找到每本书。这就是我们BookService在 Minimal API 设置中创建的内容。这项服务是我们应用程序的支柱,用于管理和提供图书数据。”

namespace MinimalApis
{
    public interface IBookService
    {
        List<Book> GetBooks();
        
        Book GetBook(int id);
    }

    public class BookService : IBookService
    {
        private readonly List<Book> _books;

        public BookService()
        {
            _books = new List<Book>
            {
                new()
                {
                    Id = 1,
                    Title = "Dependency Injection in .NET",
                    Author = "Mark Seemann"
                },
                new()
                {
                    Id = 2,
                    Title = "C# in Depth",
                    Author = "Jon Skeet"
                },
                new()
                {
                    Id = 3,
                    Title = "Programming Entity Framework",
                    Author = "Julia Lerman"
                },
                new()
                {
                    Id = 4,
                    Title = "Programming WCF Services",
                    Author = "Juval Lowy and Michael Montgomery"
                }
            };
        }

        public List<Book> GetBooks()
        {
            return this._books;
        }

        public Book GetBook(int id)
        {
            var book = this._books.FirstOrDefault(x => x.Id == id);

            return book;
        }
    }

    public class Book
    {
        public int Id { get; set; }

        public string Title { get; set; }

        public string Author { get; set; }
    }
}

        这IBookService是我们的蓝图,声明了我们的服务必须提供哪些功能——列出所有书籍并通过 ID 获取特定的书籍。BookService是具体的实现,我们定义这些功能如何工作。

        在里面BookService,我们有一个私有列表_books,用作我们的模拟数据库。它预先填充了一些要模拟的书籍。这种设置让我们可以专注于 API 功能,而不必担心实际的数据库连接。

        该GetBooks方法返回所有书籍,同时GetBook使用 LINQ 通过其 ID 搜索书籍。这是一种处理数据的简单而强大的方法。

builder.Services.AddSingleton<IBookService, BookService>();

        最后,我们BookService通过依赖注入系统注册,将我们的 API 集成到 Minimal API 管道中。这样,它就可以BookService在我们的应用程序中的任何地方使用。

示例 2:获取所有书籍

    本示例演示如何列出图书馆中的所有书籍。

app.MapGet("/books", (IBookService bookService) => 
    TypedResults.Ok(bookService.GetBooks()))
    .WithName("GetBooks")
    .WithOpenApi(x => new OpenApiOperation(x)
    {
        Summary = "Get Library Books",
        Description = "Returns information about all the available books from the Amy's library.",
        Tags = new List<OpenApiTag> { new() { Name = "Amy's Library" } }
    });
    
端点定义:app.MapGet("/books", ...)此行在 URL 处定义一个 GET 端点/books。

依赖注入:(IBookService bookService)这里IBookService自动注入,允许访问图书服务。

服务交互:bookService.GetBooks()调用GetBooks的方法BookService来获取所有书籍。

响应:TypedResults.Ok(...)将书籍列表包装在 HTTP 200 OK 响应中。

Swagger文档:

.WithName("GetBooks"):为清楚起见,为端点分配一个名称。
.WithOpenApi(...):添加 Swagger UI 的描述信息,增强 API 文档。

在 Postman 或浏览器中,发送 GET 请求以https://localhost:<port>/books接收所有书籍的 JSON 列表。

[
  {
    "id": 1,
    "title": "Dependency Injection in .NET",
    "author": "Mark Seemann"
  },
  {
    "id": 2,
    "title": "C# in Depth",
    "author": "Jon Skeet"
  },
  {
    "id": 3,
    "title": "Programming Entity Framework",
    "author": "Julia Lerman"
  },
  {
    "id": 4,
    "title": "Programming WCF Services",
    "author": "Juval Lowy and Michael Montgomery"
  }
]

示例 3:通过 ID 获取特定书籍
此示例显示如何通过 ID 检索特定书籍。

app.MapGet("/books/{id}", Results<Ok<Book>, NotFound> (IBookService bookService, int id) =>
        bookService.GetBook(id) is { } book 
            ? TypedResults.Ok(book) 
            : TypedResults.NotFound()
    )
    .WithName("GetBookById")
    .WithOpenApi(x => new OpenApiOperation(x)
    {
        Summary = "Get Library Book By Id",
        Description = "Returns information about selected book from the Amy's library.",
        Tags = new List<OpenApiTag> { new() { Name = "Amy's Library" } }
    });
    
端点定义:app.MapGet("/books/{id}", ...)在 处定义一个 GET 端点/books/{id},其中{id}是表示书籍 ID 的变量。

路线逻辑:bookService.GetBook(id) is { } book尝试通过 ID 查找书籍。如果找到,book则不为空。

条件响应:

如果找到:TypedResults.Ok(book)返回状态为 OK 的书籍。
如果未找到:TypedResults.NotFound()返回 404 未找到状态。
Swagger 文档:与示例 2 类似,为 Swagger UI 提供有意义的信息。

        要查找 ID 为 3 的图书,请向 发送 GET 请求https://localhost:<port>/books/3。您将获得 JSON 格式的图书详细信息,如果 ID 不存在,则收到 404 Not Found 响应。

{
  "id": 3,
  "title": "Programming Entity Framework",
  "author": "Julia Lerman"
}

深入了解完整代码:完整的 Program.cs

        在本节中,让我们探索一下该Program.cs文件。这是我们的 Minimal API 的所有部分汇集在一起​​的地方,从设置服务到定义端点。我将带您了解整个代码,将其分解为易于理解的部分,以便更清楚地理解。

完整代码清单

using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.OpenApi.Models;
using MinimalApis;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSingleton<IBookService, BookService>();

var app = builder.Build();

// configure exception middleware
app.UseStatusCodePages(async statusCodeContext
    => await Results.Problem(statusCode: statusCodeContext.HttpContext.Response.StatusCode)
        .ExecuteAsync(statusCodeContext.HttpContext));

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();


// example 1
app.MapGet("/", () => "Hello, World!");

// example 2
app.MapGet("/books", (IBookService bookService) => 
    TypedResults.Ok(bookService.GetBooks()))
.WithName("GetBooks")
.WithOpenApi(x => new OpenApiOperation(x)
{
    Summary = "Get Library Books",
    Description = "Returns information about all the available books from the Amy's library.",
    Tags = new List<OpenApiTag> { new() { Name = "Amy's Library" } }
});

// example 3
app.MapGet("/books/{id}", Results<Ok<Book>, NotFound> (IBookService bookService, int id) =>
        bookService.GetBook(id) is { } book 
            ? TypedResults.Ok(book) 
            : TypedResults.NotFound()
    )
    .WithName("GetBookById")
    .WithOpenApi(x => new OpenApiOperation(x)
    {
        Summary = "Get Library Book By Id",
        Description = "Returns information about selected book from the Amy's library.",
        Tags = new List<OpenApiTag> { new() { Name = "Amy's Library" } }
    });

app.Run();

设置服务

    在这里,我们启动应用程序并将其注入BookService到我们的服务集合中。这可BookService在整个应用程序中使用。此外,我们还为 API 文档设置了 Swagger。

var builder = WebApplication.CreateBuilder(args); 
builder.Services.AddSingleton<IBookService, BookService>(); 
builder.Services.AddEndpointsApiExplorer(); 
builder.Services.AddSwaggerGen();

配置中间件

    本部分主要介绍中间件配置。UseStatusCodePages有助于处理 HTTP 状态代码,同时UseHttpsRedirection确保安全连接。在开发环境中启用 Swagger UI,以便于测试和探索。

var app = builder.Build();
app.UseStatusCodePages(...);
app.UseHttpsRedirection();
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

定义端点

    这里,我们定义了三个端点:一个简单的问候语,一个列出所有书籍的端点,以及另一个通过 ID 获取特定书籍的端点。这些端点使用我们的BookService与书籍数据进行交互。

app.MapGet("/", () => "Hello, World!");
app.MapGet("/books", ...);
app.MapGet("/books/{id}", ...);

运行应用程序

        最后,此行启动我们的应用程序,使其监听传入的请求。

app.Run();

        该Program.cs文件就像管弦乐队的指挥,确保我们的 Minimal API 的每个部分都能和谐地演奏。它证明了 .NET 8 中 Minimal API 的强大功能 - 简单而强大,使我们能够轻松构建高效且有效的 Web 服务。

退出时

    这些代码片段有效地演示了如何使用 .NET 中的 Minimal API 来创建干净、可维护且文档齐全的 Web 服务。通过利用依赖注入和清晰的路由,我们创建了一个易于理解和使用的 API。无论是列出所有书籍还是查找特定书籍,API 都能优雅高效地处理这些任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录&#xff0c;默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下&#xff0c;文件名称 mkdir 在当前目录下&#xff0c;创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

esp32 GPIO 分别用5种中断类型控制LED

下面程序分别用ANYEDGE POSEDGE NEGEDGE HIGH_LEVEL LOW_LEVEL 中断类型控制GPIO 0 脚的电平。此程序的重点是用延时消除按键产生的无用中断信号 硬件 1. led 接0脚和地 2. 按钮接gpio 1脚 和地或3.3v 脚 图片 程序 #include "driver/gpio.h" #incl…

ansible开局配置-openEuler

ansible干啥用的就不多介绍了&#xff0c;这篇文章主要在说ansible的安装、开局配置、免密登录。 ansible安装 查看系统版本 cat /etc/openEuler-latest输出内容如下&#xff1a; openeulerversionopenEuler-24.03-LTS compiletime2024-05-27-21-31-28 gccversion12.3.1-30.…

金蝶云星空采购退料单集成易仓出库单实现高效数据对接

金蝶云星空采购退料单集成易仓出库单实现高效数据对接 Done-金蝶-采购退料单——>易仓-出库单&#xff1a;高效数据集成方案解析 在企业的日常运营中&#xff0c;数据的准确传递和实时处理至关重要。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中…

基于Ubuntu24.04,下载并编译Android12系统源码 (二)

1. 前言 上篇文章&#xff0c;我们基于Ubuntu24.04&#xff0c;已经成功下载下来了Android12的源码&#xff0c;这篇文章我们会接着上文&#xff0c;基于Ubuntu24.04来编译Android源码。 2. 编译源码 2.1 了解源码编译的名词 Makefile &#xff1a; Android平台的一个编译系…

CMake 生成器表达式介绍

【写在前面】 生成器表达式在构建系统生成期间进行评估&#xff0c;以生成特定于每个构建配置的信息。它们的形式为 $<...>。例如&#xff1a; target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>) 这将扩展为 “/opt/include/GNU”、“/opt…

CV项目整理

1. 爬取+展示的实时项目 1.1 核心技术 myqls + maxwell + redis+django 实现读写分离,实时项目,主从复制,读写分离,顺写日志。 maxwell将自己伪装成为slave,就可以从Mysql的集群中获取顺写日志Binlog maxwell取得的数据格式json 1.2 流程 1.3优化查询 下面的查询,笛卡尔…

如何通过sip信令以及抓包文件分析媒体发到哪个地方

前言 问题描述&#xff1a;A的媒体没转发到B&#xff0c;B只能听到回铃音&#xff0c;没有A的说话声音&#xff0c;并且fs这边按正常的信令发送了. 分析流程 分析早期媒体发送到哪一个IP 10.19.0.1发送了一个请求给10.19.0.157这个IP&#xff0c;然而这里的SDP媒体地址&am…

Flink(一)

目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用&#xff1f; 典型的事件驱动示例 数据分析应用流式分析应用的优势&#xff1f;Flink 如…

RabbitMQ 安装(Windows版本)和使用

安装 安装包获取 可以自己找资源&#xff0c;我这里也有百度云的资源&#xff0c;如果没失效的话可以直接用。 通过百度网盘分享的文件&#xff1a;RabbitMQ 链接&#xff1a;https://pan.baidu.com/s/1rzcdeTIYQ4BqzHLDSwCgyw?pwdfj79 提取码&#xff1a;fj79 安装教程…

Pr 视频效果:闪光灯

视频效果/风格化/闪光灯 Stylize/Strobe Light 闪光灯 Strobe Light效果可用于在视频中创建闪烁或频闪的效果&#xff0c;类似于舞台上的频闪灯或摄影中的闪光灯。 ◆ ◆ ◆ 效果选项说明 通过调整各种参数&#xff0c;可以自定义闪光的颜色、频率、持续时间和混合模式&#…

深入理解ThreadLocal底层原理

ThreadLocal是线程私有的&#xff0c;各个线程之间是隔离的。可以想象一下每次线程创建的时候在堆上预先分配一个内存空间用于存储ThreadLocal的数据。 &#xff08;1&#xff09;当线程被创建时&#xff0c;线程都会有一个成员变量ThreadLocalMap。 //每个线程定义一个成员变…

构建自然灾害预警决策一体化平台,筑牢工程安全数字防线

近年来&#xff0c;国家和部委也强调了要切实加强地质灾害监测预警。作为国内智慧应急领域的先行者&#xff0c;Mapmost持续探索利用数字孪生技术&#xff0c;推进自然灾害风险预警精细化&#xff0c;强化对监测数据的综合分析和异常信息研判处置。建立健全区域风险预警与隐患点…

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南

使用 Qt GRPC 构建高效的 Trojan-Go 客户端&#xff1a;详细指南 初识 Qt 和 gRPC 什么是 Qt&#xff1f;什么是 gRPC&#xff1f; 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…

LabVIEW开发的控制阀监控与维护系统

LabVIEW开发一套自动测试软件&#xff0c;用于控制阀的实时监控、数据采集、维护管理以及报警通知。此系统的目标是通过便捷的操作界面、可靠的通信接口和高效的数据管理&#xff0c;为工厂设备管理提供全面的支持。 1. 项目需求 目标是实现一个控制阀管理系统&#xff0c;能够…

采用STM32CubeMX和HAL库的外部中断设计实例

目录 STM32F1外部中断的硬件设计 STM32F1外部中断的软件设计 通过Keil MDK实现工程 通过Keil MDK实现工程的步骤如下&#xff1a; 中断在嵌入式应用中占有非常重要的地位&#xff0c;几乎每个控制器都有中断功能。中断对保证紧急事件在第一时间处理是非常重要的。 设计使用外…

Python酷库之旅-第三方库Pandas(173)

目录 一、用法精讲 796、pandas.Float32Dtype类 796-1、语法 796-2、参数 796-3、功能 796-4、返回值 796-5、说明 796-6、用法 796-6-1、数据准备 796-6-2、代码示例 796-6-3、结果输出 797、pandas.Float64Dtype类 797-1、语法 797-2、参数 797-3、功能 797-…

Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【MobileNetV2实现实时口罩检测tensorflow】 2.【卫星图像道路检测DeepLabV3P…

AI 聊天机器人的兴起:GPT-3 和 BERT 如何重新定义对话体验

一、说明 当我们深入研究 AI 世界时&#xff0c;了解自然语言处理 &#xff08;NLP&#xff09; 领域取得的巨大进步非常重要。NLP 是 AI 的一个分支&#xff0c;专注于使计算机能够理解、解释和生成人类语言。GPT-3 和 BERT 等语言模型的开发是这一旅程中的一个重要里程碑&…