.Net 8 Web API CRUD 操作

介绍

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

先决条件

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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

示例代码:https://download.csdn.net/download/hefeng_aspnet/91997370

下一篇:https://blog.csdn.net/hefeng_aspnet/article/details/151990934

什么是 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.**让我们将以下文件夹添加到我们的解决方案中。

  • 模型
  • 服务

右键单击解决方案->添加->New Forder

像这样

**步骤7.**在模型文件夹中添加OurHero模型。

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

或者

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

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 模型用于添加或更新我们的英雄列表。

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:**接口
  • 在这个文件中,我们将定义我们的英雄业务逻辑。
  • **OurHeroService:**类,
  • 我们将实现 IOurHeroService 方法。
cs 复制代码
// 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);
    }
}
cs 复制代码
// 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 数据。

cs 复制代码
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();

**步骤 10.**在 OurHeroController 中注入 IOurHeroService。

  • 打开 OurHeroController 文件
  • 添加承包商
  • 在 Contractor 中注入 IOurHeroService
cs 复制代码
// 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;
        }
    }
}

**步骤 11.**在 OurHeroController 中添加获取 API。

cs 复制代码
// 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(object):**发送状态码为200的数据。

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

  • 获取 ID --- 通过 ID 获取 OurHero
  • 发布 --- 添加新的 OurHero
  • 放 --- 更新 OurHero
  • 删除-根据ID删除OurHero
cs 复制代码
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 列表。

运行获取我们的英雄 API。

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

概括

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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
小虾爬滑丫爬6 小时前
.net8发布Linux 版本程序,部署到Linux服务器上
linux·.net8·打包部署
小丫头呀23 天前
.NET8 通过自定义类映射appsettings.json 文件某个节点的配置
json·.net·.net8
csdn_aspnet1 个月前
使用 Entity Framework Code First 方法创建 ASP.NET Core 5.0 Web API
.netcore·webapi
yswenli2 个月前
使用Cyclops.PdfKit根据pdf模板生成pdf文件
docker·pdf·.net8
SabreWulf20202 个月前
Ubuntu 20.04手动安装.NET 8 SDK
linux·ubuntu·avalonia·.net8
csdn_aspnet2 个月前
在 ASP.NET 8 WebAPI 中使用不同的提供程序验证多个令牌(Token)及常见问题解答
token·.net8
csdn_aspnet2 个月前
.NET 8 集成 JWT Bearer Token
jwt·.net8
wstcl3 个月前
安卓app、微信小程序等访问多个api时等待提示调用与关闭问题
android·微信小程序·webapi
ggtc3 个月前
为workflow-core扩展外抛事件
c#·webapi·workflow-core