Web Api Routing – Yönlendirme İşlemleri

Merhabalar Arkadaşlar , Bu yazıda ASP.Net Web Api Routing işlemlerini ve yöntemlerini neler olduğunu inceleyeceğiz.

Convention Based Routing Kavramı:

Bir wep api projesi oluşturduğumuzda default olarak routing yöntemidir.

default routing ayarımız nedir dersek bunun bilgisini projemizde App_Start Klasöründe bulunan WebApiConfig.cs dosyasındaki ayarlardır.

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

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

screenshot_1

tanımlamada görüleceği gibi api/{controller}/{id} şeklinde kullanılmalıdır , bu durumda api mize yapacağımız request (istek) metoduna göre nasıl işlem yapılacağını api nasıl anlıyor GET ,POST,DELETE v.s. bu tanımlamalarda wep api deki controllerda ki metodların isimlendirmesinin başında get , post olması bekleniyor sadece get() olabileceği gibi getVeriler() şeklinde bir metodumuz var ise bu metod apiye get metod ile istek attığımızda çalışacaktır. fakat bu tanımlamada controller da aynı imzaya sahip yani aynı parametrelere sahip iki metod var ise hata alınacaktır bunun için farklı routing metodları kullanılmalıdır.

Örn : Bu tanımlamada hatalı olacak bir kod örneği :

// GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        public string getSiteLink()
        {
            return "www.salihseker.com";
        }

 

screenshot_2

get metodu ile istek attığımızda iki tane get metodu ve parametresi olmayan action lar (methodlar) olduğu için sonuç dönmeyecektir ve api hata dönecektir.

Action Based Routing Kavramı :

Bu yönlendirme işleminde api ye istek atarken kullandığımız default kuralında değişiklik yaparak istek url ine action ismini eklememizi de sağlayarak direkt olarak istediğimiz metodu çağırarak aynı isimle başlayan ve imzası aynı olan get , post v.s. metodlu birden fazla action tanımlayıp kullanabiliriz , hatta isimlendirmelerinde başlarına get,post v.s. yazmamıza gerek de kalmayacaktır.

yapmamız gereken App_Start Klasöründe bulunan WebApiConfig.cs dosyasındaki kodumuzu düzenlemek.

 public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

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

screenshot_3

bu ayarı yaptıktan sonra controller ımızda actionlarımızı tanımlarken actionlarımızın başına attribute lerini eklemeliyiz methodumuzun get mi post mu veya farklı bir işlemmi belirtmeliyiz.

Örn :

public class ValuesController : ApiController
    {

        [HttpGet]
        public string siparisleriGetir()
        {
            return "siparisler";
        }
        [HttpGet]
        public string urunleriGetir()
        {
            return "urunler";
        }
        [HttpPost]
        public void urunEkle([FromBody]string value)
        {
        }
    }

artık bu şekilde

api/Values/siparisleriGetir şeklinde apimize istek yapabilir ve başarılı şekilde kullanabiliriz.

Attribute Based Routing:

wep apimizde actionlarımız ın attributlerinde bulunan route attribute ile istediğimiz action a özel bir yönlendirme işlemi yapabiliriz.

öncelikle bu işlemi yapmamızı sağlayan kısım WebApiConfig.cs dosyamızdaki

// Web API routes
            config.MapHttpAttributeRoutes();

kod ayarıdır.

Örn :

 public class ValuesController : ApiController
    {

        [HttpGet]
        public string siparisleriGetir()
        {
            return "siparisler";
        }

        [HttpGet]
        [Route("api/test")]
        public string urunleriGetir()
        {
            return "urunler";
        }
        
    }

screenshot_4

actionımıza  [Route(“api/test”)] route attribute ünü ekleyip devamına belirtmek istediğimiz yolu yazarak bu action ın yeni url ini tanımlayabiliriz , artık bu action a ulaşmak istediğimizde

domainadi/api/test şeklinde erişim sağlayabiliriz.

RoutePrefix Kullanımı :

route prefix attribute’ü action bazlı değilde controller içerisindeki tüm atributelerin başlangıç adresini değiştirmek için kullanılır tek tek tüm action lara yazmak yerine controller ın attribute üne ekleyerek işimizi hızlıca çözmemizi sağlar.

Örn :

//

[RoutePrefix("api/siparis")]
    public class ValuesController : ApiController
    {

        [HttpGet]
        [Route("getir")]
        public string siparisleriGetir()
        {
            return "siparisler";
        }

        [HttpPost]
        [Route("ekle")]
        public string siparisEkle(int id)
        {
            return "sipariEkle";
        }

        [HttpGet]
        [Route("~/api/urunler/getir")]
        public string urunleriGetir()
        {
            return "ürünler";
        }

    }

screenshot_5

Örnekte görüleceği gibi controller başına eklediğimiz routeprefix ([RoutePrefix(“api/siparis”)]) ile controller ın içerğindeki actionların adresini başlangıcını değiştirdik actionların route kısımlarına bu prefix tanımından sonra gelecek olan tanımlamaları eklememiz yeterli olacaktır ,

istisna bir durum söz konusu ise örneğin controller içinde bulunan bir action için bu prefix i kullanmak istemez isek urunleriGetir action ında olduğu gibi route tanımının başına tilda işareti yani “~” ile başlayacak şekilde url imizi tanımlamalıyız. bu  şekilde bu route tanımı prefix tanımı dışında kalacaktır.

Örn : domainadi/api/siparis/getir

domainadi/api/urunler/getir

şeklinde kullanılabileceklerdir.

Route Contstraint(Kısıtlama) Kullanımı:

actionlarımızı çağırıken giriş parametrelerine kısıtlar koymak istediğimizde kullanılacak atrributlerdir , örneğin sayısal değer olması metinsel alan olması , sayının max değeri v.s.

kısıtlamaları action lara yapmamız için kullanılır.

Örneğin iki tane get methodumuz var biri int diğeri string tek parametre alıyor bu durumda da aynı şekilde bu kısıtlamalar kullanılmalıdır.

bu kısıtlamalar hazır olanlar olduğu gibi kendimizde eklemeler yapabiliriz.

Örn :

// 

[Route("{id:int}")]
        public Employee Get(int id)
        {
            return Employees.FirstOrDefault(e => e.Id == id);
        }

        [Route("{name:alpha}")]
        public Employee Get(string name)
        {
            return Employees.FirstOrDefault(e => e.Name.ToLower() == name.ToLower());
        }

giriş yapılan int değerinin aralığını kısıtlamak örneğin :

[Route("{id:int:range(1,5)}")]
        public Employee Get(int id)
        {
            return Employees.FirstOrDefault(e => e.Id == id);
        }

Örn : min ve max değelerini belirleme :

[Route("{id:int:min(1):max(5)}")]
        public Employee Get(int id)
        {
            return Employees.FirstOrDefault(e => e.Id == id);
        }

örnekte gördüğünüz gibi iki nokta üst üste işareti ile “:” birden fazla kısıt ekleyebiliriz.

Bu kısıtları microsoftun sitesinden inceleyebilirisiniz. link : wep api kısıtlar

 

yazımı burada sonlandırıyorum 🙂 umarım faydalı olmuştur.

Print Friendly, PDF & Email

You may also like...

Bir cevap yazın