net Core做一个webApi的简单实例

用NetCore 和Dapper 和mySql做一个简单的实例,

一准备工作

1:VS2017+windos系统,也可以用其他的操作系统和工具

2:一台Cenetos的虚拟机或者虚拟机

二:开始

1:用微软官方的netCore的ToDo项目改造,项目的主体结构如下图,源连接

https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-web-api

 

1:打开Nuget控制台,安装 MySQL官方.NET Core驱动,并且支持 EF Core

 >Install-Package SapientGuardian.MySql.Data -Pre

2:打开Nuget控制台,安装Dapper

>Install-Package Dapper -Pre

3:在Models文件夹下新建ToDoItem 的实体

 public class ToDoItem{[Required]public string ID { get; set; }[Required]public string Name { get; set; }[Required]public string Notes { get; set; }public bool Done { get; set; }}

4:在appsettings.json里面配置MySql的数据库连接字符串,然后点开appsettings.json的属性将“复制到输出目录”项的值改为“始终复制”,

SslMode=none的作用是解决连接的时候报SSL错误的
  "ConnectionStrings": {"SqlServerConnection": "Server=(LocalDb)\\MSSQLLocalDB, Database=test","MySqlConnection": "Server=自己的服务器;Database=test;User ID=root;Password=111111;SslMode=none"}

 5:在Common下面新建一个AppConfigurtaionServices的类,用于读取appsettings.json里面的连接字符串(appsettings.json属性如果没有选中始终复制,在代码运行的时候,

IConfiguration 会报错

)

public class AppConfigurtaionServices{public static IConfiguration Configuration { get; set; }static AppConfigurtaionServices(){Configuration = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true }).Build();}}

6:新建一个Interfaces文件夹,然后下面建一个IToDoRepository的接口类

 public interface IToDoRepository{bool DoesItemExist(string id);IEnumerable<ToDoItem> All();ToDoItem Find(string id);int Insert(ToDoItem item);int Update(ToDoItem item);int Delete(string id);}

  

7:新建一个Services然后下面新建ToDoRepository类 是我们的数据仓储类 记得要引用(using Dapper;和 using MySql.Data.MySqlClient;)

 public class ToDoRepository : IToDoRepository{private  static  string DefaultSqlConnectionString = "";public ToDoRepository(){DefaultSqlConnectionString = AppConfigurtaionServices.Configuration.GetConnectionString("MySqlConnection"); }public static IDbConnection GetSqlConnection(string sqlConnectionString = null){if (string.IsNullOrWhiteSpace(sqlConnectionString)){sqlConnectionString = DefaultSqlConnectionString;}IDbConnection conn = new MySqlConnection(sqlConnectionString);conn.Open();return conn;}/// <summary>/// 获取全部/// </summary>/// <returns></returns>public IEnumerable<ToDoItem> All(){using (IDbConnection conn = GetSqlConnection()){string strsql = "select * from ToDoItem";return conn.Query<ToDoItem>(strsql, null);}}/// <summary>/// 查询是否存在/// </summary>/// <param name="id"></param>/// <returns></returns>public bool DoesItemExist(string id){using (IDbConnection conn = GetSqlConnection()){int cout = conn.Query<int>("select count(*) from ToDoItem where  ID=@ID", new { ID = id }).FirstOrDefault();if (cout > 0)return true;elsereturn false;}}/// <summary>/// 删除/// </summary>/// <param name="id"></param>/// <returns></returns>public int Delete(string id){using (IDbConnection conn = GetSqlConnection()){string strsql = "DELETE from ToDoItem where ID=@ID";return conn.Execute(strsql, new { ID = id });}}/// <summary>/// 查询整个对象/// </summary>/// <param name="id"></param>/// <returns></returns>public ToDoItem Find(string id){using (IDbConnection conn = GetSqlConnection()){string strsql = "select * from  ToDoItem where ID=@ID";return conn.Query<ToDoItem>(strsql, new { ID = id }).FirstOrDefault();}}/// <summary>/// 新增项/// </summary>/// <param name="item"></param>/// <returns></returns>public int Insert(ToDoItem item){using (IDbConnection conn = GetSqlConnection()){string strsql = "INSERT into ToDoItem(ID,Name,Notes,Done)values(@ID,@Name,@Notes,@Done)";return conn.Execute(strsql, item);}}/// <summary>/// 修改/// </summary>/// <param name="item"></param>/// <returns></returns>public int Update(ToDoItem item){using (IDbConnection conn = GetSqlConnection()){string strsql = " UPDATE ToDoItem SET Name=@Name,Notes=@Notes,Done=@Done where ID=@ID";return conn.Execute(strsql, item);}}}

 8:在Controller下面新增一个ToDoItemsController的控制器,记得添加相关的命名空间

 [Route("api/[controller]")]public class ToDoItemsController : Controller{private readonly IToDoRepository _toDoRepository;public ToDoItemsController(IToDoRepository toDoRepository){_toDoRepository = toDoRepository;}/// <summary>/// 获取数据/// </summary>/// <returns></returns>[HttpGet]public IActionResult List(){return Ok(_toDoRepository.All());}/// <summary>/// 新增项/// </summary>/// <param name="item"></param>/// <returns></returns>[HttpPost]public IActionResult Create([FromBody] ToDoItem item){try{if (item == null || !ModelState.IsValid){return BadRequest("没有通过验证");}bool itemExists = _toDoRepository.DoesItemExist(item.ID);if (itemExists){return StatusCode(StatusCodes.Status409Conflict, "已经存在此项");}_toDoRepository.Insert(item);}catch (Exception){return BadRequest("创建失败");}return Ok(item);}/// <summary>/// 修改项/// </summary>/// <param name="item"></param>/// <returns></returns>[HttpPut]public IActionResult Edit([FromBody] ToDoItem item){try{if(item==null || !ModelState.IsValid)return BadRequest("没有通过必填验证");var existingItem = _toDoRepository.Find(item.ID);if(existingItem==null){return NotFound("没有发现此记录");}_toDoRepository.Update(item);}catch(Exception){return BadRequest("修改失败");}return NoContent();}/// <summary>/// 删除/// </summary>/// <param name="id"></param>/// <returns></returns>[HttpDelete("{id}")]public IActionResult Delete(string id){try{var item = _toDoRepository.Find(id);if (item == null)return NotFound("没有此记录");_toDoRepository.Delete(id);}catch(Exception ){return BadRequest("删除失败");}return NoContent();}}

 9:在ConfigureServices里配置IToDoRepository 和ToDoRepository服务

   services.AddSingleton<IToDoRepository, Services.ToDoRepository>();

 10:配置Swagger(丝袜哥)具体Swagger的基础知识可以连接到

https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs=visual-studio

10.1:在Nuget控制台添加引用

   >Install-Package Swashbuckle.AspNetCore

10.2:在Startup类中配置Swagger

10.2.1:在ConfigureServices方法里面添加Swagger服务

    //添加Swagger服务services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new Info{Version = "v1",Title = "ToDo API",Description = "A simple example ASP.NET Core Web API",TermsOfService = "None",Contact = new Contact { Name = "Shayne Boyer", Email = "", Url = "https://twitter.com/spboyer" },License = new License { Name = "Use under LICX", Url = "https://example.com/license" }});var basePath = PlatformServices.Default.Application.ApplicationBasePath;var xmlPath = Path.Combine(basePath, "ToDoApi.xml");c.IncludeXmlComments(xmlPath);});

  10.2.2:在Configure配置Swagger服务

app.UseSwagger();
//配置Swagger服务
app.UseSwaggerUI(c =>
{c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

 10.3:最终的Startup类如下

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.PlatformAbstractions;
using Swashbuckle.AspNetCore.Swagger;
using System.IO;
using ToDoApi.Interfaces;namespace ToDoApi
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }//添加服务public void ConfigureServices(IServiceCollection services){services.AddMvc();//添加Swagger服务services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new Info{Version = "v1",Title = "ToDo API",Description = "A simple example ASP.NET Core Web API",TermsOfService = "None",Contact = new Contact { Name = "Shayne Boyer", Email = "", Url = "https://twitter.com/spboyer" },License = new License { Name = "Use under LICX", Url = "https://example.com/license" }});var basePath = PlatformServices.Default.Application.ApplicationBasePath;var xmlPath = Path.Combine(basePath, "ToDoApi.xml");c.IncludeXmlComments(xmlPath);});services.AddSingleton<IToDoRepository, Services.ToDoRepository>();}// 配置服务public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseSwagger();//配置Swagger服务app.UseSwaggerUI(c =>{c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");});//配置开发环境if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();}}
}

10.4:启动项设置为swagger启动 

在launchSettings.json做如下修改

这样你的项目用IIS Express启动来就是swagger界面

11:最终效果

11.2:测试获取数据的方法

12:对NetCore的理解还很浅,只是做了一个简单的demo希望能帮到你,只是写了mysql的,如果是要用SqlServer,则修改读取SqlServerConnection的数据连接然后把数据仓储里面的 MySql.Data.MySqlClien改成Sql server的就可以了

 13:demo连接:

https://files.cnblogs.com/files/gouguo/ToDoApi.rar

  

转载于:https://www.cnblogs.com/gouguo/p/8961516.html

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

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

相关文章

java 文件输出流_Java 文件输出流

Java IO教程 - Java文件输出流创建输出流要写入文件&#xff0c;我们需要创建一个FileOutputStream类的对象&#xff0c;它将表示输出流。// Create a file output streamString destFile "test.txt";FileOutputStream fos new FileOutputStream(destFile);当写入文…

MySQL5.7参数log_timestamps

最近测试MySQL 5.7.21 Community Server这个版本的MySQL数据库时&#xff0c;发现其错误日志的时间跟系统当前时间不一致&#xff0c;后面检查发现日期时间格式都是UTC时间&#xff0c;查了一下相关资料&#xff0c;原来在MySQL 5.7.2 之后日志文件里面的时间戳从默认的本地系…

Tidb集群加mysql_TiDB - 快速入门,集群搭建

TiDB 是开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 …

python递归函数

递归函数简单来说就是函数的自我调用。使用递归函数很多时候可以使得代码简洁&#xff0c;优雅。可以把复杂的问题分解成简单的子问题。递归有无与伦比的魅力&#xff0c;从著名的计算机名言就可以看出递归的奇妙&#xff1a; To iterate is human,to recurse divine. 迭代者为…

java知识体系 servlet_03-Servlet 体系结构知识梳理

一、Servlet体系结构Java Web应用是基于Servlet规范运行&#xff0c;Servlet顶层类的关联如下图&#xff1a;从图可看出&#xff0c;Servlet规范基本围绕这几个类运行&#xff0c;其中&#xff0c;与Servlet主动关联的有3个类&#xff0c;分别是ServletRequest、ServletRespons…

testlink自带java api_java如何连接testlink

1.下载相关的jar包2.获取到testlink的url和key&#xff0c;注意&#xff1a;url不是testlink的连接地址&#xff0c;是连接地址/lib/api/xmlrpc.php3.测试是否连接成功public static void main(String args[]) {String url "http://test.tl.gmsd.lan/lib/api/xmlrpc.php&…

lr背景虚化_lr背景虚化_怎样拍出背景模糊的照片

除了锐化之外&#xff0c;要获得独特的&#xff0c;令人难忘的图像&#xff0c;还可以使用其他方法&#xff0c;例如&#xff0c;相反的效果-单个细节的模糊。这样的方法将使人们有可能专注于整个构图的中心人物&#xff0c;为图片增加情感色彩&#xff0c;动作&#xff0c;并为…

在线五子棋JAVA网络编程_实验五 Java网络编程及安全

一、实验内容1&#xff0e;掌握Socket程序的编写&#xff1b;2&#xff0e;掌握密码技术的使用&#xff1b;3&#xff0e;设计安全传输系统。二、实验步骤1. 基于Java Socket实现安全传输2. 基于TCP实现客户端和服务器&#xff0c;结对编程一人负责客户端&#xff0c;一人负责服…

rnn中文语音识别java_语音识别算法阅读之RNN-T-2018

论文&#xff1a;EXPLORING ARCHITECTURES, DATA AND UNITS FOR STREAMING END-TO-END SPEECH RECOGNITION WITH RNN-TRANSDUCER,2018CTC的一个问题在于&#xff0c;其假设当前帧的输出与历史输出之间的条件独立性&#xff1b;RNN-T引入预测网络来弥补CTC这种条件独立性假设带来…

Storm环境搭建(分布式集群)

作为流计算的开篇&#xff0c;笔者首先给出storm的安装和部署&#xff0c;storm的第二篇&#xff0c;笔者将详细的介绍storm的工作原理。下边直接上干货&#xff0c;跟笔者的步伐一块儿安装storm。 原文链接&#xff1a;Storm环境搭建&#xff08;分布式集群&#xff09; Step1…

18.QT-QPlainEdit 信号与槽

QPlainEdit编辑功能 Public Slots void appendHtml ( const QString & html ) void appendPlainText ( const QString & text ) void centerCursor () void clear () void copy () void cut () void insertPlainText ( const QString & text ) void paste () void …

嘻嘻

今天我们来聊一下如何减肥&#xff1f; 其实我也不知道&#xff0c;嘻嘻~ 开个玩笑 好了&#xff0c;今天我们继续来学习新的知识。 在前两篇文章中&#xff0c;我们接触到了索引的概念&#xff0c;今天我们要对索引进行一个拓展。首先我们先来看一下下面这段代码&#xff1a; …

mysql :完整性约束

---恢复内容开始--- 一&#xff1a;介绍 约束条件与数据类型的宽度一样 &#xff0c;都是可选参数 作用&#xff0c;用于保证数据的完整性和 一致性 主要分为&#xff1a; primary key (pk) 标识该字段为该表的主键&#xff0c; 可以唯一的标识记录 foreign key &#xff08;fk…

php htts cookies,Http和Https下的cookie的写入问题

session和cookie是不一样的session存储在服务器,cookie存储在客户端设置cookie:function setcookie ($name, $value null, $expire null, $path null, $domain null, $secure null, $httponly null) {}获取cookie:$_COOKIE[$sCookieName];题主的写法只是操作了服务器端的…

java 做项目踩坑,web项目踩坑过程

sql函数设计&#xff1a;一开始本来是直接用Java的jdbc直接传输操作语句的。但后来学了存储过程发现存储过程可以提高不少的效率。就重构了自己对数据库的操作代码。包括&#xff1a;开启&#xff0c;查找&#xff0c;修改&#xff0c;关闭。开启&#xff1a;直接使用的构造函数…

matlab设计理想数字带通滤波器,基于matlab的数字带通滤波器课程设计报告

基于matlab的数字带通滤波器课程设计报告 1 西安文理学院机械电子工程系 课程设计报告 专业班级 08级电子信息工程1班 题 目 基于 MATLAB 的数字带通滤波器 学 号 学生姓名 指导教师 2011 年 12 月 西安文理学院机械电子工程系2 课程设计任务书 学生姓名 _______专业班级 _____…

xml序列号错误

xml序列号错误((XmlHelper.Deserialize))提示&#xff1a;XML 文档(1, 2)中有错误。{"不应有 <entryOrder xmlns>。"} 原因&#xff1a;1.缺少根目录&#xff08;<root>&#xff09;2.xml字段转换失败&#xff08;string->int&#xff09; ----------…

关于windows10 CMD 的一些操作

之前接触过cmd的一些操作方法&#xff0c;比如用dir、tasklist等一些方法&#xff0c;但是用了会立马忘记&#xff0c;再用到时又要重新google&#xff0c;这着实让我头痛&#xff01;&#xff01;&#xff01; 今天又碰到一个关于改变目录的问题&#xff0c;又是纠结万分&…

oracle dblink 验证,Oracle DBLINK 简单使用

oracle在进行跨库访问时&#xff0c;可以通过创建dblink实现&#xff0c;今天就简单的介绍下如果创建dblink&#xff0c;以及通过dblink完成插入、修改、删除等操作首先了解下环境&#xff1a;在tnsnames.ora中配置两个数据库别名&#xff1a;orcl(用户名&#xff1a;wangyong …

六、表达式:前缀后缀

count为运算后的值。 转载于:https://www.cnblogs.com/Strugglinggirl/p/9026856.html