Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET MVC – Web Api Nedir? Nasıl Oluşturulur?

Merhaba,

Günümüz uygulamaları yapısal olarak kendi bünyelerinde bir bütün teşkil etselerde kullanıcılara daha farklı hitap şekilleriyle piyasada fark yaratmaya çalışmaktadırlar ve bu hitap şekilleri yer yer uygulama üzerinde belirli noktaları dünyaya açacak kadar ileri derece fikirlerle zenginleştirilmektedir. Bu konuya örnek olarak dünya devlerinden Google’ı verebiliriz. Google maps özelliğini sadece son kullanıcılara hizmet veren bir navigasyon uygulaması olarak tasarlamış olsaydı muhtemelen çoktan bu hizmette olan desteğini sonlandırmış olacaktı. Bilhassa kullanıcılarada kendi ihtiyaçları doğrultusunda maps uygulaması üzerinden geliştirmeler yapabilme olanağı tanıyarak ürünün detaylı gelişimini dünyaya bırakmış oldu. Benzer şekilde Facebook’u ele alırsak eğer, en basitinden Facebook ile Login uygulaması yapılmasına müsaade ederek, kitlelere hitap eden siteler üzerinde kendi varlığını hissetirirken biryandan da toplumsal bir nüfuz sağlamış oldu.

Peki bu dünya devlerine erişim nasıl sağlandı diye sorarsanız eğer arada sadece API diye nitelendirilen ve uygulama geliştiren firma/şahıs tarafından yapıya özel tasarlanmış ve belirli veri yahut işlemlere kontrollü bir şekilde erişim izni verilmiş yapılar ortaya kondu.

İnsanlar bu API denen yapılar aracılığıyla uygulama geliştiricisinin çizdiği sınırlarda o uygulamanın belli başlı nimetlerinden faydalanabilir oldu. İşte bu içeriğimizde Asp.NET MVC uygulamalarımızda istediğimiz nimetleri diğer insanlarla paylaşabileceğimiz API uygulamalarının nasıl oluşturulacağını teknik boyutta detaylıca ele alacağız.

İlk olarak API’yi tanımlayarak işe başlayalım.

API Nedir?

API, Türkçe manası “Uygulama Geliştirme Arayüzü” olan “Application Programming Interface” kelimelerinin baş harflerinden meydana gelen bir sözcüktür. API sayesinde yazılım geliştiricileri, ellerindeki verileri yahut işlevsellikleri istedikleri sınırlılıkta dış dünyayla paylaşabilmekte ve bu paylaşım sürecinde tüm kontrolleri ellerinde tutabilmektedirler.

Dolayısıyla bu paylaşım neticesinde farklı uygulamalar yahut platformlar herşeyden(dil, platform, alt yapı vs.) bağımsız bir şekilde verilerden yahut işlevselliklerden istifade edebilir.

Neden Web API Kullanmalıyız?

Son yıllarda internete erişim olanağı çok farklı platformlar tarafından sağlandığı için dolayısıyla kullanıcıların ihtiyaçlarını sadece web siteleri karşılayamaz olmuştur. Bu platformlar bilgisayarlarla birlikte tabletler ve özellikle biribirinden farklı yetenekler sergileyen mobil telefonlardır. Haliyle uygulama geliştiricileri platformdan bağımsız bir şekilde kullanıcılara ulaşabilmek için uygulamadan da bağımsız API geliştirmeye yönelmektedirler. Geliştirilen bu API’ler tüm platform ve uygulamaların okuyup, anlamlandırabileceği XML veya JSON gibi veri tiplerini kullanarak hizmet sunmakta ve bu şekilde tüm bağımlılıklardan kendilerini arındırarak geliştiricilerin amaçları doğrultusunda son kullanıcılara hizmet verebilmektedirler.

Asp.NET MVC İle Web API Nasıl Oluşturulur?

Şimdi geldik makalemizin esas konusuna. Asp.NET MVC ile Web API konusunu detaylıca ele alabilmek için öncelikle boş bir Web API projesini oluşturalım. Ardından makalemizde örneklendirme yapabilmemiz için North Wind veritabanını Entity Framework ile projeye entegre edelim.
Asp.NET MVC - Web Api Nedir? Nasıl Oluşturulur?

Web API konusunda üç farklı duruma hakim olmamız gerekmektedir. Bu durumlar;

  • Route yapılanması,
  • GET – POST durumları
  • ve yapılacak işe göre isimlendirme yöntemi.

İlk olarak Route yapılanmasını inceleyelim.

“App_Start” klasörü altındaki “WebApiConfig.cs” dosyasının içeriğine göz atarsak eğer;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace WebApiApplication
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

şeklinde bir route tasarımı mevcuttur. Öncelikle Web API’nin kullanacağı route şablonunu oluşturmamız gerekmektedir. Bizler bu örneğimizde; veri getirme, post etme ve bir yandan da güncelleme üzerine örneklendirme yapacağımızdan dolayı ona göre bir route tasarlayacağız.

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

Evet… Route şablonumuzu hazırlamış olduk. Şimdi sıra API’mizi oluşturmaya geldi.

Tabi bir yandan API’mizi oluştururken bir yandan da API sınıflarının detaylarından bahserek GET – POST durumlarını inceleyelim.

    public class PersonelController : ApiController
    {
    }

Yukarıdaki kod bloğunu incelerseniz eğer “Personel(Controller).cs” isminde bir API oluşturmuş olduk. Bir sınıfın API olabilmesi için “ApiController” sınıfından türemesi gerektiğini anladığınızı düşünüyorum…

Velhasıl şimdi bu API ile uygulamanın dışına açmak istediğimiz nimetleri tasarlayacağımız metotları oluşturalım. Tabi burada dikkat edilmesi gereken nokta oluşturulacak ilgili metodun GET’mi POST’mu olduğudur.

    public class PersonelController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();
        public IEnumerable<Personeller> GetPersoneller() => db.Personeller.ToList();
    }

Yukarıdaki metoda bakarsanız eğer bir GET metodudur. Nereden mi anlıyoruz? Bakınca görülüyor işte 🙂 Doğrusu bizim anlayıp anlamamız şu durum için çok önemli değil. Web API bunun bir GET metodu olduğunu nereden anlayacak? asıl soru bu! Bu sorunun iki cevabı vardır. Öncelikle compiler ilgili metodun ismine bakacaktır. GET ile mi POST ile mi başlıyor. Ona göre ilgili metodun GET ya da POST olduğunu anlıyor. Yani buarada “(Get)Personeller” metodu GET ile başladığı için API tarafından GET metodu olarak algılanmaktadır.

Eğer ki metot ismi GET ya da POST ile başlamıyorsa compiler ilgili metodun “HttpGet” ya da “HttpPost” attributelarından hangisiyle işaretlendiğine bakacaktır.

    public class PersonelController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();
        [HttpGet]
        public IEnumerable<Personeller> TumPersonelleriGetir() => db.Personeller.ToList();
    }

Yukarıdaki örnekte olduğu gibi…

Dolayısıyla API içerisindeki metotları isimlendirirken dikkat etmemiz gerektiğini anlamış olsa gerek.

Birazdan API metotlarımızı oluşturacağız. Lakin herşeyden önce bize engel teşkil edecek bir olası hata durumunu öncelikle değerlendirip konumuza devam etmek istiyorum.

API metotlarını route yapılanmasında olduğu gibi tetiklemekteyiz. Örneğin;

    public class PersonelController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();
        //GET Metodu
        public IEnumerable<Personeller> GetPersoneller() => db.Personeller.ToList();
    }

yukarıdaki “GetPersoneller” isimli metoda talep göndermek için aşağıdaki gibi linki tetiklememiz gerekmektedir.

localhost:*****/api/personel/GetPersoneller

Bu şekilde metoda talep gönderildiği vakit aşağıdaki gibi hatayla karşılaşılacaktır.
Asp.NET MVC - Web Api Nedir? Nasıl Oluşturulur?
Bu hatanın sebebi, veritabanının ilgili tablosunun tüm özelliklerinin dışarıya açılmasından kaynaklanmaktadır. Bizler Web API’ler de lüzumsuz yere tüm tablo bilgilerimizin erişilebilir olmasını istemeyiz. Haliyle bunu API’de istememekte. İşte bu yüzden direkt olarak Entity Framework tarafından oluşturulan entity dışarıya açılmamaktadır. Yerine istediğimiz verileri sunacağımız bir entity oluşturarak kontrollü bir yapı sunmamız bu hatadan bizleri kurtaracaktır.

    public class Personel
    {
        public int PersonelId { get; set; }
        public string Adi { get; set; }
        public string Soyadi { get; set; }
        public string Unvan { get; set; }
    }

Evet… Gördüğünüz üzere yukarıda oluşturmuş olduğum “Personel” sınıfı ile veritabanımdaki tablomun dışarı açacağım alanlarını temsil etmekteyim. Bu şekilde hem veritabanımdaki tablomun güvenliğini sağlamış bulunuyorum hem de dışarıya lüzumsuz alan çıkartarak oluşacak performans kaybını önlemiş oluyorum.

    public class PersonelController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();
        //GET Metodu
        public IEnumerable<Personel> GetPersoneller() => db.Personeller.Select(p => new Personel
        {
            Adi = p.Adi,
            Soyadi = p.SoyAdi,
            PersonelId = p.PersonelID,
            Unvan = p.Unvan
        }).ToList();
    }

Haliyle tüm metot yapımı oluşturduğum ve dış dünya ile temas kuracak entity tipinde şekillendiriyorum.
Asp.NET MVC - Web Api Nedir? Nasıl Oluşturulur?

Görüldüğü üzere olası hatamıza nasıl çözüm bulacağımızı yerinde görmüş olduk.

Hazır yeri gelmişken önemli bir hususuda belirtmek istiyorum ki; response neticesinde gelen veriyi JSON olarak görmek isterseniz gelen XML datasını Clear etmeniz yeterli olacaktır. Bu işlemide

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

        }
    }

şeklinde “WebApiConfig.cs” dosyasına “GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();” komutunu ekleyerek gerçekleştirebilir ve bundan böyle gelecek tüm sonuçları JSON veri formatında elde edebiliriz.

Şimdi konumuza devam ederek gönül rahatlığıyla API metotlarımızı oluşturabiliriz.

    public class PersonelController : ApiController
    {
        NorthwindEntities db = new NorthwindEntities();
        //GET Metodu
        public IEnumerable<Personel> GetPersoneller() => db.Personeller.Select(p => new Personel
        {
            Adi = p.Adi,
            Soyadi = p.SoyAdi,
            PersonelId = p.PersonelID,
            Unvan = p.Unvan
        }).ToList();
        //GET Metodu
        [HttpGet]
        public Personel PersonelGetir(int id)
        {
            Personeller p1 = db.Personeller.FirstOrDefault(p => p.PersonelID == id);
            return new Personel
            {
                Adi = p1.Adi,
                Soyadi = p1.SoyAdi,
                PersonelId = p1.PersonelID,
                Unvan = p1.Unvan
            };
        }
        //POST Metodu
        public IHttpActionResult PostPersonel(Personel personel)
        {
            db.Personeller.Add(new Personeller
            {
                Adi = personel.Adi,
                SoyAdi = personel.Soyadi,
                Unvan = personel.Unvan
            });

            db.SaveChanges();
            return Ok<string>("Personel kaydedildi...");
        }
        //PUT Metodu
        public IHttpActionResult PutKategori(int id)
        {
            Kategoriler kategori = db.Kategoriler.FirstOrDefault(k => k.KategoriID == id);
            kategori.KategoriAdi = " - Güncel";

            db.SaveChanges();

            return Ok<string>("Kategori güncellenmiştir...");
        }

        //PUT Metodu
        [HttpPut]
        public IHttpActionResult KategoriGuncelle(int id)
        {
            Kategoriler kategori = db.Kategoriler.FirstOrDefault(k => k.KategoriID == id);
            kategori.KategoriAdi = " - Güncel";

            db.SaveChanges();

            return Ok<string>("Kategori güncellenmiştir...");
        }
    }

Gördüğünüz üzere Web API’mizi her cins metodu örneklendirecek şekilde oluşturmuş olduk. Şu ana kadar GET metotlarının link üzerinden basitçe tetiklendiğini gördük. Lakin POST metotlarının tetiklenme mekanizması biraz farklı olduğu için bu yazımızda ek bir uygulama kullanarak gerçekleştireceğiz.

Google amcaya gidip “PostMan” yazdığınız vakit karşınıza gelen uygulamayı indirip, yükleyiniz.

Asp.NET MVC - Web Api Nedir? Nasıl Oluşturulur?
Ekran alıntısında olduğu üzere POST metotlarını görüldüğü gibi tetikleyebilmekte ve çalışıp çalışmadığını denetlemekteyiz.

Evet arkadaşlar… Asp.NET MVC’de Web API’lerin nasıl oluşturulduğunu görmüş olduk. Bu içeriğimizde yapmış olduğumuz tüm işlemleri güvenlik doğrulaması yapmaksızın gerçekleştirmiş olduk. Dolayısıyla bir başka yazımızda bu içeriğimizin devamı niteliğinde Token Authentication ile Web API üzerine istişare ediyor olacağız.

O halde sonraki yazımda görüşmek üzere diyelim…

İyi çalışmalar dilerim…

Bunlar da hoşunuza gidebilir...

25 Cevaplar

  1. suleyman dedi ki:

    selam borsa için belli krıterleri bulan ve buna göre strajıme uygun hareket eden bir yazılım yapmak istiyorum. boyle birseyin yasal açıdan bir sorunu var mıdır. birde yapılabilirse
    sizce nasıl bir yol izlemeliyim.

  2. Alihan dedi ki:

    Merhaba asp.net mvc ile oluşturduğum e-ticaret siteme shopier sistemini api ile entegre etmek istiyorum. Yardımcı olabilir misiniz?

  3. Murat Can KEKLİK dedi ki:

    Merhaba,
    localde olusturdugum ve calısan bir apiyi nasıl hosting üzerine yükleyip “www.siteismi.com/Kullanici/getKullanici” gibi kullanabilirim?

  4. Mert dedi ki:

    Merhaba, MVC 5 ile oluşturduğum projemde api ile bilgi döndürmek istiyordum fakat sizin yönteminizi de denememe rağmen Sayfa Bulunamadı 404 hatası alıyorum. Projemi MVC yapısıyla oluşturup Web Api seçeneğini seçmemiştim bununla alakası olabilir mi? Sizin gibi sadece Controller ekleyerek aynı adımları uyguladım.

  5. Mert dedi ki:
            DBKUTUPHANEEntities db = new DBKUTUPHANEEntities();
            public IEnumerable GetPersoneller() =&gt; db.TBLPERSONEL.Select(p =&gt; new Personel
            {
                ID = p.ID,
                PERSONEL = p.PERSONEL
            }).ToList();
    

    Eğer bakmak isterseniz GitHub linkini internet sitesi bölümüne ekledim. Oradan da ulaşabilirsiniz. Teşekkürler.

  6. Mert dedi ki:

    Merhabalar tekrar bahsettiğim sorun global.asax sınıfına 1 kod satırının eklenmemesinden kaynaklanmış araştırıp buldum. Şimdi ise farklı bir hata alıyorum PersonelGetir methodunun içindeki ilk satırda id==id yaptığımda CS0029 C# Cannot implicitly convert type to.. hatası alıyorum bu problemi nasıl çözebilirim?

  7. Hamit dedi ki:

    Öncelikle birçok içeriğinizden yararlandım elinize sağlık Hocam,
    mvc api ile ilgili bir sorum olacak burada hazırlamış olduğunuz metoda
    örneğin;
    PostPersonel metoduna istek geliyor (aynı saniye içerisinde 1-100 arası) ve bu isteği yapan bir windows servis. Windows servis kendi datasından kayıt olduğu sürece okuyor ve web servisime istekte bulunuyor(windows servis her saniye çalışıyor).

    Her bir istek için string cevap dönüyorum. Fakat istek sayısı 50 civarıda yada üstü olunca tabloma aynı anda aynı salisede kayıt atıyor üstelik bu kaydı ben procedure ile insert yapıyorum ve procedure içerisinde aynı shorturl varsa kayıt yapma diye kontrol ettiğim halde.

    Bu soruna sebep olma durumu ile ilgili olarak web servisimin windows servis istek sıklığına cevap verememesi ile alakalı olarak görüyorum, ama nasıl oluyorda kayıtlar çiftlenebiliyor. üstelik metod içerisinde random kısakod üreten sonuç bile aynı oluyor

    SQL TABLO
    ShortUrl CreateTime
    lw8ubr6l 2021-05-18 00:01:30.983 1
    lw8ubr6l 2021-05-18 00:01:30.983 1

    Sizce bu hangi bilgisizliğimden oluyor, hangi konuyu araştırmam gerekir bir yol gösterebilir misiniz?

    • Gençay dedi ki:

      Merhaba,

      Anladığım kadarıyla tabloya kayıt atarken tekrarlamasını önlemek istiyorsunuz. Sizden ricam Windows servis’te ki ilgili kod bloğunu ve isteği karşılayan action kodlarını paylaşmanızdır.

  8. Hamit dedi ki:

    windows servis bana ait bir proje değil o kısmın kod yapısını bilmiyorum hocam ama saniyede aynı anda 50-100 arası istek attığını biliyorum.

    GetRandomUrl metodu üretilen uzun linkler için karşılığında verdiğim kısalink kodu oluşturuyor.
    https://www.gencayyildiz.com/lw8ubr6l gibi bir link üretmiş oluyorum bunu sms gönderiminde kullanıyoruz az karakter kullanmak için.

    Bahsettiğim servis sms gönderimi yapmak için kayıtları hazırlıyor. Burada garip olan üretilen GetRandomUrl() deki sonucun aynı olması. Normalde debug yaparken veya az istek varken bu sorunile karşılaşmıyorum.

            [BasicAuthentication]
            public string Get([FromUri] string urladres)
            {
                urladres = manager.Base64Decode(urladres);
                string shortUrl = manager.GetRandomUrl();
                Url url = manager.UrlOlustur(shortUrl, urladres);
    
                return  url.ShortUrl;
            }
    
             public string GetRandomUrl()
            {
                var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
                var random = new Random();
                string result = new string(
                    Enumerable.Repeat(chars,8)
                              .Select(s => s[random.Next(s.Length)])
                              .ToArray());
                return result;
            }
    

    Hatta ben kendim test için winform uygulamasına timer ekledim ve her saniye çalıştırdım ve 50 istek üzerinde bulundum gerçektende arada kayıtlar çift hatta üçlü bile atıyor üstelik üretilen GetRandomUrl metodundaki sonuçta aynı oluyor.

    winform örnek istek

             private async void timer1_Tick(object sender, EventArgs e)
            {
                int sayacDegeri = 100;
                lstBoxLink.Items.Clear();
                string uzunLink = "";
                for (int i = 0; i < sayacDegeri; i++)
                {
                    uzunLink = "https://192.168.3.9/testDenemeLink_" + i.ToString();
                    string sonuc = await KisaLinkOlusturAsync(Base64Encode(uzunLink));
                    string[] getUrl = sonuc.ToString().Split('"');
                    if (getUrl[1] != null)
                        lstBoxLink.Items.Add($"{i.ToString()}-{getUrl[1]}');
                    if (i == 29)
                        timer1.Stop();
                }
            }
            public async Task KisaLinkOlusturAsync(string url)
            {
                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic",
                           Convert.ToBase64String(
                               System.Text.Encoding.ASCII.GetBytes(
                                   string.Format("{0}:{1}", "deneme123", "bhcc2021!?"))));
                HttpResponseMessage response = await client.GetAsync("https://localhost:44372/api/url/get?urladres=" + url);
                if (response.IsSuccessStatusCode)
                {
                    return await response.Content.ReadAsStringAsync();
                }
                else
                    return "yetkisiz";
            }
    
  9. Hamit dedi ki:

    Hocam kusura bakmayın kendinizi cevaplamak zorunda hissetmeyin lütfen karışık bir durum. Ayrıca mesajı düzenli attım ama fazla olduğu için karışık göründü sanırım. Sizi rahatsız ederse silebilirsiniz kötü görünüyor açıkcası 🙂

    • Gençay dedi ki:

      Yoo estafurullah… Vakit ayırıp probleminize dair çözüm araştırıyorum. Bulduğum ilk fırsatta size önerilerimi sunarım.

      Sevgiler.

  10. Yusuf dedi ki:

    Eklemek istediğim veri tabanında ilişkili tablolar bulunuyor ve benim bu tablolardaki ilgili alanlara da veri girmek istiyorum ancak sadece ID değerini görüyor. Örnek veriyorum ÖğrenciAdi demek istiyorum ama sadece OgrenciID geliyor.

  11. Ahmet Emin Öztürk dedi ki:

    Hocam merhabalar , Bir controller’da birden fazla HttpGet metodu kullanmak istiyorum 3 taneye kadar yapabildim bir tanesi [HttpGet] yaptım bir tanesini [HttpGet (“{action}”)] yaptım buna swagger parametre istiyor action adını yazıyorum verileri getirtiyorum biri [HttpGet(“{id}”)] id’ye göre getiriyorum controller tarafında actionda belirttiğim id parametresini istiyor swagger üzerinden getirtiyorum sorun yok fakat bu ben bu üçüne ek olarak bir kaç tane daha HttpGet metodu kullanmak istiyorum bunun organizasyonu hakkında kaynak tavsiyeniz var mıdır hocam ?
    Saygılarımla…

  12. serdar dedi ki:

    merhaba ben zaten client dan script le controllere ulaşabiliyorum.Bunun farkı controlleri bir web servis api olarak dışarı açmak mı ?

  1. 27 Haziran 2018

    […] önceki Asp.NET MVC – Web Api Nedir? Nasıl Oluşturulur? başlıklı yazımda Web Apilerin ne olduklarına ve nasıl oluşturulduklarına değinen içeriği […]

  2. 01 Temmuz 2018

    […] içeriğimizde Angular ile Web API tetiklemeyi inceliyor olacağız. İlk olarak Asp.NET MVC – Web Api Nedir? Nasıl Oluşturulur? başlıklı makalemde ele aldığımız gibi bir Web API oluşturacak ve ardından bu Web […]

  3. 29 Haziran 2022

Gençay için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir