Alıştırma - Denetleyici ekleme

Tamamlandı

Denetleyici, eylemler olarak bilinen bir veya daha fazla genel yönteme sahip bir ortak sınıftır. Kural gereği, bir denetleyici proje kök dizininin Controllers dizinine yerleştirilir. Eylemler, web API denetleyicisi içinde HTTP uç noktaları olarak sunulur.

Denetleyici oluşturma

  1. Visual Studio Code'da Denetleyiciler klasörünü seçin ve PizzaController.cs adlı yeni bir dosya ekleyin.

    Denetleyiciler klasörüne yeni bir dosya eklemeyi gösteren Visual Studio Code'un ekran görüntüsü.

    Denetleyiciler dizininde PizzaController.cs adlı boş bir sınıf dosyası oluşturulur. Denetleyiciler dizin adı bir kuraldır. Dizin adı, web API'sinin kullandığı model-view-controller mimarisinden gelir.

    Not

    Kural gereği, denetleyici sınıfı adlarının sonuna Controller eklenir.

  2. Denetleyiciler/PizzaController.cs aşağıdaki kodu ekleyin. Değişikliklerinizi kaydedin.

    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
    }
    

    Daha önce öğrendiğiniz gibi bu sınıf, ASP.NET Core'da HTTP istekleriyle çalışmaya yönelik temel sınıfından ControllerBasetüretilir. Ayrıca, hakkında öğrendiğiniz iki standart özniteliği de içerir: [ApiController] ve [Route]. Özniteliği daha [Route] önce olduğu gibi belirteçle [controller] bir eşleme tanımlar. Bu denetleyici sınıfı adlı PizzaControllerolduğundan, bu denetleyici istekleri https://localhost:{PORT}/pizzaişler.

Tüm pizzaları al

Uygulamanız gereken ilk REST fiili, bir istemcinin API'den tüm pizzaları alabildiği uygulamasıdır GET. Hizmetimizden pizzaları döndüren bir yöntem tanımlamak için yerleşik [HttpGet] özniteliğini kullanabilirsiniz.

// GET all action Controllers/PizzaController.cs içindeki açıklamayı aşağıdaki kodla değiştirin:

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

Yukarıdaki eylem:

  • Özniteliği tarafından belirtildiği gibi yalnızca HTTP GET fiiline [HttpGet] yanıt verir.
  • türünde List<Pizza>bir ActionResult örnek döndürür. türü ActionResult , ASP.NET Core'daki tüm eylem sonuçlarının temel sınıfıdır.
  • Tüm pizzalar için hizmeti sorgular ve değeri application/jsonolan Content-Type verileri otomatik olarak döndürür.

Tek bir pizza alma

İstemci ayrıca listenin tamamı yerine belirli bir pizza hakkında bilgi istemek isteyebilir. Parametre gerektiren başka bir GET id eylem uygulayabilirsiniz. Hizmetimizden pizzaları döndüren bir yöntem tanımlamak için yerleşik [HttpGet("{id}")] özniteliğini kullanabilirsiniz. Yönlendirme mantığı iki farklı yol olarak (olmadanid) ve [HttpGet("{id}")] (ileid) kaydeder [HttpGet] . Ardından tek bir öğeyi almak için ayrı bir eylem yazabilirsiniz.

// GET by Id action Controllers/PizzaController.cs içindeki açıklamayı aşağıdaki kodla değiştirin:

[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

Yukarıdaki eylem:

  • Özniteliği tarafından belirtildiği gibi yalnızca HTTP GET fiiline [HttpGet] yanıt verir.
  • parametresinin değerinin id sonrasında pizza/URL kesimine eklenmesini gerektirir. Denetleyici düzeyi [Route] özniteliğinin deseni tanımladığını /pizza unutmayın.
  • Sağlanan id parametreyle eşleşen bir pizza için veritabanını sorgular.

Önceki eylemde kullanılan her ActionResult örnek, aşağıdaki tabloda karşılık gelen HTTP durum koduyla eşlenir:

ASP.NET Core
eylem sonucu
HTTP durum kodu Açıklama
Ok belirtiliyor 200 Sağlanan id parametreyle eşleşen bir ürün bellek içi önbellekte var.
Ürün, HTTP isteği üst bilgisinde (varsayılan olarak JSON) tanımlandığı gibi medya türündeki yanıt gövdesine accept eklenir.
NotFound 404 Sağlanan id parametreyle eşleşen bir ürün bellek içi önbellekte yok.

Yeni denetleyiciyi derleme ve çalıştırma

Aşağıdaki komutu çalıştırarak web API'sini derleyin ve başlatın:

dotnet run

Denetleyiciyi http dosyasıyla test edin

  1. ContosoPizza.http dosyasını açın

  2. Ayırıcı altında ### Pizza uç noktayı çağırmak için yeni bir GET ekleyin:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. Bu yeni GET çağrısının üstündeki İstek Gönder komutunu seçin.

    Yukarıdaki komut, JSON'daki tüm pizzaların listesini döndürür:

    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. Tek bir pizzayı sorgulamak için başka bir GET istekte bulunabilir, ancak aşağıdaki komutu kullanarak bir id parametre geçirebilirsiniz:

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

    Yukarıdaki komut aşağıdaki çıkışla birlikte döndürür Classic Italian :

    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. API'miz öğenin mevcut olmadığı durumları da işler. API'yi yeniden çağırın, ancak aşağıdaki komutu kullanarak geçersiz bir pizza id parametresi geçirin:

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

    Yukarıdaki komut aşağıdaki çıkışla bir 404 Not Found hata döndürür:

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

Fiilleri uygulamayı tamamladığınıza göre GET . Sonraki ünitede, pizza verileri üzerinde CRUD işlemlerini desteklemek için öğesine PizzaController daha fazla eylem ekleyebilirsiniz.

İsteğe bağlı: Komut Satırı HTTP Read-Eval-Print Döngüsü (REPL) ile denetleyiciyi test etme

  1. Mevcut httprepl terminali açın veya ana menüden Terminal>Yeni Terminal'i seçerek Visual Studio Code'dan yeni bir tümleşik terminal açın.

  2. Aşağıdaki komutu çalıştırarak web API'mize bağlanın:

    httprepl https://localhost:{PORT}
    

    Alternatif olarak, çalışırken istediğiniz zaman HttpRepl aşağıdaki komutu çalıştırın:

    connect https://localhost:{PORT}
    
  3. Yeni kullanılabilir Pizza uç noktayı görmek için aşağıdaki komutu çalıştırın:

    ls
    

    Yukarıdaki komut, bağlı uç noktada kullanılabilen tüm API'leri algılar. Aşağıdaki kodu görüntülemelidir:

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. Pizza Aşağıdaki komutu çalıştırarak uç noktaya gidin:

    cd Pizza
    

    Yukarıdaki komut, uç nokta için kullanılabilir API'lerin çıkışını Pizza gösterir:

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. aşağıdaki komutu kullanarak içinde HttpRepl bir GET istekte bulunın:

    get
    

    Yukarıdaki komut, JSON'daki tüm pizzaların listesini döndürür:

      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. Tek bir pizzayı sorgulamak için başka bir GET istekte bulunabilir, ancak aşağıdaki komutu kullanarak bir id parametre geçirebilirsiniz:

    get 1
    

    Yukarıdaki komut aşağıdaki çıkışla birlikte döndürür Classic Italian :

    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. API'miz öğenin mevcut olmadığı durumları da işler. API'yi yeniden çağırın, ancak aşağıdaki komutu kullanarak geçersiz bir pizza id parametresi geçirin:

    get 5
    

    Yukarıdaki komut aşağıdaki çıkışla bir 404 Not Found hata döndürür:

    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. Visual Studio Code'daki açılan listede terminale dotnet dönün ve klavyenizde CTRL+C tuşlarını seçerek web API'sini kapatın.

Fiilleri uygulamayı tamamladığınıza göre GET . Sonraki ünitede, pizza verileri üzerinde CRUD işlemlerini desteklemek için öğesine PizzaController daha fazla eylem ekleyebilirsiniz.