Ćwiczenie — implementowanie operacji CRUD
Kontynuujmy rozszerzanie kontrolera internetowego interfejsu API, aby dodać możliwość tworzenia (POST), aktualizowania (PUT) i usuwania pizzy (DELETE) z naszego spisu.
Dodawanie pizzy
Włączmy możliwość dodawania pizzy za pośrednictwem internetowego interfejsu API, używając metody POST.
Zastąp komentarz // POST action w pliku Controllers/PizzaController.cs następującym kodem:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
Poprzednia akcja:
- Odpowiada tylko na czasownik HTTP
POST, co oznacza atrybut[HttpPost]. - Wstawia obiekt treści żądania
Pizzado pamięci podręcznej w pamięci.
Uwaga
Ponieważ kontroler ma adnotację w postaci atrybutu [ApiController], zakłada się, że parametr Pizza zostanie znaleziony w treści żądania.
Pierwszy parametr wywołania metody CreatedAtAction reprezentuje nazwę akcji. Słowo kluczowe nameof jest używane, aby uniknąć bezpośredniego kodowania nazwy akcji.
CreatedAtAction Używa nazwy akcji, aby wygenerować location nagłówek odpowiedzi HTTP z adresem URL nowo utworzonej pizzy, jak wyjaśniono w poprzedniej jednostce.
Modyfikowanie pizzy
Teraz umożliwmy aktualizację pizzy za pomocą interfejsu API przy użyciu metody PUT.
Zastąp komentarz // PUT action w pliku Controllers/PizzaController.cs następującym kodem:
[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();
}
Poprzednia akcja:
- Odpowiada tylko na czasownik HTTP PUT, co wskazuje atrybut
[HttpPut]. - Wymaga, aby wartość parametru
idbyła uwzględniona w segmencie adresu URL popizza/. - Zwraca
IActionResult, ponieważ typ zwrotnyActionResultnie jest znany do momentu wykonania. MetodyBadRequest,NotFoundiNoContentzwracają odpowiednio typyBadRequestResult,NotFoundResultiNoContentResult.
Uwaga
Ponieważ kontroler ma adnotację w postaci atrybutu [ApiController], zakłada się, że parametr Pizza zostanie znaleziony w treści żądania.
Usuń pizzę
Na koniec włączmy usunięcie pizzy przez web API przy użyciu metody DELETE.
Zastąp komentarz // DELETE action w pliku Controllers/PizzaController.cs następującym kodem:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
Poprzednia akcja:
- Odpowiada tylko na czasownik HTTP
DELETE, co oznacza atrybut[HttpDelete]. - Wymaga, aby wartość parametru
idbyła uwzględniona w segmencie adresu URL popizza/. - Zwraca
IActionResult, ponieważ zwracany typActionResultnie jest znany do momentu wykonania. MetodyNotFoundiNoContentzwracają odpowiednio typyNotFoundResultiNoContentResult. - Przeszukuje pamięć podręczną w poszukiwaniu pizzy zgodnej z podanym parametrem
id.
Pamiętaj, aby zapisać plik Controllers/PizzaController.cs przed kontynuowaniem,
Kompilowanie i uruchamianie gotowego internetowego interfejsu API
Skompiluj i uruchom internetowy interfejs API, uruchamiając następujące polecenie:
dotnet run
Testowanie gotowego internetowego interfejsu API przy użyciu plików HTTP
Otwórz ponownie plik ContosoPizza.http.
Zrób żądanie dodania nowej pizzy do
POSTużywając następującego polecenia:POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###Poprzednie polecenie zwraca nowo utworzoną pizzę:
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 }Zaktualizuj nową pizzę
Hawaiina pizzęHawaiianza pomocą żądaniaPUT, używając następującego polecenia:PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###Powyższe polecenie zwraca następujące dane wyjściowe, które wskazują powodzenie:
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: KestrelAby sprawdzić, czy pizza została zaktualizowana, ponownie uruchom akcję
GET, używając następującego polecenia:GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###Poprzednie polecenie zwraca nowo zaktualizowaną pizzę:
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 }Nasz interfejs API może również usunąć nowo utworzoną pizzę za pomocą akcji
DELETE, jeśli uruchomisz następujące polecenie:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###Poprzednie polecenie zwraca wynik powodzenia
204 No Content:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelAby sprawdzić, czy pizza została usunięta, uruchom
GETponownie akcję, używając następującego polecenia:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###Poprzednie polecenie zwraca oryginalne pizze jako wyniki:
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 } ]
Teraz zakończono implementowanie i testowanie nowo utworzonego internetowego interfejsu API utworzonego przy użyciu platformy ASP.NET Core.
Opcjonalnie: Testowanie gotowego internetowego interfejsu API przy użyciu wiersza polecenia HTTPREPL
Otwórz ponownie istniejący
httpreplterminal lub otwórz nowy zintegrowany terminal z programu Visual Studio Code, wybierając pozycję Terminal>Nowy terminal z menu głównego.Jeśli otwarto nowy terminal, połącz się z internetowym interfejsem API, uruchamiając następujące polecenie:
httprepl https://localhost:{PORT}Alternatywnie uruchom następujące polecenie w dowolnym momencie, gdy
HttpRepljest uruchomione:connect https://localhost:{PORT}Przejdź do endpointu
Pizzauruchamiając następujące polecenie:cd PizzaUruchom następujące polecenie, aby wyświetlić nowe operacje w API do obsługi pizzy.
lsPoprzednie polecenie przedstawia dane wyjściowe dostępnych interfejsów API dla punktu końcowego
Pizza:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Zrób żądanie dodania nowej pizzy do
POSTużywając następującego polecenia:post -c "{"name":"Hawaii", "isGlutenFree":false}"Poprzednie polecenie zwraca nowo utworzoną pizzę:
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 }Zaktualizuj nową pizzę
Hawaiina pizzęHawaiianza pomocą żądaniaPUT, używając następującego polecenia:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"Powyższe polecenie zwraca następujące dane wyjściowe, które wskazują powodzenie:
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: KestrelAby sprawdzić, czy pizza została zaktualizowana, ponownie uruchom akcję
GET, używając następującego polecenia:get 3Poprzednie polecenie zwraca nowo zaktualizowaną pizzę:
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 }Nasz interfejs API może również usunąć nowo utworzoną pizzę za pomocą akcji
DELETE, jeśli uruchomisz następujące polecenie:delete 3Poprzednie polecenie zwraca wynik powodzenia
204 No Content:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelAby sprawdzić, czy pizza została usunięta, uruchom
GETponownie akcję, używając następującego polecenia:getPoprzednie polecenie zwraca oryginalne pizze jako wyniki:
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 } ]
Teraz zakończono implementowanie i testowanie nowo utworzonego internetowego interfejsu API utworzonego przy użyciu platformy ASP.NET Core.