.Net 8 Web API CRUD 操作

本次介绍分为3篇文章: 

1:.Net 8 Web API CRUD 操作
https://blog.csdn.net/hefeng_aspnet/article/details/143228383

2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法
https://blog.csdn.net/hefeng_aspnet/article/details/143229912

3:.NET 8 Web API 中的身份验证和授权
https://blog.csdn.net/hefeng_aspnet/article/details/143231987 

参考文章:

1:Dot Net 8 Web API CRUD 操作
https://medium.com/@codewithankitsahu/net-8-web-api-crud-operations-125bb3083113

2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法
https://medium.com/@codewithankitsahu/implement-entity-framework-a-code-first-approach-in-net-8-api-80b06d219373

3:.NET 8 Web API 中的身份验证和授权
https://medium.com/@codewithankitsahu/authentication-and-authorization-in-net-8-web-api-94dda49516ee

介绍
        在 .NET 8 中使用内存集合创建 CRUD(创建、读取、更新、删除)API 是 Web 开发中的常见场景。在本文中,我们将通过实际用例介绍如何构建完整的 .NET 8 Web API。

先决条件

Visual Studio 或 Visual Studio Code(安装了 .NET 8 SDK)。

什么是 API?

    · API 代表应用程序编程接口。

    · 它定义了与其他软件系统通信时必须遵循的规则。

    · 开发人员公开 API,以便其他应用程序可以通过编程与他们的应用程序进行通信。

什么是 RESTful API?

    · RESTful API 是两个计算机系统用来通过互联网安全地交换信息的接口。

    · 大多数业务应用程序必须与其他内部和第三方应用程序通信才能执行各种任务。

CRUD 操作?

    CRUD 代表“创建、读取、更新和删除”

.Net 8 WEB API
步骤1.打开Visual Studio并点击“创建新项目”。 

第2步:选择“ASP .NET Core Web API”模板,点击“下一步”按钮。 

步骤3.输入“项目名称”并选择“位置”,然后单击“下一步”按钮。 

步骤4

  • 选择 Framework 6.0 或更高版本。我选择的是 .Net 8.0(长期支持)
  • 应该检查“HTTPS 配置”——它将在 HTTPS 协议中运行我们的应用程序。
  • 应该选中“启用开放 API 支持”——它将为您配置 Swagger。
  • 应选中“使用控制器”——这将有助于创建基于控制器的 API。
  • 单击“下一步”继续。

它将生成一个带有预定义 WeatherForecastController API 的 Web API 脚手架。 

步骤5.让我们删除现有的WeatherForecast Controller 并向该项目添加一个新的OurHeroController。

  • 右键单击控制器文件夹(转到打开解决方案资源管理器并选择控制器文件夹)。

选择API -> “API控制器——空”,然后点击“添加”按钮。 

输入控制器名称并单击添加按钮为其生成模板。 

步骤6.让我们将下面的文件夹添加到我们的解决方案中。

  • 模型
  • 服务

右键单击解决方案 -> 添加 -> 新选项

像这样

第七步:在模型文件夹中添加OurHero模型。

选择一个模型文件夹并按 Ctrl +Shift +A 生成一个 C# 类。

或者

右键单击模型文件夹->添加->新项->输入类(模型名称如OurHero.cs)名称并按添加按钮。

// OurHero.cs

namespace DotNet8WebAPI.Model
{
public class OurHero
{
public int Id { get; set; }
public required string FirstName { get; set; }
public string LastName { get; set; } = string.Empty;
public bool isActive { get; set; } = true;
}
}

AddUpdateOurHero.cs 模型用于添加或更新我们的列表。  

//AddUpdateOurHero.cs
namespace DotNet8WebAPI.Model
{
    public class AddUpdateOurHero
    {
        public required string FirstName { get; set; }
        public string LastName { get; set; } = string.Empty;
        public bool isActive { get; set; } = true;
    }

步骤8.创建服务文件。

  • IOurHeroService:接口
  • 在这个文件中,我们将定义我们的Hero业务逻辑。
  • OurHeroService:类,
  • 我们将要实现 IOurHeroService 方法。

// IOurHeroService.cs

using DotNet8WebAPI.Model;

namespace DotNet8WebAPI.Services
{
    public interface IOurHeroService
    {
        List<OurHero> GetAllHeros(bool? isActive);

        OurHero? GetHerosByID(int id);

        OurHero AddOurHero(AddUpdateOurHero obj);

        OurHero? UpdateOurHero(int id, AddUpdateOurHero obj);

        bool DeleteHerosByID(int id);
    }
}


// OurHeroService.cs

using DotNet8WebAPI.Model;

namespace DotNet8WebAPI.Services
{
    public class OurHeroService : IOurHeroService
    {
        private readonly List<OurHero> _ourHeroesList;
        public OurHeroService()
        {
            _ourHeroesList = new List<OurHero>()
            {
                new OurHero(){
                Id = 1,
                FirstName = "Test",
                LastName = "",
                isActive = true,
                }
            };
        }

        public List<OurHero> GetAllHeros(bool? isActive)
        {
            return isActive == null ? _ourHeroesList : _ourHeroesList.Where(hero => hero.isActive == isActive).ToList();
        }

        public OurHero? GetHerosByID(int id)
        {
            return _ourHeroesList.FirstOrDefault(hero => hero.Id == id);
        }

        public OurHero AddOurHero(AddUpdateOurHero obj)
        {
            var addHero = new OurHero()
            {
                Id = _ourHeroesList.Max(hero => hero.Id) + 1,
                FirstName = obj.FirstName,
                LastName = obj.LastName,
                isActive = obj.isActive,
            };

            _ourHeroesList.Add(addHero);

            return addHero;
        }

        public OurHero? UpdateOurHero(int id, AddUpdateOurHero obj)
        {
            var ourHeroIndex = _ourHeroesList.FindIndex(index => index.Id == id);
            if (ourHeroIndex > 0)
            {
                var hero = _ourHeroesList[ourHeroIndex];

                hero.FirstName = obj.FirstName;
                hero.LastName = obj.LastName;
                hero.isActive = obj.isActive;

                _ourHeroesList[ourHeroIndex] = hero;

                return hero;
            }
            else
            {
                return null;
            }
        }
        public bool DeleteHerosByID(int id)
        {
            var ourHeroIndex = _ourHeroesList.FindIndex(index => index.Id == id);
            if (ourHeroIndex >= 0)
            {
                _ourHeroesList.RemoveAt(ourHeroIndex);
            }
            return ourHeroIndex >= 0;
        }
    }
}

在服务文件中,我们使用内存集合来存储所有 _ourHeroesList 数据。 

private readonly List<OurHero> _ourHeroesList;
public OurHeroService()
{
    _ourHeroesList = new List<OurHero>()
    {
        new OurHero(){
        Id = 1,
        FirstName = "Test",
        LastName = "",
        isActive = true,
        }
    };

步骤9.在 Program.cs 文件中将 OurHeroService 服务注册为单例。 

//*********************** Add services to the container.***********************
builder.Services.AddSingleton<IOurHeroService, OurHeroService>();
//*********************** Add services to the container end.*********************** 

在.Net 8中,我们可以注册我们的服务。

  • AddSingleton:应用程序中存在的单个对象
  • AddScoped:一个请求对应一个实例(如果我们多次注入同一个服务,那么它将共享同一个实例。)
  • AddTransient:总是创建一个新实例(如果我们多次注入相同的服务,那么它每次都会提供一个新实例。)

// Program.cs

using DotNet8WebAPI.Services;

var builder = WebApplication.CreateBuilder(args);

//*********************** Add services to the container.***********************
builder.Services.AddSingleton<IOurHeroService, OurHeroService>();
//*********************** Add services to the container end.***********************


builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

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

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

第十步. 在 OurHeroController 中注入 IOurHeroService。

  • 打开 OurHeroController 文件
  • 添加承包商
  • 在 Contractor 中注入 IOurHeroService

// OurHeroController.cs
using DotNet8WebAPI.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace DotNet8WebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class OurHeroController : ControllerBase
    {
        private readonly IOurHeroService _heroService;

        public OurHeroController(IOurHeroService heroService)
        {
            _heroService = heroService;
        }
    }
}

第十一步,在 OurHeroController 中添加获取 API。 

// OurHeroService.cs

[HttpGet]
public IActionResult Get([FromQuery] bool? isActive = null)
{
    return Ok(_heroService.GetAllHeros(isActive));
}

HttpGet.它使该方法成为 GET 方法

  • IActionResult:它表示动作方法的返回类型。
  • [FromQuery]:表示从API查询字符串中获取该值
  • _heroService.GetAllHeros (isActive):从 OurHeroService 获取所有 OurHero 数据
  • Ok(对象):发送带有 200 状态代码的数据。

步骤12.添加其他操作方法

  • 获取 ID — 通过 ID 获取 OurHero
  • 发布 — 添加新的 OurHero
  • Put — 更新 OurHero
  • 删除- 根据 ID 删除 OurHero

using DotNet8API.Model;
using DotNet8API.services;
using Microsoft.AspNetCore.Mvc;

namespace DotNet8API.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class OurHeroController : ControllerBase
    {
        private readonly IOurHeroService _heroService;

        public OurHeroController(IOurHeroService heroService)
        {
            _heroService = heroService;
        }

        [HttpGet]
        public IActionResult Get([FromQuery] bool? isActive = null)
        {
            return Ok(_heroService.GetAllHeros(isActive));
        }

        [HttpGet]
        [Route("{id}")]
        public IActionResult Get(int id)
        {
            var hero = _heroService.GetHerosByID(id);
            if (hero == null)
            {
                return NotFound();
            }
            return Ok(hero);
        }

        [HttpPost]
        public IActionResult Post(AddUpdateOurHero heroObject)
        {
            var hero = _heroService.AddOurHero(heroObject);

            if (hero == null)
            {
                return BadRequest();
            }

            return Ok(new
            {
                message = "Super Hero Created Successfully!!!",
                id = hero!.Id
            });
        }

        [HttpPut]
        [Route("{id}")]
        public IActionResult Put([FromRoute] int id, [FromBody] AddUpdateOurHero heroObject)
        {
            var hero = _heroService.UpdateOurHero(id, heroObject);
            if (hero == null)
            {
                return NotFound();
            }

            return Ok(new
            {
                message = "Super Hero Updated Successfully!!!",
                id = hero!.Id
            });
        }

        [HttpDelete]
        [Route("{id}")]
        public IActionResult Delete([FromRoute] int id)
        {
            if (!_heroService.DeleteHerosByID(id))
            {
                return NotFound();
            }

            return Ok(new
            {
                message = "Super Hero Deleted Successfully!!!",
                id = id
            });
        }
    }
}

第 13 步。运行我们的 API 项目。

Visual Studio

按 F5 键盘快捷键运行我们的应用程序。

DOT NET CLI 命令

  • 在cmd中打开我们的项目
  • 运行“dotnet run”cmd 来启动我们的项目。

Swagger 显示所有 API 列表。

运行获取我们的 ourheros API。

  • 打开“/api/OurHero”
  • 点击“试用”
  • 如果需要,请选择 isActive
  • 点击“执行”按钮发送请求。

概括
        就这样!您已经创建了一个完整的 .NET 8 Web API,用于使用内存数据库进行 CRUD 操作。您现在可以将此 API 集成到您的前端应用程序中。 

 第2篇:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法
https://blog.csdn.net/hefeng_aspnet/article/details/143229912

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

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

相关文章

【LeetCode:264. 丑数 II + 小根堆】

在这里插入代码片 &#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕…

stm32 使用J-Link RTT Viewer打印日志

文章目录 stm32 使用J-Link RTT Viewer一、RTT功能简介二、准备工作安装J-Link软件驱动&#xff1a;获取RTT驱动文件&#xff1a;配置工程&#xff1a; 三、使用RTT打印日志初始化RTT&#xff1a;打印日志&#xff1a;查看日志&#xff1a; 四、高级功能封装print_log函数&…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器&#xff1a; 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

三周精通FastAPI:15 请求文件和同时请求表单+文件

官网文档&#xff1a;请求文件 - FastAPI 请求文件 File 用于定义客户端的上传文件。 from fastapi import FastAPI, File, UploadFileapp FastAPI()app.post("/files/") async def create_file(file: bytes File()):return {"file_size": len(file)}…

直播系统源码技术搭建部署流程及配置步骤

系统环境要求 PHP版本&#xff1a;5.6、7.3 Mysql版本&#xff1a;5.6&#xff0c;5.7需要关闭严格模式 Nginx&#xff1a;任何版本 Redis&#xff1a;需要给所有PHP版本安装Redis扩展&#xff0c;不需要设置Redis密码 最好使用面板安装&#xff1a;宝塔面板 - 简单好用的…

Kafka消费者故障,出现活锁问题如何解决?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka消费者故障&#xff0c;出现活锁问题如何解决&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka消费者故障&#xff0c;出现活锁问题如何解决&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资…

【C++】string类 (模拟实现详解 下)

我们接着上一篇【C】string类 &#xff08;模拟实现详解 上&#xff09;-CSDN博客继续对string模拟实现。从这篇内容开始&#xff0c;string相关函数的实现就要声明和定义分离了。 1.reserve、push_back和append 在string.h的string类里进行函数的声明。 void reserve(size_…

Maven项目报错:invalid LOC header (bad signature)

文章目录 Maven项目报错&#xff1a;invalid LOC header (bad signature)1. Maven项目加载或Pom.Xml刷新后仍出现如下错误2. 解决方法 Maven项目报错&#xff1a;invalid LOC header (bad signature) 1. Maven项目加载或Pom.Xml刷新后仍出现如下错误 错误提示&#xff1a; in…

【Spring MVC】请求参数的获取

我的主页 1. 获取 URL 中的参数 获取 URL 中的参数是通过 PathVariable 注解实现的 RequestMapping("/article/{articleId}") public String method12(PathVariable("articleId") String articleId){return "接收到参数articleId: " articleI…

书生第四期作业:L0G4000 任务作业

模型下载 在github-codespace 登录codespace安装依赖&#xff1a; 运行下载的py文件&#xff0c;下载模型配置文件&#xff0c; 下载完成 在intern-studio开发机 下载配置文件 下载完成

2024系统架构师---真题考试知识点

1.逻辑地址的构成是“逻辑地址&页内地址”&#xff0c;而物理地址的构成“物理块号&页内地址”&#xff0c;因此只要找出逻辑地址中那几位表示逻辑页号基本就完成了。页内大小4k4*2的10次方2的12次方&#xff0c;可以得出页内地址占12位&#xff0c;因此1B1AH的后12位&…

群控系统服务端开发模式-系统架构图

一、开发服务(1.0版本)&#xff1a; 平台前端服务、平台api接口服务、国外api处理服务&#xff1b; 二、开发服务(2.0版本)&#xff1a; 国内客户端前端服务、国内客户端api接口服务、国外客户端前端服务、国外客户端api接口服务&#xff1b; 三、运行服务(1.0版本)&#xff…

JavaWeb合集22-Apache POI

二十二、Apache POI Apache POI是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用POI在Java 序中对Miscrosoft Office各种文件进行读写操作。一般情况下&#xff0c;POI都是用于操作Excel文件。 使用场景&#xff1a;银行网银系统导出…

【Android】Kotlin教程(2)

文章目录 1.空安全2.let安全调用3.非空断言操作符!!4.空合并操作符 ?:5.异常6.先决条件函数7.substring8.split函数9.replace10.字符串比较11.安全转换函数12.标准库函数1.apply2.run3.with4.also5.takeIf6.takeUnless 1.空安全 为了避免NullPointerException&#xff0c;Kot…

【2024|滑坡数据集论文解读3】CAS滑坡数据集:用于深度学习滑坡检测的大规模多传感器数据集

【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用于深度学习滑坡检测的大规模多传感器数据集 文章目录 【2024|滑坡数据集论文解读3】CAS滑坡数据集&#xff1a;用…

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

西瓜书《机器学习》符号表KaTex表示

写这篇post的缘故是最近整理机器学习的相关公式&#xff0c;经常要用到KaTex, 但网络上搜索到的西瓜书符号表的表示有些并不准确或不严谨&#xff0c;本着严谨治学的态度&#xff0c;整理了一下符号表的KaTex表示&#xff0c;希望有所帮助,整理过程中参考了《南瓜书》和 KaTex官…

Flutter TextField和Button组件开发登录页面案例

In this section, we’ll go through building a basic login screen using the Button and TextField widgets. We’ll follow a step-bystep approach, allowing you to code along and understand each part of the process. Let’s get started! 在本节中&#xff0c;我们…

软件系统建设方案书(word参考模板)

1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…