Ć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 dodawanie pizzy za pośrednictwem internetowego interfejsu API przy użyciu POST
metody .
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);
}
Powyższa akcja ma następujące działanie:
- 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 nie kodować nazwy akcji trwale. CreatedAtAction
Używa nazwy akcji, aby wygenerować location
nagłówek odpowiedzi HTTP z adresem URL nowo utworzonej pizzy, jak wyjaśniono w poprzedniej lekcji.
Modyfikowanie pizzy
Teraz włączmy aktualizację pizzy za pośrednictwem internetowego interfejsu API przy użyciu PUT
metody .
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();
}
Powyższa akcja ma następujące działanie:
- Odpowiada tylko na czasownik HTTP PUT, co wskazuje atrybut
[HttpPut]
. - Wymaga, aby
id
wartość parametru została uwzględniona w segmencie adresu URL popizza/
. - Zwraca wartość
IActionResult
, ponieważ zwracanyActionResult
typ nie jest znany do czasu wykonania. MetodyBadRequest
,NotFound
iNoContent
zwracająBadRequestResult
odpowiednio typy ,NotFoundResult
iNoContentResult
.
Uwaga
Ponieważ kontroler ma adnotację w postaci atrybutu [ApiController]
, zakłada się, że parametr Pizza
zostanie znaleziony w treści żądania.
Usuwanie pizzy
Na koniec włączmy usunięcie pizzy za pośrednictwem internetowego interfejsu API przy użyciu DELETE
metody .
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();
}
Powyższa akcja ma następujące działanie:
- Odpowiada tylko na czasownik HTTP
DELETE
, co oznacza atrybut[HttpDelete]
. - Wymaga, aby
id
wartość parametru została uwzględniona w segmencie adresu URL popizza/
. - Zwraca element
IActionResult
, ponieważ zwracany typActionResult
nie jest znany do czasu wykonania. MetodyNotFound
iNoContent
zwracają odpowiednio typyNotFoundResult
iNoContentResult
. - Wysyła zapytanie do pamięci podręcznej pizzy zgodnej z podanym
id
parametrem.
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.
POST
Utwórz żądanie dodania nowej pizzy przyHttpRepl
użyciu 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ą
Hawaii
pizzęHawaiian
do pizzy zaPUT
pomocą żądania, 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, uruchom
GET
ponownie akcję, 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ę
DELETE
za pomocą akcji, 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 punktu końcowego
Pizza
, uruchamiając następujące polecenie:cd Pizza
Uruchom następujące polecenie, aby wyświetlić nowe akcje w interfejsie API 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]
POST
Utwórz żądanie dodania nowej pizzy przyHttpRepl
użyciu 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ą
Hawaii
pizzęHawaiian
do pizzy zaPUT
pomocą żądania, 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, uruchom
GET
ponownie akcję, 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ę
DELETE
za pomocą akcji, 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.