asp.net core系列 36 WebAPI 搭建詳細示例

来源:https://www.cnblogs.com/MrHSR/archive/2019/03/04/10457763.html
-Advertisement-
Play Games

一.概述 HTTP不僅僅用於提供網頁。HTTP也是構建公開服務和數據的API強大平臺。HTTP簡單靈活且無處不在。幾乎任何你能想到的平臺都有一個HTTP庫,因此HTTP服務可以覆蓋廣泛的客戶端,包括瀏覽器,移動設備和傳統的桌面應用程式。 ASP.NET Web API 是一個框架,基於.NET Fr ...


一.概述

  HTTP不僅僅用於提供網頁。HTTP也是構建公開服務和數據的API強大平臺。HTTP簡單靈活且無處不在。幾乎任何你能想到的平臺都有一個HTTP庫,因此HTTP服務可以覆蓋廣泛的客戶端,包括瀏覽器,移動設備和傳統的桌面應用程式。

  ASP.NET Web API 是一個框架,基於.NET Framework 或.NET Core 之上構建 Web API。

  從本章開始學習Web API系列時,先從一個示例開始,下麵使用ASP.NET Core MVC 創建 Web API。通過本次演示將瞭解到一個基礎的Web API應用。環境使用vs 2017 +sql server 2012。示例主要知識點包括:

                   (1)創建 Web API 項目。

                   (2)添加模型類。

                   (3)創建資料庫上下文。

                   (4)註冊資料庫上下文。

                   (5)添加控制器。

                   (6)添加 CRUD 方法。

                   (7)配置路由和 URL 路徑。

                   (8)指定返回值。

                   (9)使用Fiddle調用 Web API。

                   (10)使用 jQuery 調用 Web API。

  在開發Web API之前,先制定幾個有針對性的API 介面,至於api 介面業務很簡單,主要是演示如何應用Web API。

API介面

說明

請求報文

響應報文

GET  /api/todo

獲取所有待辦事項

待辦事項的數據

GET /api/todo/{id}

按 ID 獲取項

待辦事項

POST /api/todo

添加新項

待辦事項

待辦事項

PUT /api/todo/{id}

更新現有項 

待辦事項

DELETE /api/todo/{id}

刪除項 

  

  1.1 創建web項目

    (1)從“文件”菜單中選擇“新建” > “項目”。

    (2)選擇“ASP.NET Core Web 應用程式”模板。 將項目命名為 TodoApi,然後單擊“確定”。

    (3)在“新建 ASP.NET Core Web 應用程式 - TodoApi”對話框中,選擇 ASP.NET Core 版本。 選擇“API”模板,然後單擊“確定”。 請不要選擇“啟用 Docker 支持”。

    項目模板會創建 values API。 控制器方法中預設的Http[Verb] 屬性路由包括GET,POST, PUT, DELETE介面

   

  1.2 添加模型類

    在項目中,添加Models文件夾,新建一個 TodoItem 類,如下所示:

  public class TodoItem
    {
        //主鍵
        public long Id { get; set; }    
        //待辦事項名稱
        public string Name { get; set; }
        //是否完成
        public bool IsComplete { get; set; }
    }

    

  1.3 添加資料庫上下文

    在“Models”文件夾,然後選擇“添加” > “類”。 將類命名為 TodoContext,如下所示:

    //using Microsoft.EntityFrameworkCore;
    public class TodoContext: DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
          : base(options)
        {
        }

        public DbSet<TodoItem> TodoItems { get; set; }
    }

 

  1.4 註冊上下文

    在 ASP.NET Core 中,服務(如資料庫上下文)必須向依賴關係註入 (DI) 容器進行註冊。 該容器向控制器提供服務。這裡使用Microsoft.EntityFrameworkCore.SqlServer數據提供程式。再根據模型生成資料庫表(庫名Todo,有一個表TodoItem)。關於如何安裝數據提供程式,以及如何用模型生成資料庫表,請參考“asp.net core 系列第 20 篇” 。使用遷移生成資料庫後,如下所示:

  1.5 添加控制器

    在Controllers 文件夾中,選擇“API 控制器類”模板。將類命名為 TodoController.cs, 代碼如下所示:

    [Route("api/[controller]")]
    [ApiController]//添加特性,代表是一個Web API控制器類
    public class TodoController : Controller
    {
        private readonly TodoContext _context;

        /// <summary>
        /// 實例化一個EF上下文,進行資料庫操作。開始初始入庫一條數據
        /// </summary>
        /// <param name="context"></param>
        public TodoController(TodoContext context)
        {
            _context = context;

            if (_context.TodoItems.Count() == 0)
            {
                // Create a new TodoItem if collection is empty,
                // which means you can't delete all TodoItems.
                _context.TodoItems.Add(new TodoItem { Name = "Item1" });
                _context.SaveChanges();
            }
        }
    }

 

   1.6 添加GET方法

    通過GET方法來查詢待辦事項的 API,將以下方法添加到 TodoController 類中。關於路由知識,請參考asp.net core 系列第5篇。

        /// <summary>
        /// 獲取所有事項
        /// GET: api/Todo
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
        {
            //using Microsoft.EntityFrameworkCore;
            return await _context.TodoItems.ToListAsync();
        }


        /// <summary>
        /// 根據id,獲取一條事項
        /// GET: api/Todo/5。  id 是參數,代表路由合併
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
        {
            var todoItem = await _context.TodoItems.FindAsync(id);
            if (todoItem == null)
            {
                return NotFound();
            }
            return todoItem;
        }

    啟動vs,測試結果,如下所示,註意請求wep api 地址與action的方法名沒有關係,是根據方法名之上的Http[Verb]特性來確定url地址的:   

  1.7 路由和URL路徑

    (1) Route特性

      Route是用來制定路由模板的,在第5章中也講到。[Route("api/[controller]")]中是以api開頭,替換[controller] 為控制器的名稱, 按照慣例,控制器類名稱減去“Controller”尾碼, 因此控制器名稱為“todo” ,路由不區分大小寫

    (2) HttpGet

      如果[HttpGet]屬性具有路徑模板,例如:[HttpGet("{id}")] 則將其加到路徑(如:api/todo/1)。在這個示例中, "{id}"是占位符變數,用於待辦事項的唯一標識符。

  

   1.8 返回值

    上面的GetTodoItems和GetTodoItem方法的返回類型是ActionResult <T>類型。ASP.NET Core自動將對象序列化為JSON,並將JSON寫入響應消息的正文中。假設沒有異常,此返回類型的響應代碼為200。未處理的異常被轉換為5xx錯誤。

    ActionResult返回類型可以表示各種HTTP狀態代碼,例如在上面的GetTodoItem方法中可以返回兩個不同的狀態值:一個是成功的200, 一個是404未到找。所有的HTTP狀態代碼可以在ControllerBase中找到,例如下圖中的Forbid() 是Http狀態碼403,NoContent()是Http 狀態碼204 。 等等 

 

 

二.測試Web API

  下麵簡單使用Fiddler來測試一下增刪改增。先在本機vs 2017中啟動該項目,地址為http://localhost:62271。

  2.1 查詢   

    在Fiddler工具中,選擇GET,輸入查詢的http地址,右邊是響應的http 狀態碼200, 以及查詢的json結構對象。

  2.2 新增

    下麵創建方法,添加以下 PostTodoItem 方法,在新增方法中調用了CreatedAtAction內置方法,如果新增成功,則返回 HTTP 201 狀態代碼。HTTP 201是HTTP POST方法的標準響應,該方法在伺服器上創建新資源。

        //POST: api/Todo
        [HttpPost]
        public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem item)
        {
            _context.TodoItems.Add(item);
            await _context.SaveChangesAsync();
            return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item);
        }   

  2.3 修改

    添加以下 PutTodoItem 方法, PutTodoItem 與 PostTodoItem 類似,但是使用的是 HTTP PUT。 響應是 204(無內容)。 根據 HTTP 規範,PUT 請求需要客戶端發送整個更新的實體,而不僅僅是更改。若要支持部分更新,請使用HttpPatch特性。   

       // PUT: api/Todo/1
        [HttpPut("{id}")]
        public async Task<IActionResult> PutTodoItem(long id, TodoItem item)
        {
            if (id != item.Id)
            {
                //http 403
                return BadRequest();
            }
            //當前傳過來的實體添加到上下文,並設置為修改
            _context.Entry(item).State = EntityState.Modified;
            await _context.SaveChangesAsync();

            return NoContent();
        }

  2.4 刪除     

        // DELETE: api/Todo/2
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteTodoItem(long id)
        {
            var todoitem = await _context.TodoItems.FindAsync(id);
            if (todoitem == null)
            {
                return NotFound();
            }

            _context.TodoItems.Remove(todoitem);
            await _context.SaveChangesAsync();

            return NoContent();
        }

 

    最後:關於jQuery 調用 Web API,不再演示,jQuery調用的配置和註意事項,請查看官網介紹。

 

  參考文獻:

    ASP.NET Core的Web API

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 我有一種情況,我希望能夠將項目添加到列表中,併在列表中移動項目,這似乎是使用a的最簡單方法ListBox。我立刻想到瞭如何以通用的方式做到這一點,然後,也許,可以使用行為來做到這一點。這似乎是一個非常有用的想法。我決定以一種簡單的方式為我正在開發的應用程式做這件事,但我想我會創建一個演示項目來 ...
  • 介紹 在本文中,讓我們看看如何開始使用Visual Studio 2019 RC。Microsoft現已發佈Visual Studio Release Candidate,現在可以下載了。最初,Microsoft開始發佈Visual Studio Preview版本,最近,VS 2019 RC可在此 ...
  • 一、什麼是介面? 介面就是一種規範協議,約定好遵守某種規範就可以寫通用的代碼。 定義了一組具有各種功能的方法(只是一種能力,沒有具體實現,就像抽象方法一樣,“光說不做”)。 理解:記憶體該做成什麼樣的:電壓多少,插線多少,這是一種國際規範,是介面。而,記憶體這個東西具體生產出來了,就是實現介面。不管是什 ...
  • 翻閱上篇文章: "Windows 10 安裝 ElasticSearch" 上次寫的是下載Zip包安裝的,在 "下載頁面" 發現有 "MSI (BETA) " 的下載可選項。瞭解之後發現MSI安裝也值得嘗試。 MSI安裝ElasticSearch 參考文章: "Install Elasticsear ...
  • 轉到Html.TextBox()看可以看出 Html.TextBox()方法,創建文本框【<input type="text"/>】,並且可以帶上name,value和html屬性; 看慄子: @Html.TextBox("txt", null, new { @class="main"}) 能生成 ...
  • 0.引入.net core環境下Redis的NuGet包,StackExchange.Redis,現目前最新的2.0.519。 1 using System; 2 using System.Collections.Generic; 3 using StackExchange.Redis; 4 usi ...
  • 1.選擇文件夾發佈項目到本地,通過Xftp上傳文件到/home/wwwroot下;下麵具體介紹下 2.通過Xftp直接拖拽壓縮包到linux下,通過命令cd /home/wwwroot目錄下;然後輸入 unzip 壓縮包名字(例如core.zip)。如果壓縮文件像這種包含了一個文件夾,解壓出來會看不 ...
  • 1.在安裝.NET之前,您需要註冊Microsoft密鑰、註冊產品存儲庫和安裝所需的依賴項。 啟動我們的虛擬機,輸入以下命令: sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...