Visual Studio 2022 17.6 sürümü ile Web API geliştirme süreci gelişiyor

Katılım
28 Ocak 2020
Mesajlar
19.666
Makaleler
53
Çözümler
461
Visual Studio 2022, sürüm 17.6 ile birlikte Web API geliştirme deneyimi gelişiyor.

1682976261216.png


Visual Studio geliştirici ekibinden Sayed Ibrahim Hashimi, Web API geliştirme süreci hakkında yazdığı detaylı makalesi;

Visual Studio 2022'de web geliştiricileri için ana senaryolardan biri, ASP.NET Core ile Web API'leri oluşturmaktır. Visual Studio 2022 17.6'nın en son önizlemesinde, API'leri geliştirirken daha verimli olmak için bir dizi güncelleme ekledik. Bu gönderide, sıfırdan yeni bir API geliştirmeye yönelik örnek bir senaryoyu ele alacağız ve yol boyunca yeni özelliklere dikkat çekeceğiz. Başlamak için aşağıdaki bağlantıdan Visual Studio 2022'nin en son önizlemesini indirin.

Bu gönderide ele alacağımız yeni özelliklerden bazıları şunlardır.
  • Entegre istemcili HTTP editörü.
  • API Uç Noktaları Gezgini.
  • İskele.
  • Visual Studio'da Entity Framework araçları.
Bu yazıda, yeni bir projeden başlayarak tam bir Web API geliştirmeye kadar uçtan uca eksiksiz bir gösteri göstereceğiz. Aşağıda bu yazının kısa bir özeti bulunmaktadır.
  • Başlarken – yeni bir API projesi oluşturma.
  • Projenize modeller ekleme.
  • Yapı iskelesi kullanarak API'ler oluşturma.
  • Endpoints Explorer ile API'leri Keşfetme.
  • API'leri HTTP düzenleyiciyle çalıştırma.
Kodun tamamı sizin için sayedihashimi/RestaurantService adresinde mevcuttur: Sample ASP.NET Core Web API (github.com).

Yeni özelliklere video genel bakış

Bu blog gönderisinde ele alacağımız bazı yeni güncellemeleri kapsayan Mads Kristensen'in bu videosuna bir göz atın.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Başlarken

Visual Studio'da bir Web API geliştirmeye başlamak için ilk adım, yeni bir proje oluşturmaktır. Visual Studio 2022'de Yeni Proje iletişim kutusunu kullanarak yeni bir proje oluşturabilirsiniz. Bu gönderide hayali bir paket servis restoranı için bir ASP.NET Core Web API oluşturacağız. Bu öğreticiyi takip etmek için, Ek Bilgiler sayfasında aşağıdaki seçeneklerin seçili olduğu MyRestaurantService adlı bir proje oluşturun.

1682974973714.png


Bu örnekte, Denetleyici tabanlı API'ler yerine API uç noktalarını kullanıyoruz, ancak Denetleyicilerle birlikte takip edebilirsiniz. Denetleyici tabanlı API'ler ile Endpoint API'ler arasındaki fark hakkında daha fazla bilgi için bu belgeye bakın Denetleyici tabanlı API'ler ile minimum API'ler arasında seçim yapın . API uç noktaları ve Denetleyici tabanlı API'ler için adımlar aynıdır, uygun olduğunda Uç Noktalar yerine Denetleyici seçeneklerini seçmeniz yeterlidir.

Artık proje yaratıldığına göre, yapmak istediğimiz ilk şey, API'miz ile ortaya çıkarmak istediğimiz nesneler için bazı model sınıfları eklemek. Aşağıdaki sınıfları/enumları projeye eklememiz gerekecek. Aşağıdaki tabloda, oluşturulacak nesnelerin listesini ve her dosya için kaynağa bir bağlantı göreceksiniz.


İsimAçıklama ve bağlantı
Temas etmekBu sınıf, siparişi veren müşteriyi temsil edecek şekilde yakalanacaktır. Kaynak dosya.
Menü seçeneğiRestoran menüsünde bulunan bir menü öğesini temsil eder. Kaynak dosya.
MenüÖğeKategorisiMenü öğesinin kategorisini temsil eden numaralandırma. Kaynak dosya.
MenüÖğesiSıralıMüşteri siparişi eklenmiş bir kalemi temsil eder. Kaynak dosya.
Sipariş durumuGönderilen siparişin durumunu temsil eder. Kaynak dosya.
Ödeme yöntemiSipariş için kullanılan ödeme yöntemini temsil eden numara. Kaynak dosya.
Siparişe GitVerilmiş bir siparişi temsil eder. Kaynak dosya.

Eklenen dosyalar standart POCO sınıfları veya numaralandırmalardır. Örneğin, aşağıda Contact sınıfının nasıl tanımlandığı açıklanmaktadır.

Contact.cs
C#:
namespace MyRestaurantApi;
public class Contact {
    public int Id { get; set; }
    public string? Name { get; set; }
    public string? Email { get; set; }
    public string? Phone { get; set; }
}

Bu nesneler, Togo siparişlerini göndermenin yanı sıra son kullanıcılara bir menü görüntülemek için kullanılabilecek bir dizi veriyi temsil eder. Artık bu model sınıflarını eklediğimize göre, bir sonraki adım, API uç noktalarını oluşturmak ve Entity Framework DbContext'i bağlamak için Visual Studio'da yapı iskelesini kullanmaktır. Oluşturmamız gereken 4 API uç noktası kümesi vardır.
  • Temas etmek.
  • Menü seçeneği.
  • MenüÖğelerSipariş Edildi.
  • Siparişe Git.
Her model sınıfı için, ilk API uç noktalarını oluşturmanın zor işini halletmek için yapı iskelesi kullanacağız. Bununla başlayalım.

Visual Studio'da yapı iskelesi

İskele kurmaya başlamak için ASP.NET Core web projesi MyRestaurantApi'ye sağ tıklayın ve Ekle > Yeni İskele Öğesi'ni seçin. Aşağıdaki resme bakın.

1682975064537.png


Bu menü öğesini çağırdığınızda, yapı iskelesi iletişim kutusu görünecektir. Bu iletişim kutusunda, çalıştırmak istediğimiz yapı iskelesi türünü seçeceğiz ve ardından onu yapılandıracağız. Bu proje için, Entity Framework yapı iskelesini kullanarak okuma/yazma uç noktalarına sahip API'yi kullanacağız.

1682975089335.png


Bu seçeneği seçtikten sonra, yapı iskelesi seçeneklerini yapılandırmanızı isteyen yeni bir iletişim kutusu göreceksiniz. Ana seçenekler aşağıdaki tabloda özetlenmiştir.


SeçenekTanım
Model sınıfıİskele yapımında kullanılacak model sınıfı. Yapı iskelesi, seçilen model sınıfı için değerleri okumak/yazmak için API'yi üretecektir.
Uç nokta sınıfıYeni bitiş noktalarının yazılması gereken sınıf. Mevcut bir sınıfı seçerseniz uç noktalar o sınıfa eklenir. Ayrıca + butonu ile yeni bir sınıf oluşturabilirsiniz .
DbContext sınıfıVeritabanına okuma/yazma işlemlerini yönetecek olan Entity Framework DbContext. + butonu ile yeni bir DbContext oluşturabilirsiniz .
Veritabanı SağlayıcıKullanılacak veritabanı sağlayıcısı, bu verileri depolamak istediğiniz veritabanı tarafından belirlenir.

İletişim modelini iskele kurmaya başlayacağız. Bu durumda, model sınıfı olarak Contact sınıfını belirleyeceğiz, yeni bir uç nokta sınıfı ve yeni bir DbContext oluşturacağız. Bu örnek için Sqlite kullanacağız, ancak ihtiyaçlarınıza göre listelenen sağlayıcılardan herhangi birini seçebilirsiniz. Aşağıda, bu seçeneklerin yapılandırılmış olduğu iletişim kutusu bulunmaktadır.
1682975146015.png

Bu doldurulduğunda + düğmesi, DbContext'in yanı sıra yeni bir uç nokta sınıfı oluşturmak için kullanıldı. Her ikisi için de + düğmesini tıklattığınızda sağlanan varsayılan değeri kullanabilirsiniz . Bir sonraki adım, Ekle düğmesini tıklamaktır. Ekle'ye tıkladıktan sonra, yapı iskelesi aracı NuGet kullanılarak yüklenecek ve ardından yeni dosyaları oluşturmak için çağrılacaktır. Eklenen veya değiştirilen dosyalar aşağıda listelenmiştir.

  • Proje dosyası – proje dosyası, iskele aracının kendisi için olduğu kadar değişiklikleri desteklemek için gereken paket referanslarını da eklemek üzere değiştirilir.
  • Program.cs – Program.cs dosyası, yeni bitiş noktaları sınıfını kaydetmenin yanı sıra EF DbContext'i eklemek için değiştirilir.
  • appSettings.json – appSettings.json dosyası, bağlantı dizesini eklemek için değiştirilir.
  • ContactEndpoints.cs – Bu, API isteğini/yanıtını işleyen, eklenen yeni bir sınıftır.
  • ContactEndpoints sınıfına oluşturulan kod aşağıdadır.
C#:
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.OpenApi;
using MyRestaurantApi.Data;
namespace MyRestaurantApi;

public static class ContactEndpoints
{
    public static void MapContactEndpoints (this IEndpointRouteBuilder routes)
    {
        var group = routes.MapGroup("/api/Contact").WithTags(nameof(Contact));

        group.MapGet("/", async (MyRestaurantApiContext db) =>
        {
            return await db.Contact.ToListAsync();
        })
        .WithName("GetAllContacts")
        .WithOpenApi();

        group.MapGet("/{id}", async Task<Results<Ok<Contact>, NotFound>> (int id, MyRestaurantApiContext db) =>
        {
            return await db.Contact.AsNoTracking()
                .FirstOrDefaultAsync(model => model.Id == id)
                is Contact model
                    ? TypedResults.Ok(model)
                    : TypedResults.NotFound();
        })
        .WithName("GetContactById")
        .WithOpenApi();

        group.MapPut("/{id}", async Task<Results<Ok, NotFound>> (int id, Contact contact, MyRestaurantApiContext db) =>
        {
            var affected = await db.Contact
                .Where(model => model.Id == id)
                .ExecuteUpdateAsync(setters => setters
                  .SetProperty(m => m.Id, contact.Id)
                  .SetProperty(m => m.Name, contact.Name)
                  .SetProperty(m => m.Email, contact.Email)
                  .SetProperty(m => m.Phone, contact.Phone)
                );

            return affected == 1 ? TypedResults.Ok() : TypedResults.NotFound();
        })
        .WithName("UpdateContact")
        .WithOpenApi();

        group.MapPost("/", async (Contact contact, MyRestaurantApiContext db) =>
        {
            db.Contact.Add(contact);
            await db.SaveChangesAsync();
            return TypedResults.Created($"/api/Contact/{contact.Id}",contact);
        })
        .WithName("CreateContact")
        .WithOpenApi();

        group.MapDelete("/{id}", async Task<Results<Ok, NotFound>> (int id, MyRestaurantApiContext db) =>
        {
            var affected = await db.Contact
                .Where(model => model.Id == id)
                .ExecuteDeleteAsync();

            return affected == 1 ? TypedResults.Ok() : TypedResults.NotFound();
        })
        .WithName("DeleteContact")
        .WithOpenApi();
    }
}

Bu, ASP.NET Core minimum API desteğini kullanır, daha önce belirtildiği gibi, Denetleyici tabanlı API'leri tercih ederseniz, Denetleyiciler klasörüne yeni bir Denetleyici eklenirdi.

Artık Contact sınıfı için API uç noktalarını oluşturduğumuza göre, kalan üç model sınıfı için de aynısını yapmamız gerekiyor. Aynı adımları bir farkla tekrarlayacağız. Yeni bir DbContext oluşturmayı seçmek yerine, bu adımda oluşturulan DbContext'i diğer üçü için yeniden kullanmak üzere seçeceğiz. Mevcut DbContext'i seçeceğiniz için, DbContext'te zaten yapılandırılmış olduğu için Veritabanı Sağlayıcı seçeneği devre dışı bırakılacaktır. Artık sınıflar için API uç noktalarını oluşturabilirsiniz; MenuItem, MenuItemsOrdered ve TogoOrder.

Bu üç dosya için yapı iskelesini tamamladığınızda, Çözüm Gezgininiz aşağıdaki görüntüye benzer görünmelidir.

1682975226027.png


Bu noktada, sorun olmamasını sağlamak için çözümü oluşturmak iyi bir fikir olacaktır. Bu adımda, bir Entity Framework veritabanına bağlı bir dizi API uç noktası oluşturmak için Visual Studio yapı iskelesini kullandık. Bir sonraki adım, veritabanı kurulumunu almaktır.

Artık bir DbContext'imiz olduğuna göre, veritabanına bazı başlangıç verileri eklemek istiyoruz, buna genellikle Veri Tohumlama denir . Bizim durumumuzda, müşterilerin sipariş edebileceği öğelerin listesini (MenuItems) ve İletişim tablosunu doldurmamız gerekiyor. Bunu, yapı iskelesi sırasında oluşturulan DbContext sınıfını özelleştirerek yapabiliriz. Verileri döndürmek için iki yöntem ekleyeceğiz ve verileri veritabanına kaydetmek için OnModelCreating yöntemini geçersiz kılacağız . İlk verileri döndürmek için ekleyeceğimiz yöntemler GetSeedDataMenuItems ve GetSeedDataContacts'dir . Bu yöntemler, sırasıyla bir MenuItems veya Contacts dizisi döndürür. Sonra bu yöntemleri OnModelCreating'de çağırırız.yöntem. Kod şimdi aşağıdaki gibi görünmelidir.

Artık bu uygulamayı desteklemek için DbContext'i ve veri modelini almak için gereken her şeyi yaptık. Artık veritabanının kendisini hazır hale getirmeye geçebiliriz, şimdiye kadar sadece bazı kodlar tanımladık ama bunların hiçbirini herhangi bir veritabanına uygulamadık. Bunu basitleştirmek için Visual Studio'da Entity Framework için bazı yeni destekler kullanacağız.

Visual Studio'da Entity Framework Desteği

API uç noktalarını çalıştırmadan önce veritabanını yapılandırmamız gerekiyor. Yapı iskelesi adımında, kodda EF DbContext tanımlanmıştır, ancak veritabanı, DbContext'in temsil ettiği verileri depolamak için hala yapılandırılmamıştır. Bunun için iki işlem yapmamız gerekiyor.
  1. Bir EF geçişi ekleyin.
  2. Veritabanını güncelle.
Geçmişte , bu iki adımı gerçekleştirmek için dotnet ef komut satırı yardımcı programını kullanmanız gerekirdi . Bu işlemler için komut satırını kullanmanız gerekmemesi için Visual Studio'ya destek ekledik. ASP.NET Core projeleri için Connected Services sekmesine destek eklendi. Başlamak için, MyRestaurantApi web projesi altındaki Solution Explorer'da Connected Services düğümüne çift tıklayın. Bu sayfaya girdiğinizde aşağıdaki gibi görünecektir.

1682975285196.png


İskeleyi Sqlite kullanacak şekilde yapılandırdığımız için, Servis Bağımlılıkları'ndaki Sqlite (yerel) girişinin sağındaki menüsünde bulunan bazı seçenekleri kullanıyor olacağız . Bu menüye tıkladığınızda aşağıdaki seçenekleri görmelisiniz.

1682975303982.png


İlk olarak, yeni bir Entity Framework geçişi oluşturmamız gerekiyor. Yukarıda gösterilen Taşıma bağlamı ekle menü seçeneğini kullanacağız . Bu seçeneğe tıkladığınızda, Entity Frameworks Migration iletişim kutusu görünecektir. Bu menüye girmeden önce projenin çalışmadığından emin olun. İletişim kutusu bir yapı başlatacak ve proje çalışıyorsa bir hata alacaksınız. Bu iletişim kutusuna girdiğinizde, aşağıdaki görüntüye benzer görünmelidir.

1682975320739.png


Bu sayfada iki giriş vardır; oluşturulacak geçişin adı ve kullanılacak DbContext sınıfı. Geçiş için her zaman kullanabileceğiniz varsayılan bir ad vardır veya isterseniz belirli bir ad uygulayabilirsiniz. Bu, geçiş eklendiğinde oluşturulan dosyanın adı olacaktır. DbContext için, iskele adımı sırasında oluşturulan DbContext'i otomatik olarak seçmelidir. Birden fazla DbContext içeren projeler için hedeflediğiniz belirli DbContext'i seçmelisiniz. Şimdi migrasyonun eklenmesini sağlamak için Bitir'e tıklayabiliriz. Bitir'e tıkladıktan sonra, taşıma oluşturulacak ve projeye eklenecektir. Bir sonraki adım, bu geçişi çalıştırarak veritabanını güncellemektir.

Veritabanını güncellemek için Veritabanını güncelle menü seçeneğini kullanacağız . Bu girişe tıkladığınızda, hedef DbContext'i seçtiğiniz bir iletişim kutusu görünecektir. Bu örnekte, varsayılan olarak önceki adımlarda oluşturulan bağlam olmalıdır. Bu, aşağıdaki resimde gösterilmiştir.

1682975341286.png


Buradan, veritabanındaki önceki adımda taşımayı çalıştıracak olan Bitir'e tıklamamız yeterlidir. Bitir'e tıkladıktan sonra veritabanı yapılandırılmıştır ve kullanıma hazırdır. Kaynak denetimi kullanıyorsanız, bu, yeni bir taahhüt oluşturmak için iyi bir zaman olacaktır. Model sınıflarında başka değişiklikler yaptıktan sonra, veritabanını güncellemek için bu iki adımı tekrarlamalısınız. Yapı iskelesi oluşturulan API'leri artık nasıl kullanabileceğimize bakalım. Başlamak için yeni Endpoints Explorer'ı kullanacağız.

Uç Nokta Gezgini

Endpoints Explorer, çözümde tanımlanan API uç noktalarını görüntülemenizi ve bunlarla etkileşim kurmanızı sağlamak için üzerinde çalıştığımız yeni bir önizleme özelliğidir. Bu bir Önizleme Özelliği olduğundan, görüntüleyebilmemiz için etkinleştirilmesi gerekir. Bu yeni Araç Penceresini etkinleştirmek için Araçlar > Seçenekler > Ortam > Önizleme Özellikleri'ne gidin ve ardından Web API Endpoints Explorer'ı kontrol edin. Seçenekleri sınırlamak için o iletişim kutusundaki arama metin kutusunu kullanabilirsiniz. Aşağıdaki resme bakın.

1682975361258.png


Artık Endpoints Explorer'ı etkinleştirdiğinize göre, View > Other Windows > Endpoints Explorer'a giderek açabilirsiniz. Bu pencereyi açtıktan sonra, aşağıdaki resimde gösterilene benzer bir içerik görmelisiniz.

1682975377689.png


Bu pencerede, Visual Studio'da yapı iskelesi kullanılarak oluşturulan tüm API uç noktalarını görebilirsiniz. Yapı iskelesi sırasında kullandığımız her model sınıfı için 5 uç nokta (Get/Post/Get spesifik/Put/Delete) oluşturmuştur. Bu görünümde, çözümünüzün içerdiği tüm uç noktaları görüntüleyebilirsiniz. Projenize API uç noktaları eklerseniz, görünümü yenilemek için Endpoints Explorer'ın üst kısmındaki Yenile düğmesini kullanmanız gerekebilir. Her istekte, isteği işleyen kodu görüntüleyebilir ve bu uç noktaya yeni bir istek oluşturabilirsiniz. Bir girdiye tıkladığınızda bu seçenekleri içerik menüsünde görebilirsiniz. Bu, sonraki ekran görüntüsünde gösterilmiştir.

1682975393746.png


Burada İstek Oluştur'u çağırırsanız istekle birlikte HTTP dosyası oluşturulur. /api/MenuItem/ isteği için, bağlam menüsünü çağırdıktan sonraki sonuç burada.

1682975415132.png


Buna tıkladıktan sonra aşağıdakiler oluştu:
  1. Bir HTTP dosyası oluşturun ve projeye ekleyin (istek oluşturulduğunda bir HTTP dosyası açıksa, bunun yerine o dosyaya eklenir).
  2. Web projesinin web adresini içeren HTTP dosyasına bir değişken ekleyin.
  3. İsteği dosyaya ekleyin
HTTP dosyası, Visual Studio'ya eklenen yeni bir dosya türüdür. Şimdi HTTP dosyaları desteğini gözden geçirelim.

HTTP Düzenleyici

Visual Studio 2022'de .HTTP (.REST) dosyaları için destek ekledik. Bu destek, harika VS Code Extension REST İstemcisi'nden esinlenmiştir . Bu uzantı, VS Code'da popüler hale geldi ve dosya formatı artık diğer araçlarda da destekleniyor. Visual Studio'da HTTP dosyaları için destek eklediğimizde, başlangıçta bu uzantıyı doğrudan entegre etmek istedik, ancak uzantı doğrudan VS Kodu genişletilebilirlik API'lerine çağrılarak uygulandı, bu nedenle bu bir seçenek değildi. Bu dosya türünü desteklemek için Visual Studio'da yeni bir HTTP düzenleyicisi geliştirdik. Şu anda REST İstemci uzantısı, Visual Studio'da henüz desteklenmeyen bir sözdizimine sahiptir, ancak bu açığı kapatmak için çalışıyoruz. Artık bu yeni düzenleyicinin kökenini tartıştığımıza göre, özelliklerini inceleyelim.

HTTP düzenleyicisinin birincil amacı, bir veya daha fazla HTTP isteği bildirmenizi ve istek gönderildiğinde üretilen yanıtı görüntülemenizi/incelemenizi sağlamaktır. /api/MenuItem/ bitiş noktası için oluşturulan koda daha yakından bakalım. Kod aşağıdadır.

1682975462026.png


Buradaki her satırın üzerinden geçelim.

1682975473950.png


İlk satır, MyRestaurantApi_HostAddress adlı bir değişken bildirir ve değerini https://localhost:7020'ye atar. URL, HTTP dosyasının eklendiği projeden gelir. Yeni bir değişken bildirmek için sözdizimi şöyledir:

1682975486416.png


Bu değişkenler, HTTP dosyasında herhangi bir yerde bildirilebilir. HTTP dosyasındaki bildirimden sonraki değerleri kullanabilirsiniz. Bir değişkenin nasıl kullanılacağını görmek için bir sonraki satıra bakalım.

1682975498910.png


Bu bir HTTP isteğini temsil eder. Bir HTTP isteği tanımlarken, ilk değer HTTP istek yöntemidir, bu durumda GET. Ardından URL gelir. Bu durumda, önceki satırda bildirilen değişkeni kullanıyoruz. Bir değişkenin değerini almak için HTTP dosyasında {{VariableName}} sözdizimini kullanın. Bu satırda, kullanmak için belirli bir HTTP sürümü belirtmeniz gerekirse, bunu URL'den sonra ekleyebilirsiniz. Örneğin aynı istek için HTTP 1.1 kullanmak isteseydik satır aşağıdaki gibi olurdu.

1682975509256.png


Şimdi bu dosyadaki son satıra geçelim.

1682975518587.png


Bu, bir HTTP isteğinin sonunu belirtir. Bundan sonra bu dosyaya ek HTTP istekleri ekleyebilirsiniz. Şimdi istek için bir gövde ve bazı başlıklar içeren bir örneğe bakalım.

İncelediğimiz örnek, isteğe başlık veya gövde eklenmemiş basit bir GET isteğiydi. Bir gövdeye ve üstbilgilere sahip olmak, HTTP istekleri için çok yaygındır, o yüzden bunun nasıl göründüğüne bir bakalım. Bu durumda, Endpoints Explorer'da bir istek oluşturabilir ve ardından gövdeyi ve başlıkları ekleyebiliriz.

Daha önce, sipariş edilebilir menü öğelerini almak/oluşturmak/düzenlemek için bir MenuItem API uç noktamız olduğunu gördük. Diyelim ki yeni bir MenuItem eklemek istiyoruz, bunun için yeni bir MenuItem eklemek için bir POST isteği oluşturmamız gerekiyor. Bu isteği oluşturmaya yardımcı olması için Endpoints Explorer'ı kullanabiliriz. /api/MenuItem/ için POST'a sağ tıklayın ve ardından İstek Oluştur'a tıklayın .

1682975532974.png


Endpoints Explorer'ın mevcut sürümünde bu, HTTP dosyasında aşağıdakileri oluşturacaktır.

1682975545465.png


C#:
Post {{MyRestaurantApi_HostAddress}}/api/MenuItem/
Content-Type: application/json
Accept: application/json

{
  "name": "All-beef hotdog and soda",
  "price": 1.50,
  "description": "An all-beef hotdog and soda with a permanent fixed price.",
  "category": 1
}

###

Bu isteğin sözdizimini daha ayrıntılı olarak açıklayalım. Bir isteğin sözdizimi, ilk satırın HTTP yöntemi, ardından URL ve daha önce tartışıldığı gibi isteğe bağlı bir HTTP sürümü olması şeklindedir. İstek satırından sonra, istek satırından hemen sonra her başlığı kendi satırında belirtebilirsiniz (arada boş satır yok). Bir başlık belirtirken sözdizimi, BaşlıkAdı: Değer şeklindedir., burada HeaderName iletilen başlığın adıdır ve Value bunun için belirttiğiniz değerdir. Bu durumda, Content-Type ve Accept olmak üzere iki başlık belirliyoruz. Bu başlıklar, varsayılanlar olduğundan bu istek için gerekli değildir, ancak başlıkların nasıl iletileceğini göstermek için burada gösteriliyorlar. Başlıklardan sonra veya başlık yoksa istek satırından sonra, istek gövdesinden sonra boş bir satır eklemelisiniz. Ve son olarak, isteğin bittiğini belirtmek için sonuna ### ekliyoruz.

Bu istekte, sipariş için kullanılabilecek yeni bir MenuItem ekleyeceğiz. Yeni bir "Tam dana sosisli ve soda kombinasyonu" ekliyoruz. İlk olarak, API'yi Visual Studio'dan başlatarak çalıştığından emin olmak istiyoruz. Web API'yi başlattıktan sonra request satırının solundaki yeşil play butonu ile request gönderebilirsiniz. Sonuç, Visual Studio'da aşağıdakine benzer olmalıdır.

1682975569615.png


Burada “All-beef hotdog and soda” ekleme talebinin veritabanına başarıyla eklendiğini görebiliriz. Veritabanından id değeri 7 olarak atanmıştır. Artık yeni bir togo siparişi eklemek için bir istek oluşturabiliriz. Yeni bir TogoOrder göndermeden önce, POST yönteminin işlendiği TogoOrderEndpoints sınıfını değiştirmemiz gerekiyor. Bir TogoOrder gönderildiğinde, OrderCreated değeri null ise geçerli tarih/saat olarak ayarlanmalıdır ve ayrıca MenuItemOrdered'in ayrıntılarını MenuItem değerlerinden doldurmak istiyoruz. TogoOrder gönderi işleyicisi için güncellenmiş kod aşağıdadır. Güncellenen kod aşağıdadır.

C#:
group.MapPost("/", async (TogoOrder togoOrder, MyRestaurantApiContext db) =>
{
    togoOrder.Customer = await db.Contact.FindAsync(togoOrder.Customer!.Id);

    if (togoOrder.OrderCreated == null) {
        togoOrder.OrderCreated = DateTime.Now;
    }
    if (togoOrder.ItemsOrdered != null && togoOrder.ItemsOrdered.Count > 0) {
        foreach (var item in togoOrder.ItemsOrdered) {
            var menuItem = await db.MenuItem.FindAsync(item.MenuItemId);
            item.Name = menuItem!.Name;
            if (item.Price is null || !item.Price.HasValue || item.Price.Value < 0) {
                item.Price = menuItem.Price!.Value;
            }
            if (item.Category is null || !item.Category.HasValue) {
                item.Category = menuItem.Category!.Value;
            }
        }
    }
    db.TogoOrder.Add(togoOrder);
    await db.SaveChangesAsync();
    return TypedResults.Created($"/api/TogoOrder/{togoOrder.Id}",togoOrder);
})
.WithName("CreateTogoOrder")
.WithOpenApi();

Eklenmesi gereken kod, db.TogoOrder.Add(togoOrder) öğesinden önce görünen koddur . Oldukça açıklayıcı. İstek gönderildiğinde, boşsa OrderCreated için değerler doldurulacak ve ardından eksik olan MenuItem değerleri karşılık gelen MenuItemId'den doldurulacaktır. MenuItemId, oluşturulacak her MenuItemOrdered için gereken tek değerdir.

Öncelikle Endpoints Explorer ile POST /api/TogoOrder/ üzerine sağ tıklayıp Generate Request'i seçerek stub request'i oluşturacağız . Ardından isteğe JSON gövdesini eklememiz gerekecek. JSON gövdesini ekledikten sonra istek aşağıdaki gibi görünmelidir.

C#:
Post {{MyRestaurantApi_HostAddress}}/api/TogoOrder/
Content-Type: application/json

{
  "itemsOrdered": [
    {
      "menuItemId":1
    }
  ],
  "subtotal": 3.50,
  "tax": 0.8,
  "total": 4.30,
  "paymentMethod": 1,
  "customer": {
    "id": 2
  }
}
###

Bu istekte, yeni bir TogoOrder girişi eklemek için POST yöntemini kullanıyoruz. Belirtildiği gibi, sipariş edilen öğeleri listeleyebiliriz ve gerekli olan tek alan menuItemId'dir. Post metoduna eklediğimiz kod eksik alanları dolduracaktır. Dolar tutarlarını da TogoOrder nesnesinde atarız. İstek satırının solundaki yeşil play butonuna basarak bu requesti gönderebiliriz. Bunu çağırdıktan sonra, yanıt aşağıdakine benzer olmalıdır.

C#:
{
  "id": 1,
  "orderCreated": "2023-04-27T14:14:48.3785278-04:00",
  "itemsOrdered": [
    {
      "id": 1,
      "menuItemId": 1,
      "togoOrderId": 1,
      "name": "Hamburger",
      "price": 3.68,
      "category": 1
    }
  ],
  "subtotal": 3.5,
  "tax": 0.8,
  "total": 4.3,
  "paymentMethod": 1,
  "customer": {
    "id": 2,
    "name": "Mads Kristensen",
    "email": "[email protected]",
    "phone": "555-111-3333"
  }
}

Artık veritabanına bir TogoOrder eklediğimize göre, veritabanında bulunan tüm TogoOrder'ları listelemek için bir GET isteği yaparak doğru sonuçları aldığımızı doğrulayalım. GET /api/TogoOrder/ bitiş noktası için bağlam menüsünde İstek oluştur'u seçerek Endpoints Explorer ile bu isteği oluşturabiliriz. Bunu çağırdıktan sonra, HTTP dosyasına aşağıdaki istek eklenir.

1682975624613.png


Bu isteği göndermek için yeşil oynat düğmesini tıklayın. Bunu yaptıktan sonra, yanıt görünümündeki sonuç aşağıdakine benzer olmalıdır.

C#:
[
  {
    "id": 1,
    "orderCreated": "2023-04-27T14:22:53.2117889",
    "itemsOrdered": null,
    "subtotal": 3.5,
    "tax": 0.8,
    "total": 4.3,
    "paymentMethod": 1,
    "customer": null
  }
]

Sonucu başarıyla aldık, ancak burada itemsOrdered null. Veritabanını inceleyecek olsaydık, tüm doğru girişlerin oluşturulduğunu ve tüm ilişkilerin de doğru olduğunu görürdük. Buradaki sorun, Entity Framework'ün ilgili verileri otomatik olarak yüklememiş olmasıdır. EF'in ilgili verileri nasıl yüklediği hakkında daha fazla bilgi için İlgili Verileri Yükleme – EF Core belgesine bakın . Bu durumda, bir TogoOrder döndürüldüğünde, her zaman itemsOrdered alanı için verileri yüklemek isteriz. Bu ihtiyacı karşılamak için oluşturulan GET isteğinde basit bir düzenleme yapmamız gerekiyor. Bu durumda, bir TogoOrder döndürüldüğünde, her zaman ItemsOrdered için verileri yüklemek isteriz.alan. Bu ihtiyacı karşılamak için oluşturulan GET isteğinde basit bir düzenleme yapmamız gerekiyor. Bu isteği işleyen yöntem, TogoOrderEndpoints sınıfındadır. ItemsOrdered özelliğini hidratlamak için EF için bir içerme ifadesi eklememiz gerekiyor . Değiştirilen yöntem aşağıdadır.

C#:
group.MapGet("/", async (MyRestaurantApiContext db) =>
{
    return await db.TogoOrder
        .Include(order => order.ItemsOrdered)
        .ToListAsync();
})

Bunu ekledikten sonra Web API projesini yeniden başlatacağız ve tüm siparişleri listelemek için GET isteğini yeniden göndereceğiz. Sonuç aşağıdaki parçacığı gibi olmalıdır.

C#:
[
  {
    "id": 1,
    "orderCreated": "2023-04-27T14:22:53.2117889",
    "itemsOrdered": [
      {
        "id": 1,
        "menuItemId": 1,
        "togoOrderId": 1,
        "name": "Hamburger",
        "price": 3.68,
        "category": 1
      }
    ],
    "subtotal": 3.5,
    "tax": 0.8,
    "total": 4.3,
    "paymentMethod": 1,
    "customer": null
  }
]

Şimdi, isteğin TogoOrder nesnesini, öğelerin sipariş edilen değeri doldurulmuş olarak döndürdüğünü görebiliriz. Şimdi sipariş isteklerini işlemek için başarıyla bir ASP.NET Core Web API oluşturduk. HTTP dosyalarında desteklenen sözdizimini tartışmaya devam edelim.

HTTP Dosyası Sözdizimi

HTTP Düzenleyicisi ve ilgili desteğinin Visual Studio Code REST Client uzantısından ilham aldığından daha önce bahsetmiştik . Bu uzantı, HTTP dosyalarında Visual Studio'nun bugün desteklediğinden daha geniş bir sözdizimini destekler. İlerledikçe, bu açığı kapatmak için daha fazla destek ekleyeceğiz. Bu bölümde, şu anda Visual Studio'da desteklenen sözdizimini tartışacağız.

Bu bölümde istekler , herkesin kullanabileceği ücretsiz üçüncü taraf Web API'si olan httpbin.org'u kullanacaktır. Ona istek gönderebilirsiniz ve isteği size geri yansıtacaktır. Şu anda Visual Studio'da desteklenen sözdizimini keşfedelim.

Yorumlar

Yorumlar, # veya // ile başlayan satırlardır . Bu satırlar yoksayılacak ve isteğe dahil edilmeyecektir.

Değişkenler

Daha önce belirtildiği gibi, sonraki istekte yeniden kullanılabilecek değişkenler tanımlayabilirsiniz. İhtiyaç duyulan herhangi bir sayıda değişken tanımlayabilirsiniz. Değişkenler, önceden tanımlanmış olan diğer değişkenlerin değerleri kullanılarak tanımlanabilir. Örneğin, aşağıdaki parçacığa bakın.

1682975679866.png


Burada, hostname adlı başka bir değişkenin değerini kullanan host değişkeni de dahil olmak üzere birkaç değişken tanımladık . Aşağıda, bu değişkenlerden birini kullanan örnek bir istek bulunmaktadır.

1682975690338.png

Talep hattı

İstek satırı için, istek satırının formatının şu olduğundan daha önce bahsetmiştik:

HTTPMetodu URL'si HTTPSürümü

Burada HTTPMethod kullanılacak HTTP yöntemidir, örneğin GET, POST, PUT, PATCH, vb. URL, isteğin gönderileceği URL'dir. Bu URL, aşağıdaki örnek istek gibi sorgu dizesi parametreleri de içerebilir. İsteğe bağlı HTTP Sürümü , kullanılması gereken HTTP sürümüdür. Aşağıda bazı örnek istekler bulunmaktadır.

1682975700211.png


Visual Studio Code REST Client uzantısının desteklediği, bugün için desteğimizin olmadığı bazı destekler var. Bunlar içerir.

  • İsteğe bağlı HTTP Yöntemi. REST İstemcisi, HTTP yöntemini belirtmeme desteğine sahiptir. Bu durumlarda, GET varsayılan HTTP yöntemidir.
  • İstek URL'si birden fazla satıra yayılıyor. Visual Studio'daki mevcut uygulamada, istek satırı tek bir satırda olmalıdır.
Gelecekteki bir sürümde bunlar için destek eklemeyi umuyoruz.

Aynı dosyada birden çok istek

Yukarıda gösterildiği gibi, bir HTTP dosyasında listelenen birden çok farklı istek olabilir. Her isteğin sonunda ### ile ayrılmaları gerekir.

Başlıklar

Bir veya daha fazla başlık eklemek için, her başlığı istek satırından hemen sonra (boş satır olmadan) kendi satırına ekleyin. Aşağıda birkaç farklı örnek verilmiştir.

1682975711610.png


Başlıklarla kimlik doğrulaması yapabilen bir API çağırıyorsanız, bunları başlıklarda da belirtebilirsiniz. Bunu yaparsanız, deponuza herhangi bir sır işlememeye dikkat edin. Sırları güvenli bir şekilde desteklemenin yolları üzerinde çalışıyor olacağız.

Artık desteklenen bazı söz dizimlerini incelediğimize göre, bir sonraki bölümde REST İstemcisi'nin sahip olduğu ve Visual Studio'nun şu anda desteklemediği bazı özellikleri listeleyeceğiz. Bu özelliklerden herhangi biri için destek görmek istiyorsanız, aşağıya bir yorum bırakın veya ekibe geri bildirim gönderin (aşağıdaki kapanış bölümüne bakın). Bu liste belirli bir sırada değildir. Aşağıda listelenen öğelerden herhangi biri hakkında daha fazla bilgi için bkz. Visual Studio Code REST Client extension v.

Şu anda Visual Studio HTTP Düzenleyicisi'nde desteklenmiyor

  • İsteğe Bağlı HTTP Yöntemi.
  • Birden fazla satıra yayılan istek satırı.
  • Adlandırılmış İstekler.
  • Dinamik değişkenler.
  • Ortam dosyaları.
  • İsteğin gövdesi olarak dosya yolunu belirtin.
  • multipart/form-data kullanılırken gövde için karma biçim.
  • GraphQL istekleri.
  • kıvırma isteği.
  • CURL olarak kopyala/yapıştır.
  • İstek geçmişi.
  • Yanıt gövdesini dosyaya kaydet.
  • Sertifika tabanlı kimlik doğrulama.
  • Bilgi istemi değişkenleri.
  • Sistem değişkenleri.
  • Yanıt önizlemesini özelleştirin.
  • İstek başına ayarlar.
Artık Visual Studio HTTP Düzenleyicisi'nde nelerin desteklenip nelerin desteklenmediğini ele aldığımıza göre, Visual Studio 2022'de ASP.NET Core Web API geliştiricileri için bundan sonra nelerin geleceğini tartışmaya geçelim.

Sıradaki ne var?

Bu gönderide, Endpoints Explorer ve HTTP Düzenleyici dahil olmak üzere bu geliştiriciler için bazı yeni araçlar içeren bir ASP.NET Core Web API projesi geliştirmenin uçtan uca akışını tartıştık. Bu bizim için uzun bir yolculuğun başlangıcı, bu alandaki yatırımlarımıza önemli bir süre daha devam etmeyi planlıyoruz. Dahil etme desteği eklemek için araştırdığımız özelliklerden ve yeteneklerden bazıları. Aşağıdaki bu liste belirli bir sırada değildir. Aşağıdaki liste, keşfetmekte olduğumuz bazı fikirlerdir, şu anda tüm bu özellikleri sunma taahhüdünde bulunmuyoruz.
  • Bir isteğin gövdesi için bir saplama ekleyin – bir gövde gerektiren istek için, bugün Visual Studio isteğin gövdesi için herhangi bir içerik eklemiyor. Bu isteği tamamlamayı kolaylaştırmak için gövdeye bir taslak eklemenin yollarını arıyoruz.
  • HTTP dosyasının sözdizimi için daha fazla destek ekleyin - sözdiziminin yalnızca REST İstemcisinin desteklediği bir alt kümesini destekliyoruz. Bu açığı kapatmak için çalışacağız, özelliklerin %100'ünü destekleyemeyebiliriz, ancak elimizden geldiğince yaklaşacağız. Burada akla gelen en önemli öğelerden bazıları; Adlandırılmış İstekler, ortam dosyaları, çok parçalı/form-veri isteğinde karışık yanıtlar için destek ve cURL olarak kopyala/yapıştır.
  • Geliştirilmiş Yanıt Görünümü – yanıt görünümü şu anda çok basit. Web sunucusundan gelen sonuçların okunmasını kolaylaştırmak için daha yapılandırılmış bir yanıt görünümü yapmayı planlıyoruz.
  • Endpoints Explorer'da HTTP dosyalarını göster – şu anda Endpoints Explorer, çözümde yalnızca API uç noktalarını gösterir. Çözümde bulunan veya Visual Studio'da açılan HTTP dosyalarını da yüzeye çıkarmak istiyoruz. Bu, bu dosyaları daha basit bir şekilde incelemenizi ve keşfetmenizi sağlayacaktır.
  • İstek geçmişi – daha önce gönderilmiş istekleri görüntüleyebilmeniz ve ardından bu istekleri yeniden gönderebilmeniz için size destek sağlamak istiyoruz. Önceki bir isteği düzenlemek de destek eklemek istediğimiz bir özelliktir.
  • İstek yapmayı basitleştirmek için UX – şu anda bir istek oluşturmak için isteği manuel olarak yazmanız gerekir. Bazı kullanıcılar, bu isteği yazmak için bir grafik kullanıcı arayüzü ile çalışmayı tercih eder.
  • Yanıt gövdesini bir dosyaya kaydet – yanıt görünümünü iyileştirdikten sonra, yanıt gövdesini bir dosyaya kaydetme olanağını eklemek istiyoruz.
  • Test - Web API projelerini test etmeyi basitleştirmenin bir yolunu bulmak istiyoruz. Burada henüz belirli bir planımız yok ama bu bizim için önemli bir alan.
Bir sonraki bölümde, bu senaryolarla ilgili geri bildirim sağlayabileceğiniz farklı yolları açıklayacağım. Yukarıdaki listede çok önemli olduğunu düşündüğünüz özellikler varsa, bu geri bildirimi bizimle paylaşın. Sadece sizin yardımınızla inanılmaz özellikler yaratabiliriz, geri bildirimleriniz bizim için çok önemli.

Deaylı bir şekilde okumak isterseniz eğer (İngilizce):
 

Geri
Yukarı