zoukankan      html  css  js  c++  java
  • 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;
                    else
                        return 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
    

      

  • 相关阅读:
    Openjudge 1.3 算数表达式与顺序执行
    Openjudge 1.2 变量定义、赋值并转换
    Openjudge 1.4 逻辑表达式与条件分支
    Openjudge 1.5 循环控制
    Openjudge 1.6 一位数组
    Openjudge 1.8 多维数组
    poj-3134 ida*||记录路径bfs
    wust-1588 日期模拟题
    wust 1599弗洛伊德
    hdu5667 费马小定理加矩阵快速幂
  • 原文地址:https://www.cnblogs.com/gouguo/p/8961516.html
Copyright © 2011-2022 走看看