Azure Mobile Services .NET Backend : Custom API Oluşturmak

Merhabalar,
Bir önceki yazımda Azure’da barındırılan bir mobil servise nasıl tablo eklendiğinden bahsetmiştim. Bu yazımda ise mobil servise bir Custom api ekleyeceğiz.

Tablo oluştururken önce tablo şablonu için EntityData sınıfında türeyen bir sınıf ekleyip daha sonra bir Controller(Table controller) eklemiştik. Custom api oluştururken ise Custom controller ekliyor olacağız.

Bu yazımda şöyle bir basit senaryo düşündüm.

  • Parametre olarak bir sitenin url’sini alan bir api yazacağız
  • Bu api parametre olarak gelen sitenin başlığını çekecek (<title></title> etiketleri arasını)
  • Çekilen başlığı mobil servisimizin veritabanındaki Titles adındaki tablosuna ekleyecek.

Başlamadan önce mobil servise kullanacağımız Title şablonuna uygun bir tablo ekleyeceğiz. Bu yazının konusu tablo eklemeyle ilgili olmadığı için burayı atlıyorum. Şöyle bir tablo ekledim;

Site ve value alanları sitenin adresi ve başlığı için.

Şimdi solution explorer’da Controllers klasörüne sağ tık yapıp Add -> Controller seçelim.

Bunu yaptıktan bir pencere açılacak, o pencereden Custom controller seçip Add butonuna tıklayalım.

İsim olarak getTitleController verdim. Dikkat edilmesi gereken nokta controller isminin controller ile bitmesi gerekiyor. Bu işlemi de yaptıktan sonra controller sınıfımız açılmış olacak. Default olarak şöyle geliyor:

Gördüğünüz gibi son derece basit bir örnek, api çağrıldığında geriye “Hello” dönecek.

Şimdi apimizi yazının başında verdiğim senaryoya göre düzenleyeceğiz. Api, parametre olarak bir website url string alacak, o url’in <title></title> etiketleri arasındaki veriyi çekecek ve bizim mobil servisimizdeki Titles tablosuna ekleyecek.

 public class getTitleController : ApiController
{
public ApiServices Services { get; set; }

servicesampleContext context = new servicesampleContext();

// GET api/getTitle
public string Get(string url)
{
WebClient client = new WebClient();
string source = client.DownloadString(url);
string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;

this.context.Titles.Add(new Title { Id = (context.Titles.Count<Title>() + 1).ToString(), Site = url, Value = title });
this.context.SaveChanges();

return url + " basligi eklendi";
}

}

Bu kodda açıklanması gereken bir kaç kısım var. serviceSample benim azure üzerinde oluşturduğum mobil servisin ismi idi. serviceSampleContext ise bu servisimin Data context’i. (Data context kavramından bir önceki makalede bahsetmiştim. Kısaca açıklamak gerekirse Data context bizim tablolarımız arasındaki ilişkiyi kuran yapı. Bir tabloya custom api üzerinden veri eklemek için serviceSampleContext’i kullanmamız gerekecek.)


Kodu düzenlemen önce Get metodu parametre almıyordu, biz onu url parametresini alacak şekilde düzenledik. Daha sonra WebClient sınıfını kullanarak url’in html kaynağını string olarak indirdik. Sonrasında regex ile site başlığını çektik.(İtiraf ediyorum regex patternı ben yazmadım. : ) )

Sonrasında ise context’imizin Titles adlı özelliğine yeni bir Title sınıfı örneği ekledik. Ve bu değişiklikleri kaydetmek için SaveChanges() metodunu çağırdık.

Servisi bu haliyle test ettiğimizde parametre olarak girilen url’in tabloya eklendiğini göreceğiz. Browser üzerinden apiye direk çağrıda url’de : ve // karakterleri olduğundan izin verilmiyor, bu sebeple mobile services’ın test aracını kullandım.

Bu apileri client üzerinden nasıl çağrıldığına, nasıl parametreler gönderildiğine önümüzdeki günlerde değineceğim fakat kısaca bahsetmek gerekirse

Mobil servisin InvokeApiAsync(string apiismi) veya InvokeApiAsync(string apiismi, IDictionary<string,string> parametreler) metodlarını kullanarak custom apilere client üzerinden çağrı gönderebiliyoruz. 

Azure mobile services üzerinde custom api oluşturup basit bir örnek yaptık, faydalı olması dileğiyle.

Azure Mobile Services .NET Backend : Custom API Oluşturmak” üzerine 2 yorumlar

  1. Bu bilgilendirici blog için teşekkür ederim. Azure deneme sürümü boyunca 20 mb lık bir database oluşturmaya izin veriyor. TodoList örneği için oluşturduğum free database e farklı bir servisten gelen verileride kaydetmek istiyorum ama verileri gönderdiğimde mobile servis sorunsuz çalışmasına rağmen veriler database e yazılmıyor bu neden kaynaklı olabilir. İstediğim servisten verlileri alıp yönetmek için paralı hizmet satın alıp yeni bir database mı oluşturmalıyım?

  2. Merhaba Ali,
    Güzel yorumunuz için teşekkür ederim.

    Böyle bir kısıt yok, free database'in de diğer ücretli planlardaki gibi çalışması gerekiyor. Bu hatanın birçok sebebi olabilir. Benim tecrübe edindiğim kısım şu: Genellikle Context'in SaveChanges() metodunu insanlar çağırmayı unutur. Bu sebeple kaydedilmiyor olabilir.

    Yorumunuz için tekrar teşekkür ederim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir