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

浙公網安備 33010602011771號