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} | ã¢ã€ãã ãåé€ | ãã | ãã |
次ã®å³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã瀺ããŠããŸãã

- ã¯ã©ã€ã¢ã³ãã¯ãWeb APIïŒãã©ãŠã¶ãŒãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãªã©ïŒã䜿çšãããœãããŠã§ã¢ã§ãã ãã®èšäºã§ã¯ãã¯ã©ã€ã¢ã³ãã¯äœæãããŸããã Postmanã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããã¹ãããŸãã
- ã¢ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³å
ã®ããŒã¿ã衚ããªããžã§ã¯ãã§ãã ãã®å Žåãå¯äžã®ã¢ãã«ã¯To Doã¢ã€ãã ã§ãã ã¢ãã«ã¯åçŽãªCïŒã¯ã©ã¹ïŒPOCOïŒã§è¡šãããŸãã
- ã³ã³ãããŒã©ãŒã¯ãHTTPèŠæ±ãåŠçããHTTPå¿çãäœæãããªããžã§ã¯ãã§ãã ãã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯1ã€ã®ã³ã³ãããŒã©ãŒããããŸãã
- ç°¡åã«ããããã«ããã®è³æã§ã¯ããŒã¿ããŒã¹ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸããã 代ããã«ããªã¹ãé
ç®ã¯åã«ã¡ã¢ãªã«ä¿åãããŸãã ãã ããWeb APIãšããŒã¿ã¬ã€ã€ãŒã®åé¢ã瀺ãããã«ãããŒã¿ã¢ã¯ã»ã¹ã¬ã€ã€ãŒãå«ãŸããŸãã ããŒã¿ããŒã¹ã䜿çšãããªãã·ã§ã³ã«ã€ããŠã¯ã èšäºã§èª¬æããŠããŸã ã
ãããžã§ã¯ãäœæ
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) {
ã³ã³ãããŒã©ãŒã®è¿œå
ãœãªã¥ãŒã·ã§ã³ãšã¯ã¹ãããŒã©ãŒã§ã
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ã¡ãœãããå®è£
ããŸãã
GET /api/todo
GET /api/todo/{id}
ãã®å Žåã
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ãã¹ã¯æ¬¡ã®ããã«æ§ç¯ãããŸãã
- ã³ã³ãããŒã©ãŒã®ã«ãŒã屿§ãããã³ãã¬ãŒãæååã
[Route("api/[controller]")]
ãŸãïŒ [Route("api/[controller]")]
- [Controller]ããã³ã³ãããŒã©ãŒã¯ã©ã¹ã®ååãååŸããæ¥å°ŸèŸãControllerããåé€ããŠååŸããã³ã³ãããŒã©ãŒã®ååã«çœ®ãæããŸãã ãã®äŸã§ã¯ãã³ã³ãããŒã©ãŒã¯ã©ã¹åã¯Todo Controllerã§ãã«ãŒãåã¯todoã§ãã ASP.NET Core ã«ãŒãã£ã³ã°ã¯å€§æåãšå°æåãåºå¥ããŸããã
[HttpGet]
屿§ã«ãã³ãã¬ãŒãæååãããå Žåã¯ããã¹ã«è¿œå ããŸãã ãã®äŸã§ã¯ããã³ãã¬ãŒãæååã¯äœ¿çšãããŠããŸããã
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çš®é¡ã®æ»ãå€ããããŸãã
- èŠæ±ãããèå¥åã«äžèŽãããã®ããªãå Žåãã¡ãœããã¯404ãšã©ãŒãè¿ããŸãããã¯
NotFound
ãæ»ã£ããšãã«çºçããŸãã - ãã以å€ã®å Žåãã¡ãœããã¯200ã³ãŒããšå¿çæ¬æãJSON圢åŒã§è¿ããŸãã ããã¯ã
ObjectResult
ãæ»ããšãã«çºçããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®èµ·å
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ã䜿çšããŠäœæãªã¯ãšã¹ããéä¿¡ãã

- HTTPã¡ãœãããšããŠ
POST
ãèšå®ããŸãã - Bodyã¹ã€ãããéžæããŸãã
- rawã¹ã€ãããéžæããŸãã
- JSONã¿ã€ããéžæããŸãã
- ããŒãšå€ã®ãã¢ã®ãšãã£ã¿ãŒã§ã次ã®ããã«TodoèŠçŽ ãæå®ããŸãïŒ
{"Name":"<your to-do item>"}
ã - éä¿¡ãã¯ãªãã¯ããŸãã
[ããããŒ]ã¿ããéžæãã
ãã±ãŒã·ã§ã³ããããŒãã³ããŒããŸãã

äœæãããªãœãŒã¹ã«ã¢ã¯ã»ã¹ããã«ã¯ã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ïŒã³ã³ãã³ããªãïŒ