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

文章目录

  • 系列文章
  • 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;}#endregionpublic 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());}#endregionpublic 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.hqwc.cn/news/23365.html

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

相关文章

【5G PHY】5G 调制与编码策略(MCS)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Redis对象结构 — RedisObject

目录 Redis 键值对数据库的全过程​编辑 RedisObject结构体 Redis的encoding编码方式 type对应的数据对象类型 Redis 键值对数据库的全过程 redisDb 结构&#xff0c;表示 Redis 数据库的结构&#xff0c;结构体里存放了指向了 dict 结构的指针&#xff1b;dict 结构&#…

Day_63-65 集成学习之 AdaBoosting

目录 Day_63-65 一. 基本概念介绍 1. 集成学习 2. 弱分类器与强分类器 二. AdaBoosting算法 1. AdaBoosting算法框架介绍 2. AdaBoosting算法过程 三. 代码的实现过程 1. WeightedInstances类 2. 构造弱分类器的StumpClassifier类和抽象类SimpleClassifier 3. 主类Booster的…

Unity 之 超级详细的隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一&#xff0c;平台测试隐私问题二&#xff0c;解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三&#xff0c;解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

小红书Java后端一面,被问麻了

今天分享一篇小红书 2 年社招 Java 后端一面的面经&#xff0c;面试的风格是从一个知识一层一层深入问到底层。 从 Java IO&#xff0c;问到 socket 底层。从 Java 内存&#xff0c;问到操作系统内存。所以学习知识的时候&#xff0c;不要只看八股文&#xff0c;还是需要从点到…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务192.168.161.131后端服务器1httpd,80端口192.168…

Vue计算属性:简化数据处理和视图更新的利器

一、计算属性的基本使用 计算属性&#xff1a;一个特殊属性&#xff0c;值依赖于另外一些数据动态计算出来。&#x1f6a9;&#x1f6a9;&#x1f6a9;计算属性特点&#xff1a;函数内使用的变量改变&#xff0c;重新计算结果返回。&#x1f4a3;&#x1f4a3;&#x1f4a3;注…

springcache的使用(小白也看得懂)

简介 SpringCache整合Redis可以使用Spring提供的Cacheable注解来实现对Redis的缓存操作。使用这种方式可以轻松地在应用程序中启用缓存&#xff0c;并且不需要手动编写访问Redis的代码。在配置文件中需要配置Redis的连接信息以及缓存管理器。使用这种方式可以做到轻松配置&…

满汉楼项目

满汉楼项目 1. 满汉楼介绍 满汉楼是一个综合餐饮管理系统&#xff0c;其主要分为&#xff1a; 人事登记&#xff1a;各部门人员信息登录管理&#xff1a;员工号、姓名、职位、密码菜谱价格&#xff1a;菜谱及价格报表统计&#xff1a;统计销售额成本及库房&#xff1a;名称注…

ES 跨集群搜索 Cross-cluster search (CCS)

跨集群查询 跨集群搜索(cross-cluster search)使你可以针对一个或多个远程集群运行单个搜索请求。 例如&#xff0c;你可以使用跨集群搜索来筛选和分析存储在不同数据中心的集群中的日志数据。 环境准备 角色IP系统dev172.16.122.244CentOS 7.9prod172.16.122.245CentOS 7.9 ES…

单元测试用例到底该如何设计?

目录 前言 使用参数方法创建测试用例 使用执行路径方法创建测试用例 总结 前言 最近一些大公司在进行去测试化的操作&#xff0c;这一切的根源大概可以从几年前微软一刀切砍掉所有内部正式的测试人员开始说起&#xff0c;当时微软内部的测试工程师有一部分转职成了开发工程…

简单的聊一聊如何用CSS制作一个专业的头部页眉(Headers)

一个吸引人的网页页眉对于给访问者留下良好的第一印象至关重要。一个设计精良的页眉不仅能够吸引注意力&#xff0c;还能为整个网站设定基调。借助CSS&#xff0c;创建现代化和视觉吸引力的网页页眉比以往任何时候都更加容易。 在本文中&#xff0c;我们将探索一些基本的技巧和…