asp.net core框架搭建1-搭建webapi,对数据增删改查接口模板(附源码)

news2024/10/7 0:04:45

文章目录

  • 系列文章
  • 1.项目搭建
    • 1.1 新建Asp.net core webapi项目
    • 1.2 配置连接Mysql
    • 1.3 实现对mysql数据库的数据增删改查,接口
      • 1.3.1 根据id查询数据
      • 1.3.2 根据用户名模糊查询数据,并分页
      • 1.3.3 新增用户数据
      • 1.3.4 修改用户数据
      • 1.3.5 根据ID删除数据
      • 1.3.6 接口运行效果
  • 2.过程中知识点和涉及到的问题
    • 2.1 自定义路由
    • 2.2 获取可配置的全局变量
  • 源码下载

作者:xcLeigh
文章地址:https://blog.csdn.net/weixin_43151418/article/details/131458922


asp.net core 框架搭建2-搭建webapi ,本文章介绍asp.net core webapi框架搭建,然后开发增删改查和工具接口,将一步步带着大家,实现目标。所有操作过程将展现在本篇文章,下面咋们一起来实现它吧。

系列文章

  • asp.net core 框架搭建1-搭建webapi
  • asp.net core 框架搭建2-搭建MVC后台管理系统
  • asp.net core 框架搭建3-搭建个人博客,公司官网
  • asp.net core 框架搭建4-部署IIS/nguix

1.项目搭建

1.1 新建Asp.net core webapi项目

  • 第一步 新建ASP.NET Core Web API ,选择下一步

在这里插入图片描述

  • 第二步 配置新项目,填写自己的项目名称,选择下一步

在这里插入图片描述

  • 第三步 其他信息,默认就行,创建项目

在这里插入图片描述

  • 第四步 查看项目效果

新建完成后,整体效果图
在这里插入图片描述

第五步 运行项目(方式1:直接按F5;方式2:vs2022工具点三角启动,在浏览器中查看),查看效果

界面效果
在这里插入图片描述

接口返回数据效果
在这里插入图片描述
简单的框架搭建起来了,下面咋们在里面开始操作数据了。

1.2 配置连接Mysql

  • 第一步 通过Nuget引用MySqlConnector

新建表sys_user

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `tel` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `addr` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  • 第二步 appsettings.json配置数据库连接字符串
"ConnectionStrings": {
    "MysqlConnection": "Data Source=IP地址;Database=数据库名称;User ID=用户名;Password=密码;port=端口;sslmode=none;CharSet=utf8;pooling=true;"
  },
  • 第三步 封装MySqlConnection连接类

program.cs中注入数据库连接串

//Transient:每次从容器 (IServiceProvider)中获取的时候都是一个新的实例
//Singleton:每次从同根容器中(同根IServiceProvider)获取的时候都是同一个实例
//Scoped:每次从同一个容器中获取的实例是相同的
builder.Services.AddTransient<AppDb>(_ => new AppDb(builder.Configuration.GetConnectionString("MysqlConnection")));

从配置文件读取ConnectionString,创建连接对象。

public class AppDb : IDisposable
{
     public MySqlConnection Connection;
     public AppDb(string connectionString)
     {
         Connection = new MySqlConnection(connectionString);
     }
     public void Dispose()
     {
         Connection.Close();
     }
 }
  • 第四步 新建数据实体类

引用数据库实体类

public class UserInfoModel
{
    [JsonIgnore]
    public AppDb Db { get; set; }
    public UserInfoModel(AppDb db = null)
    {
        Db = db;
    }
    public int Id { get; set; }
    public string UserName { get; set; }
    public string PassWord { get; set; }
    public string Tel { get; set; }
    public string Email { get; set; }
    public string Addr { get; set; }
}

普通参数实体类

public class UserInfo
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string PassWord { get; set; }
    public string Tel { get; set; }
    public string Email { get; set; }
    public string Addr { get; set; }
}
  • 第五步 操作数据类

这里面集中了对数据库的增上改查,分页,根据条件查询等方法,可以直接调用。

//操作数据库
public class AppDbOper
{
       public readonly AppDb Db;
       public AppDbOper(AppDb db)
       {
           Db = db;
       }

       #region 新增修改
       public async Task<int> InsertAsync(UserInfo userInfo)
       {
           var cmd = Db.Connection.CreateCommand() as MySqlCommand;
           cmd.CommandText = @"INSERT INTO `sys_user` (`username`,`password`,`tel`,`email`,`addr`)VALUES(@username,@password,@tel,@email,@addr);";
           BindParams(cmd, userInfo);
           int num=await cmd.ExecuteNonQueryAsync();
           int id = (int)cmd.LastInsertedId;
           return num;
       }
       public async Task<int> UpdateAsync(UserInfo userInfo)
       {
           var cmd = Db.Connection.CreateCommand() as MySqlCommand;
           cmd.CommandText = @"UPDATE `sys_user` SET `username`=@username,`password`=@password,`tel`=@tel,`email`=@email,`addr`=@addr WHERE `Id`=@id;";
           BindParams(cmd, userInfo);
           BindId(cmd, userInfo.Id);
           int num = await cmd.ExecuteNonQueryAsync();
           return num;
       }
       private void BindId(MySqlCommand cmd,int id)
       {
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@id",
               DbType = DbType.Int32,
               Value = id,
           });
       }
       private void BindParams(MySqlCommand cmd,UserInfo userInfo)
       {
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@password",
               DbType = DbType.String,
               Value = userInfo.PassWord,
           });
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@username",
               DbType = DbType.String,
               Value = userInfo.UserName,
           });
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@tel",
               DbType = DbType.String,
               Value = userInfo.Tel,
           });
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@email",
               DbType = DbType.String,
               Value = userInfo.Email,
           });
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@addr",
               DbType = DbType.String,
               Value = userInfo.Addr,
           });
       }
       #endregion
       #region 删除
       public async Task<int> DeleteAllAsync(string id)
       {
           //var txn = await Db.Connection.BeginTransactionAsync();
           int num = 0;
           try
           {
               var cmd = Db.Connection.CreateCommand() as MySqlCommand;
               cmd.CommandText = @"DELETE FROM `sys_user` where id=@id";
               cmd.Parameters.Add(new MySqlParameter
               {
                   ParameterName = "@id",
                   DbType = DbType.Int32,
                   Value = id,
               });
               num =await cmd.ExecuteNonQueryAsync();
               //await txn.CommitAsync();
           }
           catch
           {
               //await txn.RollbackAsync();
               //throw;
           }
           return num;
       }
       #endregion
       public async Task<UserInfoModel> FindOneAsync(int id)
       {
           var cmd = Db.Connection.CreateCommand() as MySqlCommand;
           cmd.CommandText = @"SELECT `Id`, `username`, `password`, `tel`, `email`, `addr` FROM `sys_user` WHERE `Id` = @id";
           cmd.Parameters.Add(new MySqlParameter{
               ParameterName = "@id",
               DbType = DbType.Int32,
               Value = id,
           });
           var result = await ReadAllAsync(await cmd.ExecuteReaderAsync());
           return result.Count > 0 ? result[0] : null;
       }

       #region 分页
       public async Task<int> getListCount(string username) {
           int num = 0;
           var cmd = Db.Connection.CreateCommand();
           cmd.CommandText = @"select count(*) num from `sys_user` where username like @username";
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@username",
               DbType = DbType.String,
               Value = "%" + username + "%",
           });

           var reader = await cmd.ExecuteReaderAsync();
           while (reader.Read())
           {
               if (!reader.IsDBNull(reader.GetOrdinal("num")))
               {
                   num = Convert.ToInt32(reader[0]);
               }
               else
               {
                   num = 0;
               }
           }
           return num;
       }
       public async Task<List<UserInfoModel>> ListPostsAsync(int page, int limit, string username)
       {
           //limit  页大小  page 第几页
           int _startPage = limit * (page-1);
           int _endPage = limit * (page-1)+limit;
           var cmd = Db.Connection.CreateCommand();
           cmd.CommandText = @"SELECT `Id`, `username`, `password`, `tel`, `email`, `addr` FROM `sys_user`  where username like @username ORDER BY `Id` DESC LIMIT @start,@end;";
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@username",
               DbType = DbType.String,
               Value = "%"+username+"%",
           });
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@start",
               DbType = DbType.Int32,
               Value = _startPage,
           });
           cmd.Parameters.Add(new MySqlParameter
           {
               ParameterName = "@end",
               DbType = DbType.Int32,
               Value = _endPage,
           });
           return await ReadAllAsync(await cmd.ExecuteReaderAsync());
       }
       #endregion

       public async Task<List<UserInfoModel>> LatestPostsAsync()
       {
           var cmd = Db.Connection.CreateCommand();
           cmd.CommandText = @"SELECT `Id`, `username`, `password`, `tel`, `email`, `addr` FROM `sys_user` ORDER BY `Id` DESC LIMIT 10;";
           return await ReadAllAsync(await cmd.ExecuteReaderAsync());
       }

       private async Task<List<UserInfoModel>> ReadAllAsync(DbDataReader reader)
       {
           var posts = new List<UserInfoModel>();
           using (reader)
           {
               while (await reader.ReadAsync())
               {
                   var post = new UserInfoModel(Db)
                   {
                       Id = await reader.GetFieldValueAsync<int>(0),
                       UserName = await reader.GetFieldValueAsync<string>(1),
                       PassWord = await reader.GetFieldValueAsync<string>(2),
                       Tel = await reader.GetFieldValueAsync<string>(3),
                       Email = await reader.GetFieldValueAsync<string>(4),
                       Addr = await reader.GetFieldValueAsync<string>(5)
                   };
                   posts.Add(post);
               }
           }
           return posts;
       }
   }

1.3 实现对mysql数据库的数据增删改查,接口

1.3.1 根据id查询数据

#region 根据id查询数据
[HttpGet]
public async Task<ApiResponse<UserInfoModel>> getUserInfoById(int id)
{

    using (_db)
    {
        await _db.Connection.OpenAsync();
        var query = new AppDbOper(_db);
        var result = await query.FindOneAsync(id);
        if (result == null)
            return new ApiResponse<UserInfoModel>(200, "暂无数据", null);

        return new ApiResponse<UserInfoModel>(200, "请求成功", result);
    }

}
#endregion

1.3.2 根据用户名模糊查询数据,并分页

  • page 第几页
  • limit 页条数
  • username 根据用户名模糊查询
#region 根据条件查询数据,分页
[HttpGet]
public async Task<ApiResponse<List<UserInfoModel>>> getUserInfoPage(int page, int limit, string? username)
{
    using (_db)
    {
        await _db.Connection.OpenAsync();
        var query = new AppDbOper(_db);
        int num = await query.getListCount(username);
        await _db.Connection.CloseAsync();
        await _db.Connection.OpenAsync();
        var result = await query.ListPostsAsync(page,limit,username);
        if (result == null)
            return new ApiResponse<List<UserInfoModel>>(200, num+"", null);

        return new ApiResponse<List<UserInfoModel>>(200, num + "", result);
    }

}
#endregion

1.3.3 新增用户数据

#region 新增数据
[HttpGet]
public async Task<ApiResponseNull> addUserInfo([FromQuery] UserInfo userInfo)
{

    using (_db)
    {
        await _db.Connection.OpenAsync();
        var query = new AppDbOper(_db);
        var result = await query.InsertAsync(userInfo);
        if (result >0)
            return new ApiResponseNull(200, "请求成功");

        return new ApiResponseNull(200, "请求失败");
    }

}
#endregion

1.3.4 修改用户数据

#region 修改用户数据
[HttpGet]
public async Task<ApiResponseNull> updateUserInfo([FromQuery] UserInfo userInfo)
{

    using (_db)
    {
        await _db.Connection.OpenAsync();
        var query = new AppDbOper(_db);
        var result = await query.UpdateAsync(userInfo);
        if (result > 0)
            return new ApiResponseNull(200, "请求成功");

        return new ApiResponseNull(200, "请求失败");
    }

}
#endregion

1.3.5 根据ID删除数据

#region 根据ID删除数据
[HttpGet]
public async Task<ApiResponseNull> delUserInfo(string id)
{

    using (_db)
    {
        await _db.Connection.OpenAsync();
        var query = new AppDbOper(_db);
        var result = await query.DeleteAllAsync(id);
        if (result > 0)
            return new ApiResponseNull(200, "请求成功");

        return new ApiResponseNull(200, "请求失败");
    }

}
#endregion

1.3.6 接口运行效果

可以直接在这个页面上,测试自己的接口,每个接口都测试通过。

在这里插入图片描述

至此,webapi对数据的增删改查就实现了,恭喜你。

2.过程中知识点和涉及到的问题

2.1 自定义路由

[Route("[controller]")]

//默认路径,如果有多个action会冲突,所以改成这种

[Route("api/[controller]/[action]")]

访问地址

https://localhost:端口/api/控制器/方法

2.2 获取可配置的全局变量

appsettings.json配置全局变量

"ItemName": "xcSharpApi",
"MySettingValue": {
  "ItemAddr": "/api/v1/",
  "ItemTime": "60"
}

Controller里面调用

public class XcsharpController : ControllerBase
{
    public readonly AppDb Db;
    private readonly IConfiguration _configuration;
    public XcsharpController(AppDb db, IConfiguration configuration)
    {
        Db = db;
        _configuration = configuration;
    }
    #region 获取系统配置信息

    /// <summary>
    /// 获取系统配置信息
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    public async Task<ApiResponseNull> getSysInfo()
    {
        string name = "";
        try
        {
            name = _configuration["ItemName"];
            //name = _configuration.GetSection("MySettingValue")["ItemAddr"];
        }
        catch (Exception e)
        {
            name = e.Message;
        }
        return new ApiResponseNull(200, name);
    }
    #endregion
}

源码下载

asp.net core框架搭建1-搭建webapi,对数据增删改查模板(源码) 点击下载
在这里插入图片描述


     💢 关注博主 带你实现畅游前后端

     🏰 加入社区 带你体验马航不孤单

     💯 神秘个人简介 带你体验不一样得介绍

     💘 为爱表白 为你那个TA,体验别致的浪漫惊喜

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有),https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/131458922(防止抄袭,原文地址不可删除)

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

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

相关文章

针对工业网络攻击的五个关键控制措施

人们普遍持有一种过时的误解&#xff0c;认为成功的网络攻击只会造成信息和数据损坏或窃取信息和数据。 但随着互联性的增强和物联网的兴起&#xff0c;存在一种不同类型的网络威胁&#xff0c;其动机更加险恶&#xff0c;对关键民用基础设施造成物理损害&#xff0c;并可能造…

VTS表格数据查看与转换

说明 vts是由formula one生成的文件后缀名&#xff0c;它兼容中文&#xff0c;具备类似EXCEL的功能&#xff1a;如格式编排、制作表格线、移动和复制单元格、单元格的计算、画简单框图等等。 查看与转换 直接执行脚本&#xff0c;自动注册ttf16.OCX&#xff0c;打开TTF1.ex…

Java版本企业电子招投标采购系统源码——功能模块功能描述

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

第十一章:C语言数据结构与算法初阶之排序

系列文章目录 文章目录 系列文章目录前言排序的概念及其运用排序的概念常见的排序算法 常见排序算法的实现1.直接插入排序2. 希尔排序&#xff08;缩小增量排序&#xff09;3. 直接选择排序4. 堆排序5. 冒泡排序6. 快速排序将区间按照基准值划分为左右两半部分的常见方式&#…

为Kubernetes(k8s)集群安装仪表盘(Dashboard)

为Kubernetes集群安装仪表盘 文档说明部署仪表盘(Dashboard UI)访问 Dashboard 用户界面 文档说明 对应本片文章的视频教程地址&#xff1a;https://www.bilibili.com/video/BV1MF41197RS/?vd_source98deeeab6739fa30792cfcffa994b50e 在之前的文章当中我们搭建了一个kubern…

Spring接收前端传递数据的方式

搭建项目 然后点击下一步完成即可搭建成功 在pom文件中导入lombok的jar包,帮助我们快速创建实体类 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version> </dependency&…

腾讯云服务器CPU处理器大全_性能测评

腾讯云服务器CPU采用什么处理器型号&#xff1f;主频睿频多少&#xff1f;腾讯云服务器CPU性能如何&#xff1f;云服务器CVM规格不同CPU型号也不同&#xff0c;轻量应用服务器的CPU处理器性能如何&#xff1f;腾讯云服务器网分享腾讯云服务器CPU处理器大全&#xff1a; 目录 …

Win10+Anaconda+RTX3070+Pytorch-GPU深度学习环境搭建

一、CUDA安装 1. 查询CUDA driver版本&#xff1a; 2. 下载并安装&#xff1a; CUDA Toolkit Archive | NVIDIA DeveloperPrevious releases of the CUDA Toolkit, GPU Computing SDK, documentation and developer drivers can be found using the links below. Please sele…

MFC第十五天 HWND与CWnd对象之间的转换、CWnd类简介(补充)、员工管理系统登录界面眼睛捕获(补充)

文章目录 HWND与CWnd对象之间的转换CWnd类简介&#xff08;补充&#xff09;cwnd系统函数Coordinate Mapping Functions 坐标系转换窗口树 Window tree access计时器管理Window Access Functions 窗口访问功能Window Text Functions 窗口文本函数Window State FunctionsCMenu F…

matlab将0 1矩阵显示为黑白图像

解决方法 clear clc pattern cell2mat(struct2cell(load("pattern"))); pic1 squeeze(pattern(1:64,:,:,:)); pic1 logical(permute(pic1, [2,3,1])); temp pic1(:,:,1); imshow(pic1(:,:,1));显示效果 test int8(rand(30,30)); imshow(logical(test));本来想…

CANoe运行时改变系统变量的值的几种方式

在CANoe运行时,想要随时改变系统变量的值为任意值,怎么办?(这里的值指的是数值) 我们在CANoe工程上创建一个系统变量: 改变系统变量的值,我们第一时间想到的是在CAPL中用代码实现: on key a {@sysvar::ControlPanel::EngineSpeed = 10; }通过一个按键’a’的事件程序…

前端选择时间范围关联日期快速查询

效果图 html部分 <div class"select-list"><ul><li><label>时间&#xff1a;</label><select id"timeInterval"><option value"1">自定义</option><option value"2">当天<…

手机切换ip地址会遇的问题以及解决方法汇总

手机切换IP地址是一种常见的操作&#xff0c;它可以帮助用户解决一些网络问题&#xff0c;提高网络连接速度&#xff0c;或者绕过某些限制。然而&#xff0c;在进行IP地址切换时&#xff0c;用户可能会遇到一些问题。本文将详细介绍手机切换IP地址可能遇到的问题&#xff0c;并…

一、rocketmq整体架构及nameServer源码分析

RocketMQ源码深入剖析 1 RocketMQ介绍 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术&#xff0c;自主研发的云正式商用的专业消息中间件&#xff0c;既可为分布式应用系统提供异步解耦和削峰填谷的能力&#xff0c;同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠…

前端Vue仿美团地址管理列表组件

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

将Xvfb和Chrome封装到Docker镜像中并执行java程序

docker pull ubuntu:22.04docker run -itd --net host -v /home/:/home ubuntu:22.04 进入容器 docker exec -it 8203e24ed bash apt-get update apt-get install xvfb apt-get install chromium-browser apt install chromium-chromedriver apt install openjdk-11-jdk …

webpack打包

webpack打包 1、webpack再次打包2、webpack的入口和出口 1、webpack再次打包 背景&#xff1a;代码增加之后&#xff0c;如何打包呢&#xff1f; 1、确保在src/index.js引用和使用 2、重新执行yarn build打包命令 2、webpack的入口和出口 1、新建webpack.config.js配置文件 …

五、Spring 注解开发

文章目录 一、使用注解开发的环境准备二、Spring 框架核心注解学习2.1 Component2.1.1 通过注解来控制 Bean 的作用域&#xff08;Scope&#xff09; 2.2 Component 的派生注解&#xff08;对应这 web 开发的三层架构分层&#xff09;2.2.1 Repositor2.2.2 Service2.2.3 Contro…

6.2.6 网络基本服务----电子邮件系统(E-mail)

6.2.6 网络基本服务----电子邮件系统&#xff08;E-mail&#xff09; 电子邮件系统是因特网上使用的最多且最受用户欢迎的一种应用 电子邮件系统包括用户代理和邮件服务器&#xff0c;提供收发邮件、邮件传送服务&#xff0c;邮件被传送到收信人邮件服务器的收信人信箱中&…

这所C9考数二英二!但409分被刷,387分直接放弃复试!

一、学校及专业介绍 西安交通大学简称“西安交大”&#xff0c;位于陕西省西安市&#xff0c;是中华人民共和国教育部直属的综合性研究型全国重点大学&#xff0c;由教育部、陕西省与国家国防科技工业局共建&#xff0c;国家“双一流”建设高校&#xff0c;首批进入国家“211工…