asp.net core WebAPI实现CRUD
本節用于構建一個簡單的WebAPI來管理to-do列表。不會創建用戶界面。
| GET /api/todo | Get all to-do items | None | Array of to-do items |
| GET /api/todo/{id} | Get an item by ID | None | To-do item |
| POST /api/todo | Add a new item | To-do item | To-do item |
| PUT /api/todo/{id} | Update an existing item ? | To-do item | None |
| DELETE /api/todo/{id} ? ? | Delete an item ? ? | None | None |
下圖現實了一個應用程序的基本設計:
?
.客戶端消費Web API,一般客戶端是指移動應用程序和瀏覽器。本節不創建客戶端,使用Postman or curl作為客戶端來測試APP。
.Model表示用程序數據的對象。在這里,Model是指一個to-do item.Model表示一個C#類。也就是一個POCO(一個簡單C#對象)。
.控制器是處理HTTP請求并創建HTTP響應的對象。這個程序有一個單一的控制器。
.為了簡化本節教程,應用程序不使用持久性數據庫。教程將使用內存存儲對象。
一、先決條件
.DotNetCore 2.0 sdk 或者更高版本
.帶有ASP.NET和Web開發工作負載的VS2017 版本15.3 或者或者更高版本。
二、創建項目
?從VS中選擇File menu ,>New>Project
?選擇ASP.NET Core Web Application(.net core)項目模板。項目名稱"TodoApi"并選擇OK.
?? ?
在New ASP.NET Core Web Application - TodoApi 對話框中,選擇WebAPI模板。選擇OK ,不選中Enable Docker Support?
啟動APP
在Visual Studio中,按下CTRL+F5啟動APP,VS啟動瀏覽器并導航到http://localhost:port/api/values,其中port是隨機選擇端口號。瀏覽器顯示如下:
| 1 | ["value1","value2"] |
創建模型類
model是一個C#對象,在app中用來展示數據,在這里model就是只一個to-do item.
添加一個Models文件夾,在解決方案中。并在文件夾中添加TodoItem類。
使用下面代碼更新TodoItem類。
| | namespace?TodoApi.Models { public?class?TodoItem { public?long?Id {?get;?set; } public?string?Name {?get;?set; } public?bool?IsComplete {?get;?set; } } } |
當創建一個TodoItem數據庫自動生成Id.
創建一個database context
database context是為模型提供數據的主要類配合Entity Framework.這個類繼承自Microsoft.EntityFrameworkCore.DbContext。在Models文件夾下添加一個TodoContext類. 用下列代碼替換
| | using?Microsoft.EntityFrameworkCore; namespace?TodoApi.Models { public?class?TodoContext : DbContext { public?TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public?DbSet<TodoItem> TodoItems {?get;?set; } } } |
?注冊一個database context
在這個步驟中,database context注冊到DI容器,DI容器中注冊的服務可用于控制器中。
?使用內置的DI容器注冊DBContext,使用下面代碼:
| | using?Microsoft.AspNetCore.Builder; using?Microsoft.EntityFrameworkCore; using?Microsoft.Extensions.DependencyInjection; using?TodoApi.Models; namespace?TodoApi { public?class?Startup {?????? public?void?ConfigureServices(IServiceCollection services) { services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList")); services.AddMvc(); } public?void?Configure(IApplicationBuilder app) { app.UseMvc(); } } } |
上面代碼:
?.移除不使用的代碼。
?.指定一個內存數據庫使用注入到service容器。
添加一個controller
在解決方案中,右擊Controls文件夾,選擇 Add > New Item.在Add New Item對話框中,選擇Web API Controller Class 模板。為類起一個名字叫TodoController.
用下面代碼替換
| | using?System.Collections.Generic; using?Microsoft.AspNetCore.Mvc; using?TodoApi.Models; using?System.Linq; namespace?TodoApi.Controllers { [Route("api/[controller]")] public?class?TodoController : Controller { private?readonly?TodoContext _context; public?TodoController(TodoContext context) { _context = context; if?(_context.TodoItems.Count() == 0) { _context.TodoItems.Add(new?TodoItem { Name =?"Item1"?}); _context.SaveChanges(); } }?????? } } |
.定義了一個空的控制器類。在下面,我們添加一些方法實現API。
.構造函數使用DI提供一個TodoContext并注入到Controller中。在Controller中DataBase context實現CRUD方法。
.如果內存數據庫中沒有todoItem,構造函數默認將添加一個。
獲取to-do Items
對于獲取一個to-do Items,添加下面代碼在TodoController類中。
| | [HttpGet] public?IEnumerable<TodoItem> GetAll() { return?_context.TodoItems.ToList(); } [HttpGet("{id}", Name =?"GetTodo")] public?IActionResult GetById(long?id) { var?item = _context.TodoItems.FirstOrDefault(t => t.Id == id); if?(item ==?null) { return?NotFound(); } return?new?ObjectResult(item); } |
上面代碼是兩個Get方法:
.GET /api/todo
.GET /api/todo/{id}
當調用GetAll方法時。HTTP響應顯示如下:
| | [ { "id": 1, "name":?"Item1", "isComplete":?false } ] |
路由和URL路徑
[HttpGet] 特性指定一個HTTP Get方法。每個方法的URL路徑構造如下:
.獲取模板字符串在控制器Route特性:
namespace TodoApi.Controllers {[Route("api/[controller]")] ? ?public class TodoController : Controller{ ? ? ? ?private readonly TodoContext _context;
?.用控制器的名稱替換[controller],即控制器的類名減去"Controller"后綴。在這個示例中,控制器的類名是TodoController,根名是"todo"。ASP.NET 路由不區分大小寫。
?.如果[HttpGet]屬性有一個路由模板(如[HttpGet("/products")]),將其追加到路徑中..
?在GetById方法中:
| | [HttpGet("{id}", Name =?"GetTodo")] public?IActionResult GetById(long?id) { var?item = _context.TodoItems.FirstOrDefault(t => t.Id == id); if?(item ==?null) { return?NotFound(); } return?new?ObjectResult(item); } |
"{id}"是todo item的ID是占位符變量,當調用GetById時,它將URL中的"{id}"的值復制給方法的id參數。
Name = "GetTodo" 創建了一個路由名稱
?.啟動應用程序使用路由名稱創建一個HTTP連接。
?.在稍后文章將做解釋。
返回值
GetAll方法返回一個IEnumerable。MVC自動把對象序列化成JSON,并將JSON寫入的響應Body中。對這個方法的響應Code是200,假設沒有未處理的異常。
相比之下GetById方法返回更一般的IActionResult類型,它表示大范圍的返回類型。
GetById有兩個不同的返回類型:
.如果沒有Item匹配請求的ID,該方法返回404錯誤。返回NotFound返回一個HTTP 404響應。
.否則,該方法返回200與JSON響應正文。返回ObjectResult返回一個HTTP 200響應。
?
三、實現另外一些CRUD操作
Create
添加一個Create方法
| | [HttpPost] public?IActionResult Create([FromBody] TodoItem item) { if?(item ==?null) { return?BadRequest(); } _context.TodoItems.Add(item); _context.SaveChanges(); return?CreatedAtRoute("GetTodo",?new?{ id = item.Id }, item); } |
上面是一個HTTP的POST方法。由[HttpPost]指定。[FormBody]特性告訴MVC從HTTP請求的正文中獲取to-do Item。
CreateAtRoute方法:
.返回201響應。HTTP 201是一個HTTP POST方法的標準的響應在服務器上創建新資源。
.添加一個Location到響應頭。Location頭指定了新創建的to-do item的URL。
.使用"GetTodo"命名路由來創建URL。在GetById中定義了"GetTodo"命名路由:
| | [HttpGet("{id}", Name =?"GetTodo")] public?IActionResult GetById(long?id) { var?item = _context.TodoItems.FirstOrDefault(t => t.Id == id); if?(item ==?null) { return?NotFound(); } return?new?ObjectResult(item); } |
使用Postman發送一個Create request
.設置HTTP方法為POST
.選擇Body radio Button
.選擇raw radio Button
.設置類型為JSON
在編輯器中輸入下面JSON
| | { "name":"walk dog", "isComplete":true } |
.選擇Send
.選擇Headers tab頁
?
使用Location headerURI能訪問新添加的Item.
?
Update
添加下列Update代碼:
| | [HttpPut("{id}")] public?IActionResult Update(long?id, [FromBody] TodoItem item) { if?(item ==?null?|| item.Id != id) { return?BadRequest(); } var?todo = _context.TodoItems.FirstOrDefault(t => t.Id == id); if?(todo ==?null) { return?NotFound(); } todo.IsComplete = item.IsComplete; todo.Name = item.Name; _context.TodoItems.Update(todo); _context.SaveChanges(); return?new?NoContentResult(); } |
Update有點類似Create,但是使用HTTP PUT. 響應204(No Content). 根據HTTP規范,PUT請求需要客戶端發送整個更新的實體, 而不僅是增量。要支持部分更新,請使用HTTP PATCH.
?
Delete
添加下面Delete方法
| | [HttpDelete("{id}")] public?IActionResult Delete(long?id) { var?todo = _context.TodoItems.FirstOrDefault(t => t.Id == id); if?(todo ==?null) { return?NotFound(); } _context.TodoItems.Remove(todo); _context.SaveChanges(); return?new?NoContentResult(); } |
?
OK,就寫到這里,下節我們將介紹使用Swagger生成ASP.NET CORE WebAPI幫助文檔。
原文地址:http://www.cnblogs.com/netcoder/p/7801447.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的asp.net core WebAPI实现CRUD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.net core应用在 Kube
- 下一篇: Docker ASP.NET Core