Mobile Services JS Backend - Scheduler

Mobile Services Scheduler ile yazdığımız kodların otomatik olarak belli zaman aralıklarında veya istediğimiz zaman çalışmasını sağlamak mümkün. Örneğin merkez bankasından doviz kurlarını çekerek database'e yazıyorsanız ve bu işlemin her 15dk'da bir tekrar etmesini isterseniz, Scheduler sizin için kullanışlı olacaktır.

Yukarıda verdiğim örneğe çok benzer bir örnek üzerinde çalışalım.

Merkez Bankası bu verileri xml olarak vereceğinden ilk örnek için biraz karışık olabilir. Json olarak verileri alabileceğimiz bir kaynak var. http://jsonrates.com/ adresinden istediğim para birimleri arasındaki dönüşümleri json olarak almamız mümkün.

İlk olarak mobile services içerisinde ismi CurrencyRates olan bir tablo yaratıyoruz. (Nasıl tablo yaratacağınızı buradan öğrenebilirsiniz.)

Daha sonra jsonrates.com sitesinden bir hesap oluşturmanız gerekiyor. Size bir api key verecek ve bunu requestlerimizde kullanacağız.

Şimdi sırada Scheduler var, Mobile Service içierinden Scheduler tabına giriyoruz ve "Create a Scheduled Job" yazısına tıklıyoruz. CurrencyInsertJob adında bir scheduler job yaratıyoruz.

CurrencytInsertJob

Yukarıda gördüğünüz gibi job'I yaratırken bize ne sıklıkta çalışacağını soruyor. Default olarak her 15 dakikada bir çalışmak üzere ayarlı. Bu şekilde sağ altta bulunan butona basarak job'u oluşturuyoruz.

Ben her 15dk'da bir kez çalışmasını istedim, ama siz bunu değiştirebilirsiniz veya On Demand seçeneğini seçerek istediğiniz zaman çalışmasını sağlayabilirsiniz.

*Mobile Service free mode seçili ise sadece bir tane job oluşturmanız mümkün. Daha fazla job oluşturmak isterseniz mobile service'i scale etmeniz gerekecek, ilerleyen yazılarda buna değineceğim.

Yarattığımız job'un içine giriyoruz ve Script tabına tıklıyoruz, açılan sayfada bir code editor bizi bekliyor. Aşağıdaki kodu yazarak jsonrates.com'dan TRY ve USD arasındaki dönüşümü çekip tabloya yazmanız mümkün, unutmatın bu kod her 15dk'da bir kez çalışacak.(Kendi API key'inizi yazmayı unutmayın.)

Yukarıdaki kod ile birlikte istediğimizi yaptırdık ancak job şuanda disabled. Sayfanın en altında bulunan butonlar ile enable etmeniz mümkün veya Run Once'a tıklayarak hemen bir kez çalıştırmanız mümkün.

İlk başta 15dk'da bir çalışssın istemiştik ancak bu yazıyı yazarken 15 dk beklemek istemediğim için ben bunu bir dakikada bir kez çalışsın olarak değiştirmek istiyorum. Bunun için yukarıdaki Configure tabına geçiyoruz ve buradan ayarları değiştiriyoruz.

CurrencyInsertJob Configure

Sonuc olarak Data tabi altında bulunan CurrencyRates tablosuna baktığımızda işlemin sonucunu göreceğiz.  

   

CurrencyRates Sonuc

Kendi senaryonuza uygularken aşağıdaki link sizin için oldukça faydalı olacaktır. Mobile Services JavaScript backend Node.js ile kodlanıyor ve aşağıdaki dokumandan mobile services'e özel node.js kütüphanelerine ulaşmanız mümkün.

https://msdn.microsoft.com/en-us/library/azure/jj554226.aspx

Mobile Services JS Backend - Custom Api

Mobile Service kullanırken Custom Api bazı durumlarda hayat kurtarıcı nitelikte olabiliyor. Eğerki bir mobil uygulama geliştiriyorsanız ve bazı kodların Azure'da çalışmasını istiyorsanız mobile services api sizin için en basit çözümlerden biri. Daha önce Mobile Services Data konusundan bahsetmiştik şimdi ise cloud üzerinde yazdığımız kodun çalışmasından bahsedeceğiz.

   

JS Backend kullandığımız için azure tarafında çalışmasını istediğimiz kodları Javascript(node.js) ile yazacağız. Aslında yazdığımız şey bir RESTful service. Bir custom api içerisinde PUT, GET, POST, PATCH, DELETE Http verb'lerine özel kod yazmamız mümkün örneğin bir custom api yazdınız ve bu api'a http üzerinden POST request geldiğinde post methodu çalışır, get request geldiğinde ise get methodu çalışır. ASP.NET Web Api veya MVC ile ilgilenmiş olanlar bu konuyu daha rahat anlayacaktır. Gelen requestler uygun methodlari çalıştırdıktan sonra client'a bir HttpResponse döndürürler bu response içerisinde Http Status Code bulunur. Bu kodlardan çok kullanılanlara örnek vermek gerekirse 404 (NotFound), 200(OK), 201(Created) vb.

   

Nasıl Oluşturulur?

   

Management Portal üzerinden daha önceden oluşturduğumuz Mobile Service'in içine giriyoruz ve yukarıdaki API tabına tıklıyoruz. Aşağıdaki ekranda "Create A Custom API" buttonuna basıyoruz veya en altta bulunan + buttonuna basıyoruz. Açılan pencerede isim veriyoruz ve her HTTP Method için yetki ayarlaması yapıyoruz. Şuanda örnek için isim olarak HelloWorlApi yazıyorum ve yetki ayarlarını olduğu gibi bırakıyorum.

   

Create Custom API

   

API oluşturulduktan sonra, üstüne tıklayarak içine giriyoruz ve SCRIPT tabı altında otomatik olarak oluşturulmuş kodları göreceksiniz.

   

Sample Code of HelloWorldAPI

   

Bu örnekte gördüğünüz gibi get ve post request'leri için ayrı iki function bulunmakta. GET requesti içinde cevap olarak message:"Hello World" döndürülüyor ve HTTP Status Code olarak OK yani 200 kullanılıyor. Client'tan bu API'I çağırdığımızda HttpStatusCode olarak 200(OK) gelecek ve content olarak message:"Hello World" gelecek. Geri dönen content JSON olarak client'a ulaşacaktır.

   

Client Tarafına gidelim ve bu API nasıl çağırılır onu inceleyelim.

   

Client

Mobile Services eğitim serisinin başında yazdığım gibi örneklerimizde client olarak Unviersal App (C# & XAML) kullanacağım. Yeni bir universal app yaratıyorum ve NuGet üzerinden WindowsAzure.MobileServices package'ini Windows Phone ve Windows projelerine indiriyorum. Daha sonra Windows ve Windows Phone projeleri içerisindeki MainPage.xaml ve MainPage.xaml.cs dosyalarını siliyorum. .Shared projesi içerisine MainPage.xaml adında bir dosya ekliyorum.

   

MainPage.xaml içerisine aşağıdaki kodu yazıyoruz.

   

   

Yukarıdaki kod oldukça basit ve UI'a bir tane button koyduk. Bu butona bastığımızda ise Mobile Services ta bulunan HelloWorldApi'in çalışmasını istiyoruz. Bunun için MainPage.xaml.cs dosyasına gidiyoruz ve aşağıdaki kodu yazıyoruz.

   

   

Yukarıdaki kod'a baktığımızda ButtonClick event'inde MobileService.InvoceApiAsync methodunu çalıştırdığımızı görüyoruz. Generic type olarak RootObject adında benim yarattığım class'I kullandım böylece gelen request bu class'a deserialize edilecek. Hatırlarsanız JSON olarak geleceğinden bahsetmiştim ve InvokeAsync<T> methodu bizim için deserialize işlemini gerçekleştiriyor. Böylece bizim JSON ile ilgilenmemize gerek kalmıyor. RootObject class'inin ismi önemli değil sadece içinde property'lerin adı ve türü deserialize işlemi için önemli. Daha sonra bir message dialog aracılığı ile gelen verinin içerisindeki message değerini gösteriyoruz.

   

InvokeAsync methodu üzerinde durmak gerekirse. Bu methodun birden çok overload'u var ancak ben, bence en çok kullanılacak olan overload'tan bahsedeceğim.

   

InvokeApiAsync<T>(String, HttpMethod, IDictionary<String, String>)

Invokes a user-defined custom API of a Windows Azure Mobile Service using the specified HTTP Method. Additional data can be passed using the query string.

   

public Task<T> InvokeApiAsync<T>(
        string apiName,
        HttpMethod method,
        IDictionary<string, string> parameters
)

   

From <https://msdn.microsoft.com/en-us/library/dn268353.aspx>

Yukarıda methodun MSDN'deki tanımını göreceksiniz. Gördüğünüz gibi generic bir method ve 3 parametre alıyor. Bunlar;
 

ApiName: çağırmak istediğimiz API'in adi bizim örneğimizde "HelloWorldApi"

HttpMethod: hangi http verb ile request yapmak istediğimiz (GET, POST, PUT, DELETE, BATCH), bizim örneğimizde GET

Parameters: göndereilecek request'in parametreleri, bizim örneğimizde null.

   

   

2.Örnek

Bu örnekte bir Echo Api yapacağız. Yani clientin gönderdiği parametre yine client'a geri dönecek. Bu örnekte parametre nasıl kullanılır'a değineceğiz.

   

EchoApi adında yeni bir Custom Api yaratıyoruz ve aşağıdaki kodu yazıyoruz. Sadece HttpGet ile çalışacağımız için sadece Get için function yazmamız yeterli olacak.

   

   

Yukarıdaki kodda gördüğünüz gibi request.query.param1 ile param1 ismindeki parametreye ulaşıyoruz.

   

Client'a geçelim ve bir button ve bir textbox daha ekleyelim. Kullanıcının textbox'a girdiği değeri api'a göndereceğiz, api bu değeri message içinde bize geri gönderecek.

   

MainPage.xaml'in son hali aşağıdaki gibi oldu.

   

   

MainPage.xaml.cs'e geçiyoruz ve aşağıdaki kodu ekliyoruz.

   

   

Yukarıdaki kodda gördüğünüz gibi, param adında bir dictionary yaratıyoruz ve içine bir item ekliyoruz bu itemin key'I parametremizin ismi oluyor. Daha sonra InvokeApiAsync'I çağırıyoruz. Sonuc olarak textbox'a girdiğiniz değeri messageDialog'da göreceksiniz.

   

GitHub: https://github.com/altinokdarici/AzureEgitimSerisi/tree/master/MobileServices/JavascriptBackend/CustomApi/CustomApi.Shared