ASP.NET Core WebAPI 做到CRUD

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

本節用於構建一個簡單的WebAPI來管理to-do列表。不會創建用戶界面。

ASP.NET Core WebAPI 實現CRUD

下圖現實了一個應用程序的基本設計:

ASP.NET Core WebAPI 實現CRUD

  • 客戶端消費Web API,一般客戶端是指移動應用程序和瀏覽器。本節不創建客戶端,使用Postman or curl作為客戶端來測試APP。
  • Model表示用程序數據的對象。在這里,Model是指一個to-do item.Model表示一個C#類。也就是一個POCO(一個簡單C#對象)。
  • 控制器是處理HTTP請求並創建HTTP響應的對象。這個程序有一個單一的控制器。
  • 為了簡化本節教程,應用程序不使用持久性數據庫。教程將使用內存存儲對象。

一、先決條件

  • .NET Core 2.0 sdk 或者更高版本
  • 帶有ASP.NET和Web開發工作負載的VS2017 版本15.3 或者或者更高版本。

二、創建項目

從VS中選擇File menu ,>New>Project

選擇ASP.NET Core Web Application(.net core)項目模板。項目名稱”TodoApi”並選擇OK.

ASP.NET Core WebAPI 實現CRUD

在New ASP.NET Core Web Application – TodoApi 對話框中,選擇WebAPI模板。選擇OK ,不選中Enable Docker Support

ASP.NET Core WebAPI 實現CRUD

啟動APP

在Visual Studio中,按下CTRL+F5啟動APP,VS啟動瀏覽器並導航到http://localhost:port/api/values,其中port是隨機選擇端口號。

瀏覽器顯示如下:[“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(DbContextOptionsoptions) :

base(options)

{

}

public DbSetTodoItems { 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(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.

ASP.NET Core WebAPI 實現CRUD

用下面代碼替換

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 IEnumerableGetAll()

{

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

ASP.NET Core WebAPI 實現CRUD

  • 設置HTTP方法為POST
  • 選擇Body radio Button
  • 選擇raw radio Button
  • 設置類型為JSON

在編輯器中輸入下面JSON

{

“name”:”walk dog”,

“isComplete”:true

}

  • 選擇Send
  • 選擇Headers tab頁

ASP.NET Core WebAPI 實現CRUD

使用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.

ASP.NET Core WebAPI 實現CRUD

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();

}

ASP.NET Core WebAPI 實現CRUD

OK,就寫到這里,下節我們將介紹使用Swagger生成ASP.NET CORE WebAPI幫助文檔。

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!