.Net 8 Web API CRUD 操作

ops/2024/10/29 22:37:41/

本次介绍分为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.ppmy.cn/ops/129422.html

相关文章

使用pytest单元测试框架执行单元测试

Pytest 是一个功能强大且灵活的 Python 单元测试框架&#xff0c;它使编写、组织和运行测试变得更加简单。以下是 Pytest 的一些主要特点和优点&#xff1a; 简单易用&#xff1a;Pytest 提供了简洁而直观的语法&#xff0c;使编写测试用例变得非常容易。它支持使用 assert 语…

【无人机设计与控制】基于Astar算法无人机路径规划,优化路径平滑

摘要 本文提出了一种基于A算法的无人机路径规划方法&#xff0c;并通过路径平滑优化提升路径的可行性和安全性。传统A算法在生成路径时&#xff0c;常因路径节点分布不规则导致路径不平滑&#xff0c;影响无人机的飞行效率和安全性。本文通过引入贝塞尔曲线对A*算法生成的路径…

JavaWeb合集16-JWT令牌验证

十六、JWT令牌验证 JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络上安全传输信息的紧凑、URL 安全的表示形式。它是一种无状态的身份验证机制&#xff0c;常用于现代Web应用和服务之间传递用户身份信息或授权数据。JWT 设计用于在各方之间安全地传输信息&#x…

安全见闻8-9

声明 学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 安全见闻8&#xff1a;量子计算 一&#xff0c;量子计算原理概述&#xff1a; 量子概念的产生&#xf…

Navict的入门使用

目录 Navicat主页面 功能简介​编辑 连接数据库 Navicat 连接 MySQL 数据库 数据库备份 Navicat主页面 功能简介 连接数据库 Navicat 连接 MySQL 数据库 使用 Navicat 连接 MySQL 数据库是一个相对简单的过程。以下是详细的步骤&#xff1a; 1. 下载并安装 Navicat 首先…

C++基础:vector

在编写程序之前&#xff0c;我们首先要准备好相关的数据。比如说需要准备好一组电话号码&#xff0c;一球队的队员表&#xff0c;一个课表等关于这些相同类型的数据&#xff0c;C语言是通过数组来实现的。 int arry[10] {0,1,2,3,4,5,6,7,8,9};而在C当中处理这类数据是通过vec…

C#自定义事件的案例

方法一&#xff0c;详细的声明 namespace HelloWorldConsole {internal class Program{static void Main(string[] args){Customer customer new Customer();Waiter waiter new Waiter();customer.Order waiter.Action;customer.Action();}}public class OrderEventArgs : …

用Rust从头写CAD】第一章 Rust基础 第二节 第一个Rust程序

文章目录 [TOC](文章目录) 1、新建名称为“cad”的项目2、编辑器打开名称为“cad”的项目3、使用编辑器4、运行程序 Rust自带管理工具cargo&#xff0c;它让我们新建项目更加便捷。 1、新建名称为“cad”的项目 请在文件夹中选择项目的主目录 如上图&#xff0c;我选的路径是…