Ćwiczenie — dodawanie kontrolera
Kontroler jest klasą publiczną z co najmniej jedną publiczną metodą znaną jako akcje. Zgodnie z konwencją kontroler jest umieszczany w katalogu kontrolerów głównego projektu. Akcje są udostępniane jako punkty końcowe HTTP wewnątrz kontrolera API sieciowego.
Tworzenie kontrolera
Wybierz folder Controllers w programie Visual Studio Code i dodaj nowy plik o nazwie PizzaController.cs.
Pusty plik klasy o nazwie PizzaController.cs jest tworzony w katalogu Controllers . Nazwa katalogu Controllers jest konwencją. Nazwa katalogu pochodzi z architektury model-widok-kontroler używanej przez webowy interfejs API.
Uwaga
Zgodnie z konwencją nazwy klas kontrolerów mają sufiks Controller.
Dodaj następujący kod do kontrolerów/PizzaController.cs. Zapisz zmiany.
using ContosoPizza.Models; using ContosoPizza.Services; using Microsoft.AspNetCore.Mvc; namespace ContosoPizza.Controllers; [ApiController] [Route("[controller]")] public class PizzaController : ControllerBase { public PizzaController() { } // GET all action // GET by Id action // POST action // PUT action // DELETE action }Jak wspomniano wcześniej, ta klasa pochodzi z
ControllerBaseklasy bazowej do pracy z żądaniami HTTP w ASP.NET Core. Zawiera również dwa standardowe atrybuty, o których się nauczyłeś:[ApiController]i[Route]. Tak jak wcześniej, atrybut[Route]definiuje mapowanie na token[controller]. Ponieważ ta klasa kontrolera ma nazwęPizzaController, ten kontroler obsługuje żądania dohttps://localhost:{PORT}/pizza.
Zdobądź wszystkie pizze
Pierwsze zlecenie REST, które należy zaimplementować, to GET, gdzie klient może pobrać wszystkie pizze z interfejsu API. Możesz użyć wbudowanego [HttpGet] atrybutu, aby zdefiniować metodę zwracającą pizze z naszego serwisu.
Zastąp komentarz // GET all action w Controllers/PizzaController.cs następującym kodem:
[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
PizzaService.GetAll();
Poprzednia akcja:
- Odpowiada tylko na czasownik HTTP
GET, co oznacza atrybut[HttpGet]. -
ActionResultZwraca wystąpienie typuList<Pizza>. TypActionResultjest klasą bazową dla wszystkich wyników akcji w ASP.NET Core. - Wysyła zapytanie do usługi dla całej pizzy i automatycznie zwraca dane o
Content-Typewartościapplication/json.
Pobierz jedną pizzę
Klient może również zażądać informacji o określonej pizzy zamiast całej listy. Możesz zaimplementować inną GET akcję, która wymaga parametru id . Możesz użyć wbudowanego [HttpGet("{id}")] atrybutu, aby zdefiniować metodę zwracającą pizze z naszego serwisu. Logika routingu rejestruje [HttpGet] (bez id) i [HttpGet("{id}")] (z id) jako dwie różne trasy. Następnie możesz napisać oddzielną akcję w celu pobrania pojedynczego elementu.
Zastąp komentarz // GET by Id action w Controllers/PizzaController.cs następującym kodem:
[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
var pizza = PizzaService.Get(id);
if(pizza == null)
return NotFound();
return pizza;
}
Poprzednia akcja:
- Odpowiada tylko na czasownik HTTP
GET, co oznacza atrybut[HttpGet]. - Wymaga, aby wartość parametru
idzostała uwzględniona w segmencie adresu URL popizza/. Pamiętaj, że atrybut[Route]na poziomie kontrolera zdefiniował wzorzec/pizza. - Wysyła zapytanie do bazy danych w celu znalezienia pizzy zgodnej z podanym
idparametrem.
Każda instancja ActionResult, używana w poprzedniej akcji, jest mapowana na odpowiedni kod stanu HTTP w poniższej tabeli.
| ASP.NET Core wynik akcji |
Kod stanu HTTP | opis |
|---|---|---|
Ok jest domniemane |
200 | Produkt zgodny z podanym id parametrem istnieje w pamięci podręcznej.Produkt znajduje się w treści odpowiedzi w formacie mediów (domyślnie JSON), zgodnie z definicją w nagłówku accept żądania HTTP. |
NotFound |
404 | Produkt zgodny z podanym id parametrem nie istnieje w pamięci podręcznej. |
Kompilowanie i uruchamianie nowego kontrolera
Skompiluj i uruchom internetowy interfejs API, uruchamiając następujące polecenie:
dotnet run
Testowanie kontrolera za pomocą pliku Http
Otwórz plik ContosoPizza.http
Dodaj nowy GET, aby wywołać
Pizzapunkt końcowy pod separatorem ###.GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###Wybierz polecenie Wyślij żądanie powyżej tego nowego wywołania GET.
Powyższe polecenie zwraca listę wszystkich pizz w formacie JSON:
HTTP/1.1 200 OK Connection: close Content-Type: application/json; charset=utf-8 Date: Wed, 17 Jan 2024 16:57:09 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]Aby wykonać zapytanie dotyczące pojedynczej pizzy, możesz wysłać inne
GETżądanie, ale przekazaćidparametr przy użyciu następującego polecenia:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###Powyższe polecenie zwraca
Classic Italiannastępujące dane wyjściowe:HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 21:57:57 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 1, "name": "Classic Italian", "isGlutenFree": false }Nasz interfejs API obsługuje również sytuacje, w których element nie istnieje. Ponownie wywołaj interfejs API, ale przekaż nieprawidłowy parametr pizza
idprzy użyciu następującego polecenia:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###Poprzednie polecenie wyświetla
404 Not Foundbłąd z następującymi danymi wyjściowymi:HTTP/1.1 404 Not Found Content-Type: application/problem+json; charset=utf-8 Date: Fri, 02 Apr 2021 22:03:06 GMT Server: Kestrel Transfer-Encoding: chunked { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4", "title": "Not Found", "status": 404, "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00" }
Gdy zakończyłeś implementację GET czasowników. W następnej jednostce możesz dodać więcej akcji do PizzaController, aby obsługiwać operacje CRUD na danych dotyczących pizzy.
Opcjonalnie: Przetestuj kontroler za pomocą pętli REPL (Command Line HTTP Read-Eval-Print Loop)
Otwórz istniejący
httpreplterminal lub otwórz nowy zintegrowany terminal z programu Visual Studio Code, wybierając pozycję Terminal>Nowy terminal z menu głównego.Połącz się z naszym 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}Aby wyświetlić dostępny nowy punkt końcowy
Pizza, uruchom następujące polecenie:lsPoprzednie polecenie wykrywa wszystkie interfejsy API dostępne w połączonym punkcie końcowym. Powinien zostać wyświetlony następujący kod:
https://localhost:{PORT}/> ls . [] Pizza [GET] WeatherForecast [GET]Przejdź do punktu końcowego
Pizza, uruchamiając następujące polecenie:cd PizzaPoprzednie polecenie przedstawia dane wyjściowe dostępnych interfejsów API dla punktu końcowego
Pizza:https://localhost:{PORT}/> cd Pizza /Pizza [GET]Wykonaj żądanie w
GETza pomocąHttpReplnastępującego polecenia:getPowyższe polecenie zwraca listę wszystkich pizz w formacie JSON:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 21:55:53 GMT Server: Kestrel Transfer-Encoding: chunked [ { "id": 1, "name": "Classic Italian", "isGlutenFree": false }, { "id": 2, "name": "Veggie", "isGlutenFree": true } ]Aby wykonać zapytanie dotyczące pojedynczej pizzy, możesz wysłać inne
GETżądanie, ale przekazaćidparametr przy użyciu następującego polecenia:get 1Powyższe polecenie zwraca
Classic Italiannastępujące dane wyjściowe:HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Fri, 02 Apr 2021 21:57:57 GMT Server: Kestrel Transfer-Encoding: chunked { "id": 1, "name": "Classic Italian", "isGlutenFree": false }Nasz interfejs API obsługuje również sytuacje, w których element nie istnieje. Ponownie wywołaj interfejs API, ale przekaż nieprawidłowy parametr pizza
idprzy użyciu następującego polecenia:get 5Poprzednie polecenie wyświetla
404 Not Foundbłąd z następującymi danymi wyjściowymi:HTTP/1.1 404 Not Found Content-Type: application/problem+json; charset=utf-8 Date: Fri, 02 Apr 2021 22:03:06 GMT Server: Kestrel Transfer-Encoding: chunked { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4", "title": "Not Found", "status": 404, "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00" }Wróć do terminalu na
dotnetliście rozwijanej w programie Visual Studio Code i zamknij internetowy interfejs API, wybierając CTRL+C na klawiaturze.
Gdy zakończyłeś implementację GET czasowników. W następnej jednostce możesz dodać więcej akcji do PizzaController, aby obsługiwać operacje CRUD na danych dotyczących pizzy.