Ć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
Pizza
do 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
id
była uwzględniona w segmencie adresu URL popizza/
. - Zwraca
IActionResult
, ponieważ typ zwrotnyActionResult
nie jest znany do momentu wykonania. MetodyBadRequest
,NotFound
iNoContent
zwracają odpowiednio typyBadRequestResult
,NotFoundResult
iNoContentResult
.
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
id
została uwzględniona w segmencie URL popizza/
. - Zwraca
IActionResult
, ponieważ zwracany typActionResult
nie jest znany do momentu wykonania. MetodyNotFound
iNoContent
zwracają odpowiednio typyNotFoundResult
iNoContentResult
. - 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
HttpRepl
uż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ę
Hawaii
na pizzęHawaiian
za 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: Kestrel
Aby 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: Kestrel
Aby sprawdzić, czy pizza została usunięta, uruchom
GET
ponownie 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
httprepl
terminal 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
HttpRepl
jest uruchomione:connect https://localhost:{PORT}
Przejdź do endpointu
Pizza
uruchamiając następujące polecenie:cd Pizza
Uruchom następujące polecenie, aby wyświetlić nowe operacje w API do obsługi pizzy.
ls
Poprzednie 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]
Złóż żądanie o dodanie nowej pizzy w
HttpRepl
uż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ę
Hawaii
do pizzyHawaiian
za 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: Kestrel
Aby sprawdzić, czy pizza została zaktualizowana, ponownie uruchom akcję
GET
używając następującego polecenia:get 3
Poprzednie 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 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: Kestrel
Aby sprawdzić, czy pizza została usunięta, uruchom
GET
ponownie akcję, używając następującego polecenia:get
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.