Cvičení – implementace operací CRUD
Pokračujme rozšířením našeho kontroleru webového rozhraní API, abychom přidali možnost vytvořit (POST
), aktualizovat (PUT
) a odstranit (DELETE
) pizzu z inventáře.
Přidání pizzy
Pojďme povolit přidání pizzy prostřednictvím webového rozhraní API pomocí POST
metody.
V souboru Controllers/PizzaController.cs nahraďte komentář // POST action
následujícím kódem:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
Předcházející akce:
- Reaguje pouze na příkaz HTTP
POST
, jak je označen atributem[HttpPost]
. - Vloží objekt těla
Pizza
požadavku do mezipaměti v paměti.
Poznámka:
Kontroler je anotován atributem [ApiController]
, který označuje, že se parametr Pizza
nachází v textu požadavku.
První parametr ve volání metody CreatedAtAction
představuje název akce. Klíčové slovo nameof
slouží k tomu, aby se předešlo pevnému zakódování názvu akce. CreatedAtAction
pomocí názvu akce vygeneruje hlavičku location
odpovědi HTTP s adresou URL nově vytvořené pizzy, jak je vysvětleno v předchozí lekci.
Úprava pizzy
Teď pomocí metody povolíme aktualizaci pizzy prostřednictvím webového PUT
rozhraní API.
V souboru Controllers/PizzaController.cs nahraďte komentář // PUT action
následujícím kódem:
[HttpPut("{id}")]
public IActionResult Update(int id, Pizza pizza)
{
if (id != pizza.Id)
return BadRequest();
var existingPizza = PizzaService.Get(id);
if(existingPizza is null)
return NotFound();
PizzaService.Update(pizza);
return NoContent();
}
Předcházející akce:
- Reaguje pouze na příkaz HTTP PUT, jak označuje atribut
[HttpPut]
. - Vyžaduje, aby
id
hodnota parametru byla zahrnuta do segmentu adresy URL zapizza/
. - Vrátí
IActionResult
hodnotu , protože návratovýActionResult
typ není známý, dokud modul runtime. ,BadRequest
NotFound
aNoContent
metody vracíBadRequestResult
,NotFoundResult
aNoContentResult
typy, v uvedeném pořadí.
Poznámka:
Kontroler je anotován atributem [ApiController]
, který označuje, že se parametr Pizza
nachází v textu požadavku.
Odebrání pizzy
Nakonec povolíme odebrání pizzy prostřednictvím webového rozhraní API pomocí DELETE
metody.
V souboru Controllers/PizzaController.cs nahraďte komentář // DELETE action
následujícím kódem:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
Předcházející akce:
- Reaguje pouze na příkaz HTTP
DELETE
, jak je označen atributem[HttpDelete]
. - Vyžaduje, aby
id
hodnota parametru byla zahrnuta do segmentu adresy URL zapizza/
. - Vrátí
IActionResult
, protože návratový typActionResult
není znám až do doby běhu. MetodyNotFound
aNoContent
vracejí typyNotFoundResult
aNoContentResult
(v uvedeném pořadí). - Dotazuje mezipaměť v paměti na pizzu, která odpovídá zadanému
id
parametru.
Než budete pokračovat, nezapomeňte soubor Controllers/PizzaController.cs uložit.
Sestavení a spuštění dokončeného webového rozhraní API
Spuštěním následujícího příkazu sestavte a spusťte webové rozhraní API:
dotnet run
Testování dokončeného webového rozhraní API pomocí souborů HTTP
Znovu otevřete soubor ContosoPizza.http.
Pomocí
POST
následujícího příkazu vytvořte žádost o přidání nové pizzyHttpRepl
:POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###
Předchozí příkaz vrátí nově vytvořenou pizzu:
HTTP/1.1 201 Created Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 17:03:02 GMT Server: Kestrel Location: http://localhost:5192/Pizza/3 Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }
Aktualizujte novou
Hawaii
pizzu na pizzuHawaiian
PUT
pomocí požadavku pomocí následujícího příkazu:PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###
Předchozí příkaz vrátí následující výstup, který označuje úspěch:
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: Kestrel
Pokud chcete ověřit, že se pizza aktualizovala, spusťte
GET
akci znovu pomocí následujícího příkazu:GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###
Předchozí příkaz vrátí nově aktualizovanou pizzu:
HTTP/1.1 200 OK Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 17:09:01 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaiian", "isGlutenFree": false }
Pokud spustíte následující příkaz, může naše rozhraní API také odstranit nově vytvořenou pizzu
DELETE
prostřednictvím akce:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###
Předchozí příkaz vrátí
204 No Content
výsledek pro úspěch:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Pokud chcete ověřit, že se pizza odebrala, spusťte
GET
akci znovu pomocí následujícího příkazu:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
Předchozí příkaz vrátí původní pizzy jako výsledky:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:31:15 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]
Dokončili jste implementaci a testování nově vytvořeného webového rozhraní API vytvořeného pomocí ASP.NET Core.
Volitelné: Otestování dokončeného webového rozhraní API pomocí httpREPL příkazového řádku
Znovu otevřete existující
httprepl
terminál nebo otevřete nový integrovaný terminál v editoru Visual Studio Code tak, že v hlavní nabídce vyberete Terminál>nový terminál.Pokud jste otevřeli nový terminál, připojte se k webovému rozhraní API spuštěním následujícího příkazu:
httprepl https://localhost:{PORT}
Případně můžete při spuštění kdykoli
HttpRepl
spustit následující příkaz:connect https://localhost:{PORT}
Spuštěním následujícího příkazu přejděte ke koncovému
Pizza
bodu:cd Pizza
Spuštěním následujícího příkazu zobrazte nové akce v rozhraní Pizza API:
ls
Předchozí příkaz zobrazí výstup dostupných rozhraní API pro
Pizza
koncový bod:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]
Pomocí
POST
následujícího příkazu vytvořte žádost o přidání nové pizzyHttpRepl
:post -c "{"name":"Hawaii", "isGlutenFree":false}"
Předchozí příkaz vrátí nově vytvořenou pizzu:
HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:23:09 GMT Location: https://localhost:{PORT}/Pizza?id=3 Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaii", "isGlutenFree": false }
Aktualizujte novou
Hawaii
pizzu na pizzuHawaiian
PUT
pomocí požadavku pomocí následujícího příkazu:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
Předchozí příkaz vrátí následující výstup, který označuje úspěch:
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: Kestrel
Pokud chcete ověřit, že se pizza aktualizovala, spusťte
GET
akci znovu pomocí následujícího příkazu:get 3
Předchozí příkaz vrátí nově aktualizovanou pizzu:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:27:37 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 3, "name": "Hawaiian", "isGlutenFree": false }
Pokud spustíte následující příkaz, může naše rozhraní API také odstranit nově vytvořenou pizzu
DELETE
prostřednictvím akce:delete 3
Předchozí příkaz vrátí
204 No Content
výsledek pro úspěch:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Pokud chcete ověřit, že se pizza odebrala, spusťte
GET
akci znovu pomocí následujícího příkazu:get
Předchozí příkaz vrátí původní pizzy jako výsledky:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 23:31:15 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]
Dokončili jste implementaci a testování nově vytvořeného webového rozhraní API vytvořeného pomocí ASP.NET Core.