.NET 8 中的 Mini WebApi

news2024/11/29 22:35:46

介绍

    .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.coloradmin.cn/o/2227080.html

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

相关文章

在 Kakarot ZkEVM 上使用 Starknet Scaffold 构建应用

Starknet 和 EVM 我们所知的智能合约世界一直围绕着以太坊虚拟机&#xff08;EVM&#xff09;&#xff0c;其主要语言是 Solidity。 尽管 Starknet 通过 STARKs 为以太坊开辟了新的可能性&#xff0c;但其缺点是它有一个不同的虚拟机 (CairoVM)&#xff0c;这要求开发者学习 …

多态的体现

多态&#xff1a;当不同的对象去完成某个行为时会产生出不同的状态多态体现&#xff1a; 在代码运行时&#xff0c;当传递不同类对象时&#xff0c;会调用对应类中的方法。 public class Animal {String name;int age;public Animal(String name, int age){this.name name;t…

docker安装、设置非sudo执行、卸载

安装 sudo snap install docker 设置docker非sudo执行 sudo groupadd docker sudo usermod -aG docker $USER newgrp docker sudo chown root:docker /var/run/docker.sock 卸载docker 1.删除docker及安装时自动安装的所有包 apt-get autoremove docker docker-ce docker-…

Java之多线程的实现(创建)(3种实现方式)(面试高频)

目录 一、多线程的3种实现方式 &#xff08;1&#xff09;继承Thread类。 &#xff08;2&#xff09;实现Runnable接口。&#xff08;void run()&#xff1a;该方法无返回值、无法抛出异常&#xff09; &#xff08;3&#xff09;实现Callable接口。&#xff08;V call() throw…

Linux补基础之:网络配置

目录 一、检查主机与虚拟机是否能正常通信 二、网络的连接模式 桥接模式 流程 特点 NAT模式 流程 特点 仅主机 流程 特点 三、修改静态IP 四、可能遇到的问题 防火墙 DNS 五、主机名更改 六、登录服务器 实际的大数据管理中&#xff0c;会有由很多服务器构成的…

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…

初识WebGL

思路&#xff1a; 构建<canvas>画布节点&#xff0c;获取其的实例。使用getWebGLContext() 拿到画布上下文。拿到上下文用clearColor() 设置背景颜色。最后清空canvas画布,是为了清除颜色缓冲区。 html结构&#xff1a; <!DOCTYPE html> <html lang"en&…

w外链如何跳转微信小程序

要创建外链跳转微信小程序&#xff0c;主要有以下几种方法&#xff1a; 使用第三方工具生成跳转链接&#xff1a; 注册并登录第三方外链平台&#xff1a;例如 “W外链” 等工具。前往该平台的官方网站&#xff0c;使用手机号、邮箱等方式进行注册并登录账号。选择创建小程序外…

【华为HCIP实战课程二十一】OSPF区域间汇总配置详解,网络工程师

一、OSPF汇总和默认路由 1、大规模的OSPF网络配置路由汇总,减小路由表的规模。 2、路由汇总讲多条连续的IP前缀汇总成一条路由前缀。 3、可以避免网络中的路由震荡,提高网络的稳定性。 4、ABR/ASBR完成路由汇总。 [R4-ospf-1-area-0.0.0.0]abr-summary 11.1.0.0 255.255.…

在C#中使用指针

C#向开发人员隐藏了大部分基本内存管理操作&#xff0c;因为它使用了垃圾回收器和引用。但是&#xff0c;有时候我们也需要直接访问内存&#xff0c;例如&#xff1a;进行平台调用&#xff0c;性能优化等等。 .Net平台定义了两种主要数据类型&#xff1a;值类型和引用类型&…

前端零基础入门到上班:【Day2】开发环境VSCode安装

VSCode 安装教程&#xff1a;图文保姆教程 引言 在前端开发中&#xff0c;选择合适的代码编辑器是提高工作效率的重要一步。Visual Studio Code&#xff08;简称 VSCode&#xff09;作为一款强大的开源编辑器&#xff0c;因其简洁易用、功能强大、扩展性好而广受开发者喜爱。…

MES系列- 统计过程分析(SPC)实现

MES系列文章目录 ISA-95制造业中企业和控制系统的集成的国际标准-(1) ISA-95制造业中企业和控制系统的集成的国际标准-(2) ISA-95制造业中企业和控制系统的集成的国际标准-(3) ISA-95制造业中企业和控制系统的集成的国际标准-(4) ISA-95制造业中企业和控制系统的集成的国际标准…

面对复杂的软件需求:5大关键策略!

面对软件需求来源和场景的复杂性&#xff0c;有效地管理和处理需求资料是确保项目成功的关键&#xff0c;能够提高需求理解的准确性&#xff0c;增强团队协作和沟通&#xff0c;降低项目风险&#xff0c;提高开发效率。反之&#xff0c;项目可能面临需求理解不准确、团队沟通不…

react 基础学习笔记

1.react 语法 ①数据渲染 函数组件将HTML结构直接写在函数的返回值中 JSX只能有一个根元素 JSX插值写法 插值可以使用的位置 1.标签内容&#xff1b; 2.标签属性 JSX 条件渲染&#xff1a;三目运算符&#xff1b; JSX根据数据进行列表渲染&#xff1a;map()方法&#x…

Elastic Stack - FileBeat 入门浅体验

Filebeat 是 Elastic Stack 中的一个轻量级日志转发器&#xff0c;主要用于收集和转发日志数据。Filebeat 作为代理安装在您的服务器上&#xff0c;可以监控您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将其转发到 Elasticsearch 或 Logstash 进行索引。 一…

XCode16中c++头文件找不到解决办法

XCode16中新建Framework&#xff0c;写完自己的c代码后&#xff0c;提示“<string> file not found”等诸如此类找不到c头文件的错误。 工程结构如下&#xff1a; App是测试应用&#xff0c;BoostMath是Framework。基本结构可以参考官方demo&#xff1a;Mix Swift and …

“循环购体系:创新消费回馈模式引领电商新风尚“

各位听众&#xff0c;你们好&#xff0c;我是吴军&#xff0c;今天我想与你们分享一种创新且引人注目的商业模式——循环购体系。这是一种融合了消费回馈与积分制度的新型购物模式&#xff0c;它在顾客与商家之间搭建了一个全新的、互动性强的桥梁。 在循环购体系的运作中&…

云联网对等连接--实现内网互通

云联网 今天给大家介绍一款产品&#xff0c;腾讯云的云联网。 云联网&#xff1a;为您提供云上私有网络间&#xff08;VPC&#xff09;、VPC 与本地数据中心间&#xff08;IDC&#xff09;内网互联的服务&#xff0c;具备全网多点互联、路由自学习、链路选优及故障快速收敛等…

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

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

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