Ć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ą uwidocznione jako punkty końcowe HTTP wewnątrz internetowego kontrolera interfejsu API.

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 kontrolera widoku modelu używanej przez internetowy 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 poznane na temat: [ApiController] i [Route]. Tak jak wcześniej [Route] , atrybut definiuje mapowanie na [controller] token. Ponieważ ta klasa kontrolera ma nazwę PizzaController, ten kontroler obsługuje żądania do https://localhost:{PORT}/pizza.

Pobierz 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 naszej usługi.

Zastąp // GET all action komentarz w pliku Controllers/PizzaController.cs następującym kodem:

[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

Powyższa akcja ma następujące działanie:

  • Odpowiada tylko na czasownik HTTP GET , co oznacza atrybut [HttpGet] .
  • ActionResult Zwraca wystąpienie typu List<Pizza>. Typ ActionResult jest klasą bazową dla wszystkich akcji w wyniku ASP.NET Core.
  • Wysyła zapytanie do usługi dla całej pizzy i automatycznie zwraca dane o Content-Type wartości application/json.

Pobieranie jednej pizzy

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 naszej usługi. 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 // GET by Id action komentarz w pliku 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;
}

Powyższa akcja ma następujące działanie:

  • Odpowiada tylko na czasownik HTTP GET , co oznacza atrybut [HttpGet] .
  • Wymaga, aby id wartość parametru została uwzględniona w segmencie adresu URL po pizza/. Pamiętaj, że atrybut na poziomie [Route] kontrolera zdefiniował /pizza wzorzec.
  • Wysyła zapytanie do bazy danych pod kątem pizzy zgodnej z podanym id parametrem.

Każde ActionResult wystąpienie używane w poprzedniej akcji jest mapowane na odpowiedni kod stanu HTTP w poniższej tabeli:

ASP.NET Core
wynik akcji
Kod stanu HTTP opis
Domniemany wynik Ok 200 Produkt zgodny z podanym id parametrem istnieje w pamięci podręcznej w pamięci podręcznej.
Produkt znajduje się w treści odpowiedzi w typie nośnika, zgodnie z definicją w nagłówku accept żądania HTTP (domyślnie JSON).
NotFound 404 Produkt zgodny z podanym id parametrem nie istnieje w pamięci podręcznej 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 kod GET , aby wywołać Pizza punkt końcowy w ### programie seperator:

    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 zwraca 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"
    }
    

Po zakończeniu implementowania GET czasowników. W następnej lekcji możesz dodać więcej akcji, aby PizzaController obsługiwać operacje CRUD na danych 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ć nowo dostępny Pizza punkt końcowy, 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. GET Utwórz żądanie za HttpRepl pomocą 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 zwraca 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.

Po zakończeniu implementowania GET czasowników. W następnej lekcji możesz dodać więcej akcji, aby PizzaController obsługiwać operacje CRUD na danych pizzy.