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,一经查实,立即删除!

相关文章

mysql binlog sql统计_mysql的binlog详解

binlog是mysql记录操作的二进制日志文件,有三种格式可选,但是老旧的SBR已经不适合现在大多数业务需求,所以大多数都建议用MBR和RBR,即mixed或row,而解析他的原因,几乎都只有一个,就是恢复数据库,或者是反编译来恢复数据库,目的都是一样.以下是基于mysql5.6的mysqlbinlog来描述的…

Android项目实战(二十二):启动另一个APP or 重启本APP

Android项目实战&#xff08;二十二&#xff09;&#xff1a;启动另一个APP or 重启本APP 原文:Android项目实战&#xff08;二十二&#xff09;&#xff1a;启动另一个APP or 重启本APP一、启动另一个APP 目前公司项目需求&#xff0c;一个主APP,需要打开某些小APP&#xff0c…

mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...

最近做一个项目&#xff0c;需要对人口数据进行查询&#xff0c;但是人口数据分布在不同的街道表中&#xff0c;首先进行了数据表结构的统一&#xff0c;每个数据表以街道名开头&#xff0c;然后其他的名字都一样前期将各个表中的字段也进行了统一抽象出一张字典表将街道编号和…

oracle批量update

我个人觉得写的很好 http://blog.csdn.net/wanglilin/article/details/7200201 需求&#xff1a; 将t2(t_statbuf)表中id和t1(T_Mt)表相同的记录更新进t1表。 1.错误的写法&#xff1a; 1 update table_name t1 set (a,b,c)( select a,b,c from table_name_2 t2 where t1.at2.a…

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

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

Docker自动补全容器名

Zsh Place the completion script in your /path/to/zsh/completion (typically ~/.zsh/completion/): 下载自动完成文件mkdir -p ~/.zsh/completion curl -L https://raw.githubusercontent.com/docker/compose/1.21.0/contrib/completion/zsh/_docker-compose > ~/.zsh/co…

java 打印 模板_Java输入输出模板

常规输入输出绝壁有毒&#xff5e;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigDecimal;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(St…

MySQL5.7参数log_timestamps

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

java非堆内存_java – 监视JVM的非堆内存使用情况

我们通常处理OutOfMemoryError问题&#xff0c;因为堆或permgen大小配置问题。但是所有的JVM内存不是permgen或者heap。据我所知&#xff0c;它也可以与Threads / Stacks&#xff0c;本地JVM代码相关…但是使用pmap我可以看到进程分配了9.3G这是3.3G堆外内存使用。我不知道什么…

.net core HttpContext(Http上下文)

在.NET Core中&#xff0c;只有Controller才能直接使用 HttpContext &#xff0c;其他地方需要通过HttpContextAccessor来访问 转载于:https://www.cnblogs.com/87Super/p/8975311.html

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

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

一个ssm综合小案例-商品订单管理-第二天

准确来说是第二三天&#xff0c;一时兴起&#xff0c;把这个小项目一鼓作气写完了&#xff08;较大的bug 均已被我手动捉出并 fix &#xff09;才来写一篇博客。 接上文 第一天配置继续讲解&#xff1a; 转载于:https://www.cnblogs.com/Frank99/p/8975378.html

java运行时读取注解_Java自定义注解和运行时靠反射获取注解

转&#xff1a;1、Annotation的工作原理&#xff1a;JDK5.0中提供了注解的功能&#xff0c;允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法&#xff0c;读取注解的API&#xff0c;一个使用注解修饰的class文件和一个注解处理工具…

python递归函数

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

java的jsp要下载吗_jsp、java下载附件

1 传入此jsp中的参数均已URLDencoder过。23 4 5 6 7 boolean isError false;8 String errorMsg "";9 response.reset();//可以加也可以不加10 request.setCharacterEncoding("UTF-8");11 String folder "news";12 if(request.getParameter(&q…

浅谈高斯消元的实现和简单应用

一、高斯消元的原理 对于n元的m个线性方程组成的方程组&#xff0c;我们将其以矩阵的形式记录下来&#xff1a; a11 a12 a13 ...... a1n b1 a21 a22 a23 ...... a2n b2 ... ... ... an1 an2 an3 ...... ann bn 然后进行初等行列变换&#xff0c;尝试构造出一个上三角矩阵&#…

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

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

SQL批量提交修改业务

把你需要批量提交修改的东西在内存中修改完毕 然后执行以下代码 SqlConnection conn new SqlConnection(ConnectionString);SqlDataAdapter sda new SqlDataAdapter("select Id,RankSummary,RankOfCn,Classify from u_College;", conn); //这里的SQL语句可以是查询…

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&…

ubuntu解压缩zip/tar/tar.gz/tar.bz2

ubuntu解压缩zip/tar/tar.gz/tar.bz2ZIPzip可能是目前使用得最多的文档压缩格式。它最大的优点就是在不同的操作系统平台&#xff0c;比如Linux&#xff0c; Windows以及Mac OS&#xff0c;上使用。缺点就是支持的压缩率不是很高&#xff0c;而tar.gz和tar.gz2在压缩率方面做得…