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]. Daha önce olduğu gibi, [Route] özniteliği [controller] belirtecine bir eşleme tanımlar. Bu denetleyici sınıfı PizzaController olarak adlandırıldığından, bu denetleyici https://localhost:{PORT}/pizza isteğini iş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:

  • Yalnızca, GET özniteliği tarafından belirtildiği gibi, HTTP [HttpGet] fiiline yanıt verir.
  • türünde ActionResultbir List<Pizza> ö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 hizmete sorgu gönderir ve Content-Type değeri application/json olan verileri otomatik olarak döndürür.

Tek bir pizzayı al

İstemci ayrıca listenin tamamı yerine belirli bir pizza hakkında bilgi istemek isteyebilir. Başka bir GET eylemi uygulayabilir ve bu eylem bir id parametresi gerektirir. Hizmetimizden pizzaları döndüren bir yöntem tanımlamak için yerleşik [HttpGet("{id}")] özniteliğini kullanabilirsiniz. Yönlendirme mantığı, iki farklı rota olarak [HttpGet] (c1 olmadan) ve id (c3 ile) kaydeder. 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:

  • Yalnızca, GET özniteliği tarafından belirtildiği gibi, HTTP [HttpGet] fiiline 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 ima ediliyor 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 derle ve çalıştır

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 ### 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
    
    ###
    

    Önceki komut, aşağıdaki çıktıyla birlikte Classic Italian olarak döner:

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

Şimdi GET fiilleri uygulamayı tamamladığınıza göre. 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 Visual Studio Code ana menüsünden Terminal>Yeni Terminal seçerek 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, HttpRepl çalışırken istediğiniz herhangi bir zamanda aşağıdaki komutu yürütebilirsiniz:

    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 GET bir HttpRepl 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
    

    Önceki komut, aşağıdaki çıktıyla birlikte Classic Italian olarak döner:

    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.

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