Ćwiczenie — dodawanie kontrolera

Ukończone

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

  1. Wybierz folder Controllers w programie Visual Studio Code i dodaj nowy plik o nazwie PizzaController.cs.

    Zrzut ekranu programu Visual Studio Code przedstawiający dodawanie nowego pliku do folderu Controllers.

    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.

  2. 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 do https://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] .
  • ActionResult Zwraca wystąpienie typu List<Pizza>. Typ ActionResult jest 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-Type wartości application/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 id została uwzględniona w segmencie adresu URL po pizza/. Pamiętaj, że atrybut [Route] na poziomie kontrolera zdefiniował wzorzec /pizza.
  • Wysyła zapytanie do bazy danych w celu znalezienia pizzy zgodnej z podanym id parametrem.

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

  1. Otwórz plik ContosoPizza.http

  2. Dodaj nowy GET, aby wywołać Pizza punkt końcowy pod separatorem ###.

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. 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
        }
    ]   
    
  4. Aby wykonać zapytanie dotyczące pojedynczej pizzy, możesz wysłać inne GET żądanie, ale przekazać id parametr przy użyciu następującego polecenia:

    GET {{ContosoPizza_HostAddress}}/pizza/1
    Accept: application/json
    
    ###
    

    Powyższe polecenie zwraca Classic Italian nastę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
    }
    
  5. 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 id przy użyciu następującego polecenia:

    GET {{ContosoPizza_HostAddress}}/pizza/5
    Accept: application/json
    
    ###
    

    Poprzednie polecenie wyświetla 404 Not Found błą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)

  1. Otwórz 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.

  2. 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 HttpRepl jest uruchomione:

    connect https://localhost:{PORT}
    
  3. Aby wyświetlić dostępny nowy punkt końcowy Pizza, uruchom następujące polecenie:

    ls
    

    Poprzednie 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]
    
  4. Przejdź do punktu końcowego Pizza , uruchamiając następujące polecenie:

    cd Pizza
    

    Poprzednie polecenie przedstawia dane wyjściowe dostępnych interfejsów API dla punktu końcowego Pizza :

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. Wykonaj żądanie w GET za pomocą HttpRepl następującego polecenia:

    get
    

    Powyż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
          }
      ]
    
  6. Aby wykonać zapytanie dotyczące pojedynczej pizzy, możesz wysłać inne GET żądanie, ale przekazać id parametr przy użyciu następującego polecenia:

    get 1
    

    Powyższe polecenie zwraca Classic Italian nastę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
    }
    
  7. 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 id przy użyciu następującego polecenia:

    get 5
    

    Poprzednie polecenie wyświetla 404 Not Found błą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"
    }
    
  8. Wróć do terminalu na dotnet liś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.