Webservisleri yapıları gereği iletişimlerini xml mesajları üzerinden gerçekleştirmekte, gerek veri yollarken gerek veri alırken bütün bu veri yığınını soap protokolleri dahilinde encode etmektedir.Her ne kadar mutlak bir gereksinim olmasada webservislerin clientlarına sunduğu operasyon tanımlamaları WSDL ile sağlanmaktadır.Biz ise basitçe kullandığımız yazılım alt yapısı ile wsdl tanımlamalarından operasyonları öğreniyor ve tercih ettiğimiz operasyonu başka bir adımda başlatmaya karar veriyoruz. HTTP protokolu üzerinden asenkron olarak gerçekleşen bir webservis operasyonu gönderilen xml paketine benzer cevap paketiyle geri dönmektedir.
Eğer sizde benim gibi pure as3 projeleri geliştiriyorsanız muhtemelen webservislerle veri alışverişinin bazen ne kadar da can sıkıcı olabileceğini görmüşsünüzdür.Ben yukarda tanımladığım süreçleri bir süre welconsidered webservice component yardımıyla sürdürmüştüm.Nitekim welconsidered componenti suya sabuna dokunmadan sizin operasyon parametrelerini sunucuya iletmekte sürecin sonunda ise kocaman bir xml dönütüyle sizi başbaşa bırakmakta.Günün sonunda ise kendinizi namespaceler ile boğuşmaktan canı çıkmış, istediğiniz veriye ulaşmak için ağzıyla kuş tutmuş olarak buluyorsunuz : )
Webserviste tanımlanmış bir methodu tetiklediğinizde size dönen yapılandırılmış xml verisi muhtemelen aşağıdaki örneğe benzer bir şey olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 | ?xml version="1.0" encoding="utf-8"?> <ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://away4m.com/"> <ResponseMessage>İşlem Başarılı.</ResponseMessage> <ResponseCode>0</ResponseCode> <ResponseObject xsi:type="NewsFeedList"> <Data> <NewsFeed Title="NTVMSNBC.com: Hava Yol" Url="http://www.ntvmsnbc.com/id/24927997/device/rss/rss.xml" /> <NewsFeed Title="NTVMSNBC.com: Bilişim Teknolojileri" Url="http://www.ntvmsnbc.com/id/24927541/device/rss/rss.xml" /> </Data> </ResponseObject> </ServiceResponse> |
Flex ile gelen soap yardımıcı sınıfları pure as3 projelerinde ihtiyaç duyulan temel webservis iletişimini fazlasıyla sağlamakta.Bunun için harici developerların geliştirdiği webservise sınıflarını aramamıza gerek kalmamaktadır.
Nitekim flash cs4 kullandığınızda dahi flex framework dizininde bulabileceğiniz “rpc.swc” dosyasını flash ide proje ayarları panelinden çalışmanıza entegre edebiliyorsunuz.Ben as3 projelerimi flashdevelop üzerinden gerçekleştirdiğim için swc dosyalarını istediğim anda projeye ekleyip çıkarmada herhangi bir zorlukla karşılaşmıyorum.
as3 projelerinizde flex altyapısını kullandığınızda bir webservice operasyon çağrısı aşağıdakine benzer yapıda olmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | package { import flash.display.Sprite; import flash.events.Event; import flash.utils.describeType; import hr.binaria.asx3m.Asx3mer; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.soap.LoadEvent; import mx.rpc.soap.Operation; import mx.rpc.soap.WebService; import nl.demonsters.debugger.MonsterDebugger; /** * ... * @author away4m */ public class Main extends Sprite { private var ws:WebService = new WebService(); private var myOperation:Operation; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { trace(this + ".init"); removeEventListener(Event.ADDED_TO_STAGE, init); // entry point ws.addEventListener("load", finishedLoading); ws.loadWSDL("http://www.deeptraining.com/webservices/weather.asmx?WSDL"); } private function finishedLoading(evt:LoadEvent = null):void { trace(this + ".finishedLoading"); myOperation = Operation(ws.getOperation("GetWeather")); myOperation.addEventListener("fault", wsdlFault); myOperation.addEventListener("result", wsdlResult); myOperation.send("California"); } private function wsdlFault(evt:FaultEvent):void { trace(evt.fault); } private function wsdlResult(evt:ResultEvent):void { trace(evt.result); } } } |
Kodda basitçe WebService sınıfı tanımlanıp bu sınıfın hangi operasyonlarını gerçekleştirebileceğini öğrenebilmesi için webservisin operasyon tanımlamalarınınyeraldığı wsdl yolunu sağlamaktayız.Bu örnekte bu http://www.deeptraining.com/webservices/weather.asmx?WSDL.WSDL yüklenemesi gerçekleştikten sonra artık istediğimiz operasyon çağrısını başlatabiliriz.Herhangi bir operasyon çağrısında muhtemel başarı ya da başarısızlık durumunu takip edebileceğimiz iki adet asenkron event handler bulunmaktadır.
Basitçe as3 projelerinde webservis kullanımını tanıtmaya çalıştığım bu yazının devamında başarılı webservis kodlama pratikleri (puremvc proxy’ nin webservis ile kardeşliği ), webservisler ne yer ne yemez durumları ve ayriyeten .NET mimarisinin DTO dediği data transfer objectlerin bizdeki VO value objectlerle nasıl kardeşlik kurabileceği üzerinde duracağım.
