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 // POST action nahraďte komentář Controllers/PizzaController.cs 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
Pizzapož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 // PUT action nahraďte komentář Controllers/PizzaController.cs 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
idhodnota parametru byla zahrnuta do segmentu adresy URL zapizza/. - Vrátí
IActionResulthodnotu , protože návratovýActionResulttyp není známý, dokud modul runtime. ,BadRequestNotFoundaNoContentmetody vracíBadRequestResult,NotFoundResultaNoContentResulttypy, 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 // DELETE action nahraďte komentář Controllers/PizzaController.cs 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
idhodnota parametru byla zahrnuta do segmentu adresy URL zapizza/. - Vrátí
IActionResult, protože návratový typActionResultnení znám až do doby běhu. MetodyNotFoundaNoContentvracejí typyNotFoundResultaNoContentResult(v uvedeném pořadí). - Dotazuje mezipaměť v paměti na pizzu, která odpovídá zadanému
idparametru.
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í
POSTná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
Hawaiipizzu na pizzuHawaiianPUTpomocí 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: KestrelPokud chcete ověřit, že se pizza aktualizovala, spusťte
GETakci 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
DELETEprostřednictvím akce:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###Předchozí příkaz vrátí
204 No Contentvýsledek pro úspěch:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPokud chcete ověřit, že se pizza odebrala, spusťte
GETakci 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í
httpreplterminá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
HttpReplspustit 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
Pizzabodu:cd PizzaSpuštěním následujícího příkazu zobrazte nové akce v rozhraní Pizza API:
lsPředchozí příkaz zobrazí výstup dostupných rozhraní API pro
Pizzakoncový bod:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Pomocí
POSTná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
Hawaiipizzu na pizzuHawaiianPUTpomocí 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: KestrelPokud chcete ověřit, že se pizza aktualizovala, spusťte
GETakci znovu pomocí následujícího příkazu:get 3Př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
DELETEprostřednictvím akce:delete 3Předchozí příkaz vrátí
204 No Contentvýsledek pro úspěch:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPokud chcete ověřit, že se pizza odebrala, spusťte
GETakci znovu pomocí následujícího příkazu:getPř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.