日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

asp.net core WebAPI实现CRUD

發(fā)布時(shí)間:2023/12/4 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp.net core WebAPI实现CRUD 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(jié)用于構(gòu)建一個(gè)簡(jiǎn)單的WebAPI來(lái)管理to-do列表。不會(huì)創(chuàng)建用戶界面。

API Description Request body Response body
GET /api/todo Get all to-do items NoneArray of to-do items
GET /api/todo/{id} Get an item by ID NoneTo-do item
POST /api/todo Add a new item To-do itemTo-do item
PUT /api/todo/{id} Update an existing item ? To-do itemNone
DELETE /api/todo/{id} ? ? Delete an item ? ? NoneNone


下圖現(xiàn)實(shí)了一個(gè)應(yīng)用程序的基本設(shè)計(jì):

        

?

.客戶端消費(fèi)Web API,一般客戶端是指移動(dòng)應(yīng)用程序和瀏覽器。本節(jié)不創(chuàng)建客戶端,使用Postman or curl作為客戶端來(lái)測(cè)試APP。


.Model表示用程序數(shù)據(jù)的對(duì)象。在這里,Model是指一個(gè)to-do item.Model表示一個(gè)C#類(lèi)。也就是一個(gè)POCO(一個(gè)簡(jiǎn)單C#對(duì)象)。


.控制器是處理HTTP請(qǐng)求并創(chuàng)建HTTP響應(yīng)的對(duì)象。這個(gè)程序有一個(gè)單一的控制器。


.為了簡(jiǎn)化本節(jié)教程,應(yīng)用程序不使用持久性數(shù)據(jù)庫(kù)。教程將使用內(nèi)存存儲(chǔ)對(duì)象。

一、先決條件

.DotNetCore 2.0 sdk 或者更高版本

.帶有ASP.NET和Web開(kāi)發(fā)工作負(fù)載的VS2017 版本15.3 或者或者更高版本。

二、創(chuàng)建項(xiàng)目

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

?選擇ASP.NET Core Web Application(.net core)項(xiàng)目模板。項(xiàng)目名稱"TodoApi"并選擇OK.

?? ?

在New ASP.NET Core Web Application - TodoApi 對(duì)話框中,選擇WebAPI模板。選擇OK ,不選中Enable Docker Support?

   

啟動(dòng)APP

在Visual Studio中,按下CTRL+F5啟動(dòng)APP,VS啟動(dòng)瀏覽器并導(dǎo)航到http://localhost:port/api/values,其中port是隨機(jī)選擇端口號(hào)。瀏覽器顯示如下:

1 ["value1","value2"]

創(chuàng)建模型類(lèi)

model是一個(gè)C#對(duì)象,在app中用來(lái)展示數(shù)據(jù),在這里model就是只一個(gè)to-do item.

添加一個(gè)Models文件夾,在解決方案中。并在文件夾中添加TodoItem類(lèi)。

使用下面代碼更新TodoItem類(lèi)。


namespace?TodoApi.Models { public?class?TodoItem { public?long?Id {?get;?set; } public?string?Name {?get;?set; } public?bool?IsComplete {?get;?set; } } }

當(dāng)創(chuàng)建一個(gè)TodoItem數(shù)據(jù)庫(kù)自動(dòng)生成Id.

創(chuàng)建一個(gè)database context

database context是為模型提供數(shù)據(jù)的主要類(lèi)配合Entity Framework.這個(gè)類(lèi)繼承自Microsoft.EntityFrameworkCore.DbContext。在Models文件夾下添加一個(gè)TodoContext類(lèi). 用下列代碼替換


using?Microsoft.EntityFrameworkCore; namespace?TodoApi.Models { public?class?TodoContext : DbContext { public?TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public?DbSet<TodoItem> TodoItems {?get;?set; } } }

?注冊(cè)一個(gè)database context

在這個(gè)步驟中,database context注冊(cè)到DI容器,DI容器中注冊(cè)的服務(wù)可用于控制器中。

?使用內(nèi)置的DI容器注冊(cè)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(); } } }

上面代碼:

?.移除不使用的代碼。

?.指定一個(gè)內(nèi)存數(shù)據(jù)庫(kù)使用注入到service容器。

添加一個(gè)controller

在解決方案中,右擊Controls文件夾,選擇 Add > New Item.在Add New Item對(duì)話框中,選擇Web API Controller Class 模板。為類(lèi)起一個(gè)名字叫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(); } }?????? } }

.定義了一個(gè)空的控制器類(lèi)。在下面,我們添加一些方法實(shí)現(xiàn)API。

.構(gòu)造函數(shù)使用DI提供一個(gè)TodoContext并注入到Controller中。在Controller中DataBase context實(shí)現(xiàn)CRUD方法。

.如果內(nèi)存數(shù)據(jù)庫(kù)中沒(méi)有todoItem,構(gòu)造函數(shù)默認(rèn)將添加一個(gè)。

獲取to-do Items

對(duì)于獲取一個(gè)to-do Items,添加下面代碼在TodoController類(lèi)中。


[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); }

上面代碼是兩個(gè)Get方法:

.GET /api/todo

.GET /api/todo/{id}

當(dāng)調(diào)用GetAll方法時(shí)。HTTP響應(yīng)顯示如下:


[ { "id": 1, "name":?"Item1", "isComplete":?false } ]

路由和URL路徑

[HttpGet] 特性指定一個(gè)HTTP Get方法。每個(gè)方法的URL路徑構(gòu)造如下:

.獲取模板字符串在控制器Route特性:

namespace TodoApi.Controllers {[Route("api/[controller]")] ? ?public class TodoController : Controller{ ? ? ? ?private readonly TodoContext _context;


?.用控制器的名稱替換[controller],即控制器的類(lèi)名減去"Controller"后綴。在這個(gè)示例中,控制器的類(lèi)名是TodoController,根名是"todo"。ASP.NET 路由不區(qū)分大小寫(xiě)。

?.如果[HttpGet]屬性有一個(gè)路由模板(如[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是占位符變量,當(dāng)調(diào)用GetById時(shí),它將URL中的"{id}"的值復(fù)制給方法的id參數(shù)。

Name = "GetTodo" 創(chuàng)建了一個(gè)路由名稱
?.啟動(dòng)應(yīng)用程序使用路由名稱創(chuàng)建一個(gè)HTTP連接。
?.在稍后文章將做解釋。

返回值

GetAll方法返回一個(gè)IEnumerable。MVC自動(dòng)把對(duì)象序列化成JSON,并將JSON寫(xiě)入的響應(yīng)Body中。對(duì)這個(gè)方法的響應(yīng)Code是200,假設(shè)沒(méi)有未處理的異常。

相比之下GetById方法返回更一般的IActionResult類(lèi)型,它表示大范圍的返回類(lèi)型。

GetById有兩個(gè)不同的返回類(lèi)型:

.如果沒(méi)有Item匹配請(qǐng)求的ID,該方法返回404錯(cuò)誤。返回NotFound返回一個(gè)HTTP 404響應(yīng)。

.否則,該方法返回200與JSON響應(yīng)正文。返回ObjectResult返回一個(gè)HTTP 200響應(yīng)。

?

三、實(shí)現(xiàn)另外一些CRUD操作

Create

添加一個(gè)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); }

上面是一個(gè)HTTP的POST方法。由[HttpPost]指定。[FormBody]特性告訴MVC從HTTP請(qǐng)求的正文中獲取to-do Item。

CreateAtRoute方法:

.返回201響應(yīng)。HTTP 201是一個(gè)HTTP POST方法的標(biāo)準(zhǔn)的響應(yīng)在服務(wù)器上創(chuàng)建新資源。

.添加一個(gè)Location到響應(yīng)頭。Location頭指定了新創(chuàng)建的to-do item的URL。

.使用"GetTodo"命名路由來(lái)創(chuàng)建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發(fā)送一個(gè)Create request

.設(shè)置HTTP方法為POST

.選擇Body radio Button

.選擇raw radio Button

.設(shè)置類(lèi)型為JSON

在編輯器中輸入下面JSON


{ "name":"walk dog", "isComplete":true }

.選擇Send

.選擇Headers tab頁(yè)

 

?

使用Location headerURI能訪問(wèn)新添加的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有點(diǎn)類(lèi)似Create,但是使用HTTP PUT. 響應(yīng)204(No Content). 根據(jù)HTTP規(guī)范,PUT請(qǐng)求需要客戶端發(fā)送整個(gè)更新的實(shí)體, 而不僅是增量。要支持部分更新,請(qǐng)使用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,就寫(xiě)到這里,下節(jié)我們將介紹使用Swagger生成ASP.NET CORE WebAPI幫助文檔。

原文地址:http://www.cnblogs.com/netcoder/p/7801447.html


.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的asp.net core WebAPI实现CRUD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。