Wep Api Route Custom Constraint(Özel Kısıtlama)
Merhabalar Bu yazımda wep api routing yazımda bahsettiğim kısıtlamalar kısmının özel kısıtlamalar oluşturma örneğinden bahsedeceğim.
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
Route Custom Constraint(Özel Kısıtlama):
Örneğimizde giriş yapılan parametrenin son harfinin A,B,C harfleinden birini alıp almadığını kontrol eden , alıyorsa başarılı şekilde eğer bu kuralı sağlamıyorsa 404 not found şeklinde dönecek şekilde bir kısıtlama yazacağız.
Öncelikle projemizde karışıklık olmaması için bir kalsör ekliyoruz ismi Constraint olsun ve içine LastLetter.cs adında bir class oluşturuyoruz :
daha sonra bu clasımızı IHttpRouteConstraint interfaceini implement ediyoruz , bu interface oluşturmuş olduğumuz calssımızı bir constraint olaması için gereken kuralları ve methodları bize tanımlayacaktır.
interface i kullanabilmek için using System.Web.Http.Routing; i esing kısmına ekliyoruz.
Örnek kodumuz :
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Web; using System.Web.Http.Routing; namespace WebApp1.Routing.Constraints { public class LastLetter : IHttpRouteConstraint { public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) { string paramVal = values[parameterName].ToString().ToLower(); if (paramVal.EndsWith("a") || paramVal.EndsWith("b") || paramVal.EndsWith("c")) return true; return false; } } }
interfaceimizden gelen metodumuz :
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
bu yapıya uygun olarak kodumuzu düzenliyoruz.
kuralımız sağlarsa return true sağlamaz ise false olarak geri dönüş sağlıyoruz.
bu sınıfımız tanımladıktan sonra App_Start alıtında bulunan WebApiConfig.cs dosyamıza bu constraint tanımızı eklememiz ve projeye tanıtmamız gerekiyor.
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Web.Http.Routing; using WebApp1.Routing.Constraints; namespace WebApp1.Routing { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("lastletter", typeof(LastLetter)); // Web API routes config.MapHttpAttributeRoutes(constraintResolver); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } }
WebApiConfig.cs dosyamıza eklediğimiz kod satırlar :
// Web API configuration and services
var constraintResolver = new DefaultInlineConstraintResolver();
constraintResolver.ConstraintMap.Add(“lastletter”, typeof(LastLetter));
Bu satırları ve kodları anlayabilmesi için using olarak ekledğimiz using ler :
using System.Web.Http.Routing;
using WebApp1.Routing.Constraints;
isimlendirme olarak çözücü anlamında olan resolver isimini verdik.
burada dikkat edilmesi gereken “lastletter” kısmında tanımlanan isim, route constarint te kullanacağımız isimin bu tanım olacağı.
ayrıca diğer dikkat edilmesi gereken konu route işlemlerini aktif eden kod tanımının WebApiConfig.cs dosyamızda tanımlı olması.
// Web API routes
config.MapHttpAttributeRoutes(constraintResolver);
bu tanımlamalar sonrası artık action larımızda “lastletter”constraintini kullanabiliriz.
Örn :
// [Route("{name:alpha:lastletter}")] public string Get(string name) { return "test"; } //
şeklinde kullanabiliriz.
farklı yazılarda görüşmek üzere 🙂
Kaynak ve Detaylı bilgiler için : Microsoft Link