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.

Fazlasını Oku

Azure Mobile Services .NET Backend : Tablo Ekleme

Merhaba arkadaşlar,

Bu yazımda Azure Mobile Services .NET backend’inde tablo oluşturmayı anlatacağım. Bu yazıyı okumadan önce mobil servislerdeki tablolarla ilgili kavramları anlattığım buradaki yazıyı okumanızı tavsiye ederim.

Öncelikle mobil servis projesini azure portaldan bilgisayara indirdikten sonra projeyi Visual Studio’da açalım. (Projeyi ilk defa açıyorsanız önce build etmek gerekiyor.)

Tablo oluşturmak için oluşturacağımız tablo için bir Data Object sınıfı hazırlamamız gerekiyor. Data object sınıfında ilgili tablonun alanlarını belirtiyoruz.

1. Data Object tanımlama: Solution Explorer’da DataObjects klasörünün üzerine sağ tık yapıp Add -> New Class seçerek yeni bir sınıf ekleyelim. Ve ismine Kitap.cs verelim.

Bu sınıfı EntityData sınıfından türetmemiz ve oluşturacağımız tabloda hangi alanların olacağını belirtmemiz gerekiyor.


2 . Table Controller Ekleme : Şimdi de tablomuz için bir Controller ekleyeceğiz. Bu controller ise tabloya veri ekleme, silme, güncelleme gibi işlemleri handle ettiğimiz sınıf olacak.

Solution Explorer’da Controllers klasörüne sağ tıklayıp Add -> Controller seçelim.

Açılan pencereden Table Controller’ı seçip Add butonuna tıklayalım.

Şimdi de açılan pencerede Model Class kısmında biraz önce oluşturduğumuz Kitap sınıfını seçelim.

Add butonuna tıklandığında Kitap tablosu oluşmuş olacak. 

Şimdi servisi localde çalıştırıp Kitap tablosu için veri ekleyelim.

Gördüğünüz gibi tabloya ilk veriyi ekledik.

Bu işlemden sonra Visual Studio’da Server explorer’da ilgili tablo görünür olacak.

Bu yazımda Azure Mobile Services’te bulunan .NET backendli servisi için nasıl tablo oluşturulacağı hakkında bilgiler verdim. Faydalı olması dileğiyle.

Fazlasını Oku

Azure Mobile Services .NET Backend : Temel Kavramlar

Merhaba arkadaşlar,

Bildiğiniz gibi bir süre önce Azure Mobile Services için .NET backend’i preview’dan çıktı. Ben dahil javascript yazmak istemeyenleri sevindiren bir olaydı.

Bu yazımda Azure Mobile Services’teki Data Context, Data Object ve Controller kavramlarına değineceğim. 

Data Context
Mobil servisin data kısmını bağlayan iskelet gibi düşünebiliriz. Oluşturulan tüm tablolar datacontext’te belirtilmelidir. Data context, Mobil servisi bilgisayarınıza indirdiğinizde default olarak \Models klasörüne bulunan \sampleContext.cs dosyasıdır. Bu context’i silmeyip bunu kullanmanızı öneririm.

Data Object
Data object oluşturacağınız her bir tabloda bulunacak alanları belirttiğiniz bir şablondur. Oluşturacağınız her bir tablo için \DataObjects klasörüne EntityData sınıfından türemiş bir sınıf eklemelisiniz ve oluşturacağınız tabloda olmasını istediğiniz alanları bu sınıf içerisine property olarak eklemelisiniz. Bildiğimiz sınıf, fakat EntityData‘dan türemesi şarttır.

Örnek bir data object sınıfı:

 public class Ogrenci : EntityData
{
public string Name { get; set; }
public string Surname { get; set; }
}


Controller
Tablo ile ilgili her işlem controller sınıflarında yapılır. Javascript backendindeki insert, del, update scriptlerindeki işlemler .NET backend inde controller sayesinde yapılır. Ayrıca custom api oluşturmak için de controller oluşturulur.

Örneğin: Tabloya her ekleme işlemini handle eden Controller içinde bulunan PostTodoItem metodu:

        // POST tables/TodoItem/[id]
public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
{
TodoItem current = await InsertAsync(item);
return CreatedAtRoute("Tables", new { id = current.Id }, current);
}

.NET backendi ile bilinmesi gereken temel kavramlar bunlardı. Önümüzdeki günlerde Tablo oluşturma, custom api oluşturma, controller’a parametre gönderme konularında yazılar yazacağım.

Görüşmek üzere.

Fazlasını Oku

C# : Bir web sitesinin RSS beslemelerini elde etmek

Merhaba arkadaşlar,
Bir web sitesine girdiğimde tarayıcıda görünen rss simgesi hep dikkatimi çekmiştir. Tarayıcının o web sitesindeki rss beslemelerini nasıl tespit ettiğini hep merak ediyordum. Bugün tesadüfen öğrendim <head> </head> tagleri arasına yazılan birtakım kodlar sayesinde tarayıcılar ve arama motorları bu web sitesinin RSS beslemelerinden haberdar oluyorlarmış.

O kod şöyle;

Bunu öğrendikten sonra girilen url’nin beslemelerini döndüren basit bir uygulama yazdım, bugün onu paylaşacağım.

Öncelikle Nuget’ten HtmlAgilityPack’i projeye dahil etmek gerekiyor. HtmlAgilityPack, html kodlarındaki elementlere Regex ile uğraşmadan erişebileceğiniz kullanışlı bir paket.

  public class Feed
{
public string url { get; set; }
public string title { get; set; }
}

Önce Feed adında bir sınıf yazdım, bu sınfın title ve url adında iki adet property’si var.

   static bool ParseUrl(string url)
{
if (string.IsNullOrEmpty(url))
return false;

if (Regex.IsMatch(url, "^http://", RegexOptions.IgnoreCase))
return true;

return false;
}

ParseUrl metodu girilen url’nin geçerli bir url olup olmadığını kontrol eden, geriye true veya false döndüren bir metot.
Basitçe girilen url boşsa false, http:// ile başlıyorsa true döndürüyor.

  static IEnumerable<Feed> findFeed(string url)
{
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(url);

var nodes = doc.DocumentNode.SelectNodes("//link[(@type='application/rss+xml' or @type='application/atom+xml') and @rel='alternate']");

var query = from feed in nodes
select new Feed
{
title = feed.Attributes["title"].Value,
url = feed.Attributes["href"].Value
};
return query;
}

Yukarıdaki findFeed metodu ise kendisine parametre olarak gelen url’deki web sitesini htmldocument olarak kaydediyor. nodes tanımamasında ise bu htmldocument içerisindeki yazının başında belirttiğim şablona uyan elementleri HtmlNodeCollection olarak döndürüyor. Son bölümde ise bu koleksiyondan LINQ ile Feed sınıfına ait nesneler üretiyoruz. ve döndürüyoruz.

Ve main metodu:

 static void Main(string[] args)
{
IEnumerable<Feed> feeds;

Console.Write("Url girin: ");
string url = Console.ReadLine();

if (ParseUrl(url))
feeds = findFeed(url);
else
{
Console.WriteLine("Hatalı url girdiniz.");
return;
}


Console.WriteLine("\n" + url + " adresindeki bulunan beslemeler:\n");
foreach (Feed f in feeds)
{
Console.Write("Başlık: {0} URL:{1} \n", f.title, f.url);
}
Console.ReadLine();
}

Kullanıcıdan url isteniyor, url geçerliyse findFeed metodu ile beslemeler bulunup listeleniyor.

Programın çıktısı da şöyle:

Fazlasını Oku

Behavior’larla birlikte çalışan Trigger’lar ve trigger tipleri

Merhaba arkadaşlar,
Bu yazım Blend’deki triggerlar ile ilgili olacak. Önce türkçe karşılığı tetikleme olan Trigger’ların ne olduğunu belirteyim. Trigger’lar behaviorlar ile birlikte çalışır ve kullanım amacı behavior’u tetiklemektir.

Bir behavior’u tetiklemek için birden çok alternatifimiz var.

  • Bir butona basıldığında
  • Sayfadaki herhangi bir kontrolün herhangi bir property’si değiştiğinde 
  • Kod arkasındaki herhangi bir property’nin değeri değiştiğinde
  • Herhangi bir tuşa basıldığında
  • Belirli zaman aralıklarında bir behavior’u tetikleyebiliriz.

Yukarıdaki verdiklerim behavior’u tetiklemek için kullanabileceğiniz yöntemlerin çok ama çok küçük bir kısmı.

Kısaca bahsettikten sonra trigger tiplerine bakalım;

  • EventTrigger: Bir kontrolün herhangi bir olayında(Click, TextChanged, LostFocus, Loaded…) bir behavior’u tetiklemek için kullandığımız trigger çeşididir.
  • PropertyChangedTrigger: Sayfamızdaki kontrollerden veya sayfamızın DataContext’indeki propertylerden herhangi birinin değeri değiştiğinde kullandığımız trigger.
  • DataTrigger: Sayfamızdaki kontrollerden veya sayfamızın DataContext’indeki propertylerden herhangi birinin değeri değiştiğinde belirli şartlarda behavior’u tetikler fakat PropertyChangedTrigger’dan çok farklıdır. PropertyChangedTrigger’da değişme olduğunda kayıtsız şartsız behavior tetiklenir. Fakat DataTrigger’da şu property şu değere gelince tetikle gibi bir şart koyabilirim.
  • DataSourceChangedTrigger: Sayfanın DataContext’i değiştiğinde behavior’u tetiklemek için kullanılır.
  • TimerTrigger: Belirli bir zaman periyodunda behavior’u tetiklemek için kullandığımız trigger. 10 saniyede bir gibi.
  • KeyTrigger: Herhangi bir tuşa basıldında behavior’u tetikler.
  • StoryBoardCompletedTrigger: Bir storyboard tamamlandığında behavior tetiklenir.

Sayfaya herhangi bir kontrol sürükleyin, bu kontrole bir behavior sürükleyin ve properties penceresinden hangi triggerın propertyleri neler incelemenizi tavsiye ederim.

Yukarıda yaptığım bir örneği görüyorsunuz. Kod arkasında degisken adında bir bool property var. Bir timer aracılığıyla 2 saniyede bir bu değişkenin değerini değiştiriyorum. Değişken her true olduğunda Behavior Tetiklendi yazısı görünür oluyor. Her false oluşunda görünmez yapmak için de tabii ki bir diğer behavior kullandım. Kullandığım behavior ChangePropertyAction idi, TextBlock’un Visibility’sine odaklı bir behaviordu, bunu tetiklemek için de DataTrigger kullandım. DataTrigger ise arka kısımdaki degisken adlı booleana odaklı idi.

MainPage.xaml:

	<Grid x:Name="LayoutRoot" Background="White">
<TextBlock HorizontalAlignment="Left" Text="Property: " Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="149" FontSize="15"/>
<TextBlock HorizontalAlignment="Left" Margin="96,10,0,0" TextWrapping="Wrap" Text="{Binding degisken}" VerticalAlignment="Top" Height="22" Width="171" FontSize="15"/>
<TextBlock HorizontalAlignment="Left" Margin="10,55,0,0" TextWrapping="Wrap" Text="Behavior Tetiklendi" VerticalAlignment="Top" FontSize="20" Width="328" Foreground="#FFC34444" Visibility="Collapsed">
<i:Interaction.Triggers>
<ei:DataTrigger Value="True" Binding="{Binding degisken}">
<ei:ChangePropertyAction PropertyName="Visibility">
<ei:ChangePropertyAction.Value>
<Visibility>Visible</Visibility>
</ei:ChangePropertyAction.Value>
</ei:ChangePropertyAction>
</ei:DataTrigger>

<ei:DataTrigger Value="False" Binding="{Binding degisken}">
<ei:ChangePropertyAction PropertyName="Visibility">
<ei:ChangePropertyAction.Value>
<Visibility>Collapsed</Visibility>
</ei:ChangePropertyAction.Value>
</ei:ChangePropertyAction>
</ei:DataTrigger>
</i:Interaction.Triggers>
</TextBlock>
</Grid>

MainPage.xaml.cs

	public partial class MainPage : UserControl, INotifyPropertyChanged
{
public static bool degisken { get; set; }
DispatcherTimer timerDegistir;

public MainPage()
{
this.DataContext = this;
timerDegistir = new DispatcherTimer();
timerDegistir.Interval = new TimeSpan(0,0,2);
timerDegistir.Tick += callback;
InitializeComponent();
timerDegistir.Start();
}

private void callback(object sender, EventArgs e)
{
if (degisken)
{
degisken = false;
FirePropertyChanged("degisken");
}
else
{
degisken = true;
FirePropertyChanged("degisken");
}
}

public event PropertyChangedEventHandler PropertyChanged;

private void FirePropertyChanged(string pname)
{
PropertyChanged(this, new PropertyChangedEventArgs(pname));
}
}

Blend’deki behavior ve trigger’larla harika işler çıkarabilirsiniz. Naçizane tavsiyem inceleyip kurcalamanızdır.
Görüşmek üzere.

Fazlasını Oku