Cvičení – implementace operací CRUD

Dokončeno

Pojďme dál rozšiřovat náš kontroler webového rozhraní API, aby se přidala možnost vytvářet ( POST ), aktualizovat () PUT a odstraňovat ( DELETE ) Pizza z našeho inventáře.

Přidat Pizza

Umožníme Pizza přidat prostřednictvím našeho webového rozhraní API POST metodou.

  1. 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(Create), new { id = pizza.Id }, pizza);
    }
    

    Předcházející akce:

    • Reaguje pouze na příkaz HTTP POST, jak označuje atribut [HttpPost].
    • Vloží objekt textu žádosti Pizza 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 location hlavičku odpovědi HTTP s adresou URL nově vytvořeného Pizza, jak je vysvětleno v předchozí jednotce.

Úprava Pizza

Umožníme, aby se pizza aktualizovala prostřednictvím našeho webového rozhraní API PUT metodou.

  1. 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 uvedena v segmentu adresy URL po pizza/ .
    • Vrátí IActionResult, protože návratový typ ActionResult není znám až do doby běhu. Metody, a vrací, a v BadRequest NotFound NoContent BadRequestResult NotFoundResult NoContentResult 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.

Odebrat Pizza

Pojďme povolit odebrání Pizza prostřednictvím našeho webového rozhraní API DELETE metodou.

  1. 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 označuje atribut [HttpDelete].
    • Vyžaduje, aby id hodnota tohoto parametru byla uvedena v segmentu adresy URL po pizza/ .
    • Vrátí IActionResult, protože návratový typ ActionResult není znám až do doby běhu. Metody NotFound a NoContent vracejí typy NotFoundResult a NoContentResult (v uvedeném pořadí).
    • Dotazuje se na mezipaměť v paměti pro Pizza, který odpovídá zadanému id parametru.

Sestavení a spuštění dokončeného webového rozhraní API

  1. Sestavte a spusťte webové rozhraní API spuštěním následujícího příkazu:

    dotnet run
    
  2. httpreplkliknutím na terminálu > nový terminál z hlavní nabídky otevřete existující terminál nebo otevřete nový integrovaný terminál z Visual Studio Code.

  3. Pokud jste otevřeli nový terminál, připojte se k našemu webovému rozhraní API spuštěním následujícího příkazu:

    httprepl http://localhost:5000
    

    Případně spusťte následující příkaz kdykoli, když je spuštěný HttpRepl:

    Například:

    (Disconnected)> connect http://localhost:5000
    

    Přejděte ke koncovému bodu Pizza spuštěním následujícího příkazu:

    cd Pizza
    
  4. Spusťte následující příkaz, který zobrazí nové akce v rozhraní Pizza API:

    ls
    

    Předchozí příkaz zobrazí výstup dostupných rozhraní API dostupných pro Pizza koncový bod:

        http://localhost:5000/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. Vytvořte POST žádost o přidání nového Pizza do HttpRepl pomocí následujícího příkazu:

    post -c "{"name":"Hawaii", "isGlutenFree":false}"
    

    Následující příkaz vytvoří POST žádost o přidání nového Pizza do inventáře a potom vrátí seznam všech Pizza zpět:

    HTTP/1.1 201 Created
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:23:09 GMT
    Location: http://localhost:5000/Pizza?id=3
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
  6. Pojďme aktualizovat nový Hawaii Pizza na Hawaiian Pizza s PUT požadavkem s následujícím příkazem:

    put 3 -c  "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
    

    Tato akce vrátí následující výstup, který byl úspěšný:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:23:55 GMT
    Server: Kestrel
    

    Pokud chcete ověřit, že se pizza aktualizoval, můžeme akci znovu spustit GET pomocí následujícího příkazu:

    get 3
    

    Tato akce vrátí nově aktualizované Pizza:

    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
    }
    
  7. Naše rozhraní API může také odstranit nově vytvořená Pizza s DELETE akcí spuštěním následujícího příkazu:

    delete 3
    

    Tím se vrátí odpověď 204 No Content 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 odebral, můžeme akci znovu spustit GET pomocí následujícího příkazu:

    get
    

    Tím se vrátí naše původní pizzas 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
        }
    ]
    

Nyní jsme dokončili implementaci a testování našeho nově vytvořeného webového rozhraní API vytvořeného pomocí ASP.NET Core. V dalším kroku nabídneme několik osvědčených postupů a dalších výukových modulů.