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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...