Alıştırma - Denetleyici ekleme
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
Visual Studio Code'da Denetleyiciler klasörünü seçin ve PizzaController.cs adlı yeni bir dosya ekleyin.
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.
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
ControllerBase
tü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ıPizzaController
olduğundan, bu denetleyici isteklerihttps://localhost:{PORT}/pizza
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:
- Özniteliği tarafından belirtildiği gibi yalnızca HTTP
GET
fiiline[HttpGet]
yanıt verir. - türünde
List<Pizza>
birActionResult
ö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/json
olanContent-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ındapizza/
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
ContosoPizza.http dosyasını açın
Ayırıcı altında ###
Pizza
uç noktayı çağırmak için yeni bir GET ekleyin:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
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 } ]
Tek bir pizzayı sorgulamak için başka bir
GET
istekte bulunabilir, ancak aşağıdaki komutu kullanarak birid
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 }
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
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.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}
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]
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]
aşağıdaki komutu kullanarak içinde
HttpRepl
birGET
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 } ]
Tek bir pizzayı sorgulamak için başka bir
GET
istekte bulunabilir, ancak aşağıdaki komutu kullanarak birid
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 }
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" }
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.