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
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ıPizzaControllerolarak adlandırıldığından, bu denetleyicihttps://localhost:{PORT}/pizzaisteğ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
ActionResultbirList<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-Typedeğeriapplication/jsonolan 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
idsonrasındapizza/URL kesimine eklenmesini gerektirir. Denetleyici düzeyi[Route]özniteliğinin deseni tanımladığını/pizzaunutmayın. - Sağlanan
idparametreyle 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
ContosoPizza.http dosyasını açın
Ayırıcı altında
Pizzauç noktayı çağırmak için yeni ### 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
GETistekte bulunabilir, ancak aşağıdaki komutu kullanarak biridparametre geçirebilirsiniz:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###Önceki komut, aşağıdaki çıktıyla birlikte
Classic Italianolarak 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 }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
idparametresi geçirin:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###Yukarıdaki komut aşağıdaki çıkışla bir
404 Not Foundhata 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
Mevcut
httpreplterminali açın veya Visual Studio Code ana menüsünden Terminal>Yeni Terminal seçerek 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,
HttpReplçalışırken istediğiniz herhangi bir zamanda aşağıdaki komutu yürütebilirsiniz:connect https://localhost:{PORT}Yeni kullanılabilir
Pizzauç noktayı görmek için aşağıdaki komutu çalıştırın:lsYukarı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]PizzaAşağıdaki komutu çalıştırarak uç noktaya gidin:cd PizzaYukarıdaki komut, uç nokta için kullanılabilir API'lerin çıkışını
Pizzagösterir:https://localhost:{PORT}/> cd Pizza /Pizza [GET]aşağıdaki komutu kullanarak içinde
GETbirHttpReplistekte bulunın:getYukarı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
GETistekte bulunabilir, ancak aşağıdaki komutu kullanarak biridparametre geçirebilirsiniz:get 1Önceki komut, aşağıdaki çıktıyla birlikte
Classic Italianolarak 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 }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
idparametresi geçirin:get 5Yukarıdaki komut aşağıdaki çıkışla bir
404 Not Foundhata 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
dotnetdö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.