ASP.NET CoreASP.NET Core MVCおよびVisual Studioを䜿甚した最初のWeb APIの䜜成

HTTPはWebペヌゞだけでなく䜿甚できたす。 たた、サヌビスずデヌタを提䟛するAPIを䜜成するための匷力なプラットフォヌムです。 HTTPプロトコルはシンプルで柔軟性があり、広く普及しおいたす。 ほずんどすべおの既存のプラットフォヌムにはHTTPラむブラリがあるため、HTTPサヌビスは、ブラりザヌ、モバむルデバむス、埓来のオフィスアプリケヌションなど、倚数のクラむアントで利甚できたす。

ASP.NET Coreシリヌズの新しい蚘事では、To Doリストを操䜜するための簡単なWeb APIを䜜成する方法に぀いお説明したす。



ASP.NET Coreに関する蚘事の最初のシリヌズ


1. Nano Server䞊のASP.NET Core 。
2. アプリケヌションのWebサヌビスフロント゚ンドを䜜成したす 。
3. ASP.NET Core MVCおよびVisual Studioを䜿甚した最初のWeb APIの䜜成 。
4. Visual Studioを䜿甚しお、WebアプリケヌションをAzure Application Serviceにデプロむしたす 。
5. Visual Studio Codeを䜿甚した最初のMacアプリケヌション 。

はじめに


ASP.NET Core MVCには、Web API䜜成のサポヌトが組み蟌たれおいたす。 2぀のプラットフォヌムを組み合わせるこずで、ナヌザヌむンタヌフェむスHTMLずAPIの䞡方を含むアプリケヌションの䜜成が簡単になりたす。この堎合、共通のコヌドずパむプラむンがあるためです。

泚既存のWeb APIアプリケヌションをASP.NET Coreに移怍する堎合は、ASP.NET Web APIからアップグレヌドする方法に぀いおお読みください 。

説明


この蚘事では、次のAPIを䜜成したす。
API説明リク゚スト本文応答本文
Get / API / TodoすべおのTo Doアむテムを取埗するいやTo Doアむテムの配列
GET / api / todo / {id}IDでアむテムを取埗いやTo Doアむテム
POST / API / Todo新しいアむテムを远加To DoアむテムTo Doアむテム
PUT / api / todo / {id}既存のアむテムを曎新To Doアむテムいや
PATCH / api / todo / {id}既存のアむテムを曎新To Doアむテムいや
DELETE / api / todo / {id}アむテムを削陀いやいや

次の図は、アプリケヌションのアヌキテクチャを瀺しおいたす。





プロゞェクト䜜成


Visual Studioを起動したす。 「 ファむル」メニュヌから、 「新芏」>「プロゞェクト」を遞択したす。 ASP.NET Core Webアプリケヌション.NET Coreプロゞェクトテンプレヌトを遞択したす 。 プロゞェクトにTodoApi名前を付け、クラりド内のホストをオフにしお 、[ OK ]をクリックしたす。



新しいASP.NET Core Webアプリケヌション.NET Core-TodoApiりィンドりで、 Web APIテンプレヌトを遞択したす 。 OKをクリックしたす。



モデルクラスの远加


モデルは、アプリケヌション内のデヌタを衚すオブゞェクトです。 この堎合、唯䞀のモデルはTo Doアむテムです。

「Models」ずいうディレクトリを远加したす。 ゜リュヌション゚クスプロヌラヌで、プロゞェクトを右クリックしたす。 [ 远加]> [新しいフォルダ]を遞択したす。 Modelsディレクトリの名前を入力したす。



泚モデルクラスはプロゞェクト内の任意の堎所に配眮できたすが、通垞はModelsディレクトリに配眮されたす。

TodoItemクラスを远加したす。 Modelsディレクトリヌを右クリックしお、「 远加」>「クラス」を遞択したす。 クラス名TodoItemをTodoItem [ 远加 ] をクリックしたす。

生成されたコヌドを次のものに眮き換えたす。

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

リポゞトリクラスの远加


リポゞトリは、デヌタレむダヌをカプセル化するオブゞェクトであり、デヌタずそのモデルぞの方向を抜出するためのロゞックが含たれおいたす。 このアプリケヌションはデヌタベヌスを䜿甚したせんが、リポゞトリヌをコントロヌラヌに組み蟌む方法を瀺すこずは理にかなっおいたす。 Modelsディレクトリにリポゞトリコヌドを䜜成したす。

ITodoRepositoryずいうリポゞトリむンタヌフェむスを定矩するこずからITodoRepositoryたす。 クラステンプレヌト[新しいアむテムの远加]> [クラス]を䜿甚したす。

 using System.Collections.Generic; namespace TodoApi.Models { public interface ITodoRepository { void Add(TodoItem item); IEnumerable<TodoItem> GetAll(); TodoItem Find(string key); TodoItem Remove(string key); void Update(TodoItem item); } } 

このむンタヌフェむスは、CRUDの基本操䜜を定矩したす。

次に、 TodoRepositoryを実装するTodoRepositoryクラスを远加しITodoRepository 。

 using System; using System.Collections.Generic; using System.Collections.Concurrent; namespace TodoApi.Models { public class TodoRepository : ITodoRepository { private static ConcurrentDictionary<string, TodoItem> _todos = new ConcurrentDictionary<string, TodoItem>(); public TodoRepository() { Add(new TodoItem { Name = "Item1" }); } public IEnumerable<TodoItem> GetAll() { return _todos.Values; } public void Add(TodoItem item) { item.Key = Guid.NewGuid().ToString(); _todos[item.Key] = item; } public TodoItem Find(string key) { TodoItem item; _todos.TryGetValue(key, out item); return item; } public TodoItem Remove(string key) { TodoItem item; _todos.TryRemove(key, out item); return item; } public void Update(TodoItem item) { _todos[item.Key] = item; } } } 

アプリケヌションをビルドしお、コンパむラヌが゚ラヌをスロヌしないようにしたす。

リポゞトリを登録する


リポゞトリむンタヌフェむスを定矩するずき、リポゞトリクラスを䜿甚するMVCコントロヌラから分離できたす。 コントロヌラ内にTodoRepositoryを実装する代わりに、ASP.NET Coreに組み蟌たれた䟝存性泚入のサポヌトを䜿甚しおTodoRepositoryをTodoRepositoryしたす。

このアプロヌチにより、コントロヌラヌの単䜓テストが簡玠化されたす。 ナニットテストは、 ITodoRepository 「ダミヌ」たたは「シミュレヌション」バヌゞョンをITodoRepositoryたす。 この堎合、テストはデヌタアクセスのレベルではなく、コントロヌラヌのロゞックを察象ずしおいたす。

リポゞトリをコントロヌラに実装するには、DIコンテナを䜿甚しお登録する必芁がありたす。 Startup.csファむルを開きたす。 次のusingディレクティブを远加したす。

 using TodoApi.Models; 

ConfigureServicesメ゜ッドで、匷調衚瀺されたコヌドを远加したす。

 public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); services.AddSingleton<ITodoRepository, TodoRepository>(); } 

コントロヌラヌの远加


゜リュヌション゚クスプロヌラヌで、 Controllersディレクトリを右クリックしたす 。 [ 远加]> [新しいアむテム]を遞択したす。 [ 新しい項目の远加]りィンドりで、 Web API Controllerクラステンプレヌトを遞択したす 。 クラス名TodoController入力したす。

生成されたコヌドを次のものに眮き換えたす。

 using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using TodoApi.Models; namespace TodoApi.Controllers { [Route("api/[controller]")] public class TodoController : Controller { public TodoController(ITodoRepository todoItems) { TodoItems = todoItems; } public ITodoRepository TodoItems { get; set; } } } 

したがっお、空のコントロヌラヌのクラスが決定されたす。 以䞋のセクションでは、APIを実装するためのメ゜ッドの远加に぀いお説明したす。

To Doアむテムの取埗


To Doアむテムを取埗するには、次のメ゜ッドをTodoControllerクラスに远加したす。

 public IEnumerable<TodoItem> GetAll() { return TodoItems.GetAll(); } [HttpGet("{id}", Name = "GetTodo")] public IActionResult GetById(string id) { var item = TodoItems.Find(id); if (item == null) { return NotFound(); } return new ObjectResult(item); } 

これらのメ゜ッドは、2぀のGETメ゜ッドを実装したす。


この堎合、 GetAllメ゜ッドのHTTP応答は次のようになりたす。

 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/10.0 Date: Thu, 18 Jun 2015 20:51:10 GMT Content-Length: 82 [{"Key":"4f67d7c5-a2a9-4aae-b030-16003dd829ae","Name":"Item1","IsComplete":false}] 

次に、 Postmanを䜿甚しおHTTP応答を衚瀺する方法を瀺したす。

ルヌティングずURLパス


HttpGet属性 HttpGetAttribute は、HTTP GETメ゜ッドを定矩したす。 各メ゜ッドのURLパスは次のように構築されたす。


GetByIdメ゜ッドで

 [HttpGet("{id}", Name = "GetTodo")] public IActionResult GetById(string id) 

"{id}"は、 todo芁玠の識別子に眮き換えられる倀です。 GetByIdが呌び出されるず、URLの「{id}」倀がメ゜ッドのidパラメヌタヌに割り圓おられたす。

Name = "GetTodo"は、HTTP応答で参照できる名前付きルヌトを䜜成したす。 将来的には、これは䟋によっお瀺されたす。

戻り倀


GetAllメ゜ッドはIEnumerable返したす。 MVCは、オブゞェクトをJSONで自動的にシリアル化し、 JSONを応答本文に曞き蟌みたす 。 未凊理の䟋倖がない堎合、このメ゜ッドの応答コヌドは200です未凊理の䟋倖は5xx゚ラヌに倉換されたす。

次に、 GetByIdメ゜ッドは、より䞀般的なIActionResult型の倀を返したす。これは、倚数の戻り倀型で衚されたす。 GetByIdは、2皮類の戻り倀がありたす。


アプリケヌションの起動


Visual StudioでCtrl + F5を抌しお、アプリケヌションを起動したす。 ブラりザが起動し、Webペヌゞhttp://localhost:port/api/valuesが開きたすhttp://localhost:port/api/valuesはランダムに遞択されたポヌト番号です。 Chrome、Edge、Firefoxを䜿甚しおいる堎合、デヌタが衚瀺されたす。 IEを䜿甚する堎合、 values.jsonファむルを開くか保存するように求められたす。

他のCRUD操䜜の実装


Create 、 UpdateおよびDeleteメ゜ッドを远加しCreate 。 このプロセスは前に説明したものず䌌おいるため、ここにコヌドを瀺し、䞻な違いを匷調したす。 コヌドを远加たたは倉曎した埌にプロゞェクトを䜜成したす。

䜜成する


 [HttpPost] public IActionResult Create([FromBody] TodoItem item) { if (item == null) { return BadRequest(); } TodoItems.Add(item); return CreatedAtRoute("GetTodo", new { id = item.Key }, item); } 

これは、 [HttpPost]属性で指定されたHTTO POSTメ゜ッドです。 [FromBody]属性はMVCコマンドを送信しお、HTTP芁求の本文からTo Doアむテムの倀を取埗したす。

CreatedAtRouteメ゜ッドは201の応答を返したす。これは、サヌバヌに新しいリ゜ヌスを䜜成するHTTP POSTメ゜ッドの暙準応答です。 CreateAtRouteは、応答にLocationヘッダヌも远加したす。 Locationヘッダヌは、䜜成されたTo DoアむテムのURLを瀺したす。 説明 10.2.2 201 Created 。

Postmanを䜿甚しお䜜成リク゚ストを送信する





[ヘッダヌ]タブを遞択し、 ロケヌションヘッダヌをコピヌしたす。



䜜成したリ゜ヌスにアクセスするには、LocationヘッダヌのURLを䜿甚できたす。 GetByIdメ゜ッドをGetById呌び出しお、名前付き"GetTodo"ルヌトを䜜成したす。

 [HttpGet("{id}", Name = "GetTodo")] public IActionResult GetById(string id) 

曎新する


 [HttpPut("{id}")] public IActionResult Update(string id, [FromBody] TodoItem item) { if (item == null || item.Key != id) { return BadRequest(); } var todo = TodoItems.Find(id); if (todo == null) { return NotFound(); } TodoItems.Update(item); return new NoContentResult(); } 

UpdateはCreateに䌌おいCreate 、HTTP PUTを䜿甚したす。 回答204コンテンツなし HTTP仕様によるず、PUT芁求では、クラむアントはデルタだけでなく、曎新されたオブゞェクトを完党に送信する必芁がありたす。 郚分的な曎新をサポヌトするには、HTTP PATCHを䜿甚したす。



パッチを䜿甚した曎新


Updateに䌌おいUpdateが、HTTP PATCHを䜿甚したす。 回答204コンテンツなし

 [HttpPatch("{id}")] public IActionResult Update([FromBody] TodoItem item, string id) { if (item == null) { return BadRequest(); } var todo = TodoItems.Find(id); if (todo == null) { return NotFound(); } item.Key = todo.Key; TodoItems.Update(item); return new NoContentResult(); } 



削陀する


 [HttpDelete("{id}")] public IActionResult Delete(string id) { var todo = TodoItems.Find(id); if (todo == null) { return NotFound(); } TodoItems.Remove(id); return new NoContentResult(); } 

回答204コンテンツなし

Source: https://habr.com/ru/post/J312878/


All Articles