asp.net core WebAPI實現CRUD

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

API Description Request body Response body
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


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

        

 

.客戶端消費Web API,通常客戶端是指移動應用程序和瀏覽器。本節不建立客戶端,使用Postman or curl做爲客戶端來測試APP。瀏覽器


.Model表示用程序數據的對象。在這裏,Model是指一個to-do item.Model表示一個C#類。也就是一個POCO(一個簡單C#對象)。服務器


.控制器是處理HTTP請求並建立HTTP響應的對象。這個程序有一個單一的控制器。app


.爲了簡化本節教程,應用程序不使用持久性數據庫。教程將使用內存存儲對象。curl

1、先決條件編輯器

.DotNetCore 2.0 sdk 或者更高版本函數

.帶有ASP.NET和Web開發工做負載的VS2017 版本15.3 或者或者更高版本。測試

2、建立項目ui

 從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是隨機選擇端口號。瀏覽器顯示以下:

["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響應。

 

3、實現另一些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幫助文檔。

相關文章
相關標籤/搜索