14 Kasım 2012 Çarşamba

Delphi ‘de Web servisleri ve SOAP Uygulamaları


Giriş
Web Servisleri Internet üzerinden yayınlanan ve çağrılabilen bağımsız modüler uygulamalardır. Web servisleri sağlanan hizmetleri açıklamak için iyi tanımlanmış ara yüzler sağlar. Istemci gözatıcılar için Web sayfaları üreten Web sunucusu uygulamalarının aksine, Web Servisleri doğrudan insan etkileşimi için tasarlanmış değildirAksine, bunlara istemci uygulamaları tarafından programlama yoluyla erişilir.

Web servisleri istemci ve sunucu arasında serbest bir bağlantı sağlamak için tasarlanmıştırYanisunucu uygulamalarının istemcileri belirli bir platform ya da bir programlama dili kullanma ihtiyacı duymaz. 
Dilin doğal tarzında, arayüz tanımlamaya ek olarak çoklu iletişim mekanizması da tasarlamaya izin verir.
Web servisleri, SOAP (Basit Nesne Erişim Protokolü) kullanarak çalışmak üzere tasarlanmıştır. SOAP merkezi olmayan, dağıtılmış bir ortamda bilgi değişimi için standart hafif bir protokoldür. Uzak yordam çağrıları kodlamak için XML kullanır ve genellikle bir iletişim protokolü olarak HTTP kullanır. SOAP hakkında daha fazla bilgi için, http://www.w3.org/TR/SOAP/  adresindeki SOAP spesifikasyonuna bakın.

Not: Web servislerini destekleyen bileşenler(componentler) SOAP ve HTTP kullanacak şekilde inşa edilmiş olmalarına rağmen,frameworkun(çerçevenin)diğer kodlama ve iletişim protokollerini kullanacak şekilde genişletilecek kadar yeterince geneldir.
Delphi SOAP tabanlı Web Servis uygulamalarını (sunucu) size inşa etmenize izin vermesi yanında , özel bileşenler ve sihirbazlar size web servisleri için istemciler inşa etmenize ya SOAP ya da  belge birebir stili kullanıarak size izin verir . Belge birebir stili .Net Web Hizmetlerinde kullanılır.
Web servis  uygulamaları arayüzlerde ne bulunduğu bilgisini ve bunları WSDL (Web Service Definition Language-web servisi tanmlama dili) kullanarak nasıl çağırılacağı bilgisini yayınlar.  Sunucu tarafında, uygulamanız bir Web servisinizi tanımlayan bir WSDL dokümanı yayınlayabilir.  İstemci tarafında, bir sihirbaz veya komut satırı yardımcı programı , ihtiyacınız olan bağlantı bilgisini ve ara yüz tanımlarını size sunarak bir yayınlanmış WSDL dökümanı ithal edebilir.  Zaten uygulamak istediğiniz Web sunucusunu  tanımlayan WSDL belgesi varsa WSDL belgesi alırken, siz de sunucu taraflı kodu oluşturabilirsiniz
 ve SOAP istemci ve sunucu taraflı program yazabilirsiniz.
SOAP  Demosunu İnşa Edelim
Bu konuda çok detaya girmeden sunucu ve istemci yazılımını yazmak faydalı olacaktır Biri server uygulaması ve diğeri client tarafı uygulaması olmak üzere iki uygulama hazırlayacağız. Bunun için .groupproj uzantılı grup oluşturup bu dosyada, bu iki exe yi barındırmak dizayn açısından bize kolaylık sağlayacaktır.
Server tarafı
Uzak bağlantıların erişip çalıştıracağı, uzak fonksiyonları server tarafında barındıryoruz. Bunun için Delphi 2009 ve sonrası için direkt File > New > Other > Delphi Projects > Web Services > SOAP Server Application seçilir Şekillerdeki adımlar sıra ile yapılır.






Şekil -4 teki code generation kısmını işaretlerseniz otomatikman örnek yordamlar ve 3 adet delphi uniti oluşuyor.

Bu diyolagtaki seçeneklerin açıklması aşağıda verilmiştir.
Madde
Açıklama
Service name (Servis Adı)
İstemcilere göstermek istediğiniz web servisin çağırılabilir arayüzünün adını girin. Bu ad ara yüz adı olarak kullanılır. Aynı zamanda uygulama sınıfı adını oluşturmak için kullanılır. Bu nedenle, örneğin, MyWebService  yazarsanız wizard MyWebService adlı çağırılabilir arayüz oluşturur ve uygulama sınıfı  TMyWebServiceImpl olarak adlandırılır.
Unit identifier (Birim tanımlayıcı)
 Wizardın oluşturacağı ve uygulama sınıfı ve arayüzü içeren unitin adını girin.
Generate comments (yorumları oluştur)
İsteğe bağlı. Wizard tarafından oluşturulmuş unite kodun ne yaptığını anlatan yorumları ekler. Kullanıcılara kolaylık olsun anlaşılır olsun diye konmuş bu seçenek.
Generate sample methods (Basit yordamlar oluştur.)
İsteğe bağlı. Wizard tarafından oluşturulmuş unite, örnek kod ekler.  Bu kodu kullanabileceğiniz gibi uygulama sınıfı ve çağrılabilir ara yüzün uygulanması ve tanımlanması için bir kılavuz olarak kullanabilirsiniz.
Service activation model (Servis aktivasyonu modeli)
Drop-down listeden istediğiniz aktivasyon modelini seçin.
  • Per Request Seçeneği uygulamanız için aldığı her isteğe(request) karşı cevap vermek için uygumla sınıfınızın yeni örneğini oluşturur. İstek(request)         işlendikten sonra bu örnek istek(request) boşaltılır.
  • Global Object Tüm istekleri(request) işlemek için kullanacağınız uygulama sınıfının bir tek örneğini oluşturur.


Bunlardan WebModuleUnit1.pas uniti SOAP bileşenlerinin bulunduğu unittir.  Web servisi için gereken bir dağıtıcı ve bir çağırıcı (invoker): çığırılabilen (invokable) arabirimleri ve bunları uygulayan sınıflara ek olarak, sunucu iki bileşen gerekir. (Soap.WebBrokerSOAP.THTTPSoapDispatcher) gelen SOAP mesajları alır ve invoker onları aktarır. Invoker (Soap.SOAPHTTPPasInv.THTTPSoapPascalInvoker), SOAP mesaj yorumlaması onu çağıran invokable arabirimi tanımlar, çağrı yürütür ve cevap mesajı toplanır.

Not: THTTPSoapDispatcher ve THTTPSoapPascalInvoker bir SOAP isteği içeren HTTP mesajları yanıtlamak için tasarlanmıştır. Temel mimarisi farklı dispatcher ve invoker bileşenlerinin ikame ederek diğer protokolleri destekler, ve yeterince geneldir.
Sonra HTTP isteği mesajı SOAP eylem başlığında bu arabirimleri tanımlamak iletileri işlemek için otomatik invokable arayüzler ve uygulama sınıfları, dağıtıcı ve çağırıcıya (invoker) kayıt olur.

Web servisleri de bir yayıncı (Soap.WSDLPub.TWSDLHTMLPublish) içerir. Yayıncılar uygulamasında Web sevislerini aramak için açıklayıcı WSDL dokümanları oluşturarak gelen istemci isteklerine yanıt verir. Bu uygulama müşterilerine Web servisi tanımlayan WSDL belgeleri yayımlamayı sağlar. WSDL yayıncı hakkında bilgi için, bir Web servisi uygulaması için WSDL Belgeler oluşturur.


Tüm bunları yaptıktan ve açıkladıktan sonra bu hazır oluşan projeye bir de ADO bağlantısı ekleyelim. Bu WebModuleUnit1.pas unitinde eklediğimiz  ADOConnection1 componenti ile olsun.  Ki databaseden veri okumayı da öğrenmiş olalım. ADOConnection1.ConnectionStringi  webde açılacak databasein adına passwordune göre değiştirilmelidir..


Tüm bunlar sonucunda DemoSoapWebServer.dll oluşacaktır. Bu dll web hosta konacak web server olan dll.dir. 

Burada default olarak  WSDLHTMLPublish1 de http://localhost/ demosoap/ DemoSoapWebServer.dll /wsdl olarak tanımlanmıştır. DemoSoapWebServer.dll programı compile edildikten sonra  C:\inetpub\wwwroot\ demosoap klasörüne yüklenmelidir.Ama siz localhost yerine sitenizde de yayınlyabilirsiniz.

Ayrıca iis.exe çalıştırılıp bu dll in kaydı yapılmalıdır. Bunun için Denetim Masasından Yönetimsel Araçları seçip Internet Information Services (IIS) Yöneticisini çalıştırın. Şekil 5 teki gibi sanal dizin ekleyin.Ve şekil 6 da gösterildiği gibi uygulmaya dönüştürün.


iis de ISAPI ve CGI kısıtlamaları ve  iis de handeler mapping (işleyici eşlemeleri) bölümünden tanım yapılamalıdır. Bunlar aşağıda şekil 7,8-9 gösterilmiştir.





 

Eğer iis 7.0 ve üstü ise demosoap sanal dizinin altındaki web.config aşağıdaki gibi değiştirilmelidir. En azından handlers tagı.

<configuration>
    <system.webServer>
        <directoryBrowse enabled="false" /> 
      <handlers accessPolicy="Read, Write, Execute,Source, Script">
           <add name="IDemoSoapWebServer" path="DemoSoapWebServer.dll" verb="*" modules="IsapiModule" scriptProcessor="C:\inetpub\wwwroot\demosoap\DemoSoapWebServer.dll" resourceType="File" allowPathInfo="true" requireAccess="Execute" />

  </handlers>
    </system.webServer>
</configuration>

Tüm bunlar bittikten sonra internet göz atıcınızı açıp adres çubuğuna
http://localhost/demosoap/DemoSoapWebServer.dll/wsdl/ yazıp enter basın şekil 10 daki görüntü karşınıza çıkacaktır. Ekrandaki butona tıklanıp admin kaydı yapılmalı
Bunların görüntüsü de şekil 10-a-b-c de verilmiştir.





Sonrada IDemoSoapWebservisi yazan tarafı tıklanıp explorerdan save as ile C:\Users\aysen\Documents\IDemoSoapWebServisi.wsdl saklanmalıdır. Eğer netten yayınlanacak servisin olduğu yere Şekil 11 deki gibi kopyalanır. kopyalanır.




Client Tarafı Uygulama Projesinin Oluşturulması

Bu herhangi platformda olabilir. Ama yine Delphi’de gösterdik. Daha sonra bu grupa sağ tıklayıp new Project ile çıkan diyolagtan VCL Forms Application ekleyerek yeni projeyi DemoSoapClient.dpr olarak adlandırarak ekleyim. Sonra Şekil -12 de gösterildiği gibi File > New > Other > Delphi Projects > Web Services >WSDL Importer i seçelim. Sonra şekil 13 te gösterildiği gibi publish ettiğimiz .wsdl uzantılı dosyanın yolunu buradaki yazım kutucuğuna yazalım ve  User Name ve passworde windowsta admin hakkına sahip tanımlı kullanıcının user name ve passwordunu yazalım.  Böylelikle servisin tanımlı olduğu unit otomatikman oluşacaktır.





 Daha sonra ana formumuza tool paletteden bir HTTPRIO componenti ekleyelim. Bunun WSDLLocation özelliğne wsdl dökümanın yolunu yazalım. Şekil 14 de gösterilen HTTPWebNode özelliğin altındaki password ve username windows hesaplarında tanımlı olan
Kullanıcı adı ve passworunu yazıp,port ve service özelliklerinden ilgili port ve servisi seçelim.
Böylelikle web servisini kullanıma açmış oluruz.





İki adet butondan echoDouble uzak makinadaki echoDouble  fonksiyonu çağırır diğeri ise DB den veri okumayı gösteriyor.

procedure TForm2.BitBtn1Click(Sender: TObject);
var
GelenSayi:Double;
begin
GelenSayi := (HTTPRIO1 as IDemoSoapWebServisi).echoDouble(5);
MessageDlg(FloatToStr(GelenSayi),mtWarning,[mbOk],0);
end;

procedure TForm2.BitBtn2Click(Sender: TObject);
var
DBVeriPersonel:TMyEmployee;
begin
//web serverdaki veri tabanından veri okuyor.
DBVeriPersonel:= (HTTPRIO1 as IDemoSoapWebServisi).DBveriOku(1);
MessageDlg(DBVeriPersonel.FirstName+' '+DBVeriPersonel.LastName,mtWarning,[mbOk],0);

end;

 Kodları aşağıdaki linkten çekebilirsiniz.Kodları indir

23 Ekim 2012 Salı

DELPHI’DE DLL DOSYALARIN OLUŞTURULMASI



Windows kullanıpta .dll uzantılı dosyaları  görmeyen yok gibidir. Bu yazımda dll dosyalrın kısaca ne işe yaradığını ve nasıl oluşturulacağını anlatmayı amaçladım. Özellikle .exe ‘leri büyük olan programcılar  ve aynı fonksiyonu defalarca kullanmak zorunda kalan  programcılara  .dll uzantılı dosya oluşturmalarını ve kullanmalarını tavsiye ediyorum.

Açık adı Dynamic-Link Library olan ve uzanatısı .dll olan DLL dosyalar içlerinde pek çok fonksiyonu barındıran bir çeşit kod ve kaynak kütüphanesidir. DLL’ler .EXE dosyalar gibi tek başına çalışmazlar. Bir DLL dosya başka bir .dll uzantılı ya da .exe uzantılı dosyalar tarafından kullanılır. Bir DLL dosyaya ancak içindeki bir fonksiyon veya kaynak  kullanılacaksa başvurulur. Bir windows uygulaması bir DLL dosyadaki fonksiyona, iki yoldan erişilebilir.
Extranal bildirim kelimesi kullanılarak dll’deki  fonksiyon statik olarak ithal edilir. (static import veya impilct loading -dahili yükleme-). Bu durumda DLL, onu kullanan EXE program çalışmaya başlamadan  yüklenir. Bu durumda eğer kullanılan DLL bilgisayarda yoksa veya çalışmazsa, onu kullanan EXE program hiç çalışmaz. DLL’in içindeki bir fonksiyon adı ile, yeni bir ad ile veya indeks ile çağrılabilir. Statik olarak DLL kullanımının avantajı programın çalışma hızının artmasıdır.
2.GetProcAddress and LoadLibrary ve FreeLibrary adlı windows API fonksiyonları kullanılarak dll dosyanın içindeki fonksiyonlar dinamik olarak kullanılabilir.( dynamic import veya explict loading -harici yükleme-) .Bu fonksiyonlar Win. 3.x ve Win95 de var. Dinamik olarak DLL kullanımın avantajı exe dosyanın boyu küçülür ve DLL sadece kullanıldığı zaman hafızada yer kaplar. Bazı çok özel durumlarda ise uygulamaların ortaklaşa kullandığı DLL ‘lerin hafızadan silinmesi veya bazen de silinememesi problemi ortadan kalkar. Diğer bir avantajı ise DLL dosya bilgisayarda yoksa ve çalışmazsa onu kullanan EXE program çalışır. Dezavantajı ise çağırılan DLL fonksiyonunun çalıştırılması esnasında program hızı DLL’in hafızaya yükleniyor olması yüzünden biraz yavaşlamasıdır.

Pek çok dilde DLL geliştirilebilir ama bu yazımda çok popüler olan Delphi’de, DLL dosya oluşturmayı ve daha az bilindiği için dinamik olarak DLL fonksiyonun kullanılmasını anlatamayı tercih ettim.

Delphi’de bir DLL dosya hazırlamak ve kullanmak diğer dillere nazaran oldukça kolay. Delphi’ de tek formlu bir exe dosya oluştururken project source LISTE 1 deki gibidir ve Delphi tarafından bu  project source otomatikman hazırlanır. Delphi’nin View menu seçeneğinden Project Source seçeneğini seçerseniz, project source’un yazım penceresi açılır. Bu project source üzerinde yapılacak ufak tefek değişikliklerden sonra .dll uzantılı bir dosya elde edilebilir.



***************** LİSTE 1******************************
program Projet1;

uses Forms,
     unit1 in 'UNIT1.PAS' {Form1};

{$R *.RES}
begin
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
*******************************************************************
Eğer project source üzerinde aşağıdaki değişikler yapılacak olursa derleme sonucunda elde edilecek dosya, .dll uzantılı bir dosya olacaktır (yani project1.dll).
:
****************LİSTE 2*******************************
library Project1;        {1. program yerine library kelimesi yazılır }


uses   { 2.Forms sözcüğü kaldırılır. }
     unit1 in 'UNIT1.PAS' {Form1};

exports
  kullanim;    
       {3. exports sözcüğü eklenir. Kullanıma hazır olan  fonksiyonunun isimi verilir. }

{$R *.RES}

begin  { 4. ana bloktaki kodlar kaldırılır. }
end.
*********************************************
Şimdi bir dll dosya oluşturma ve bu dll dosyadaki fonksiyonun kullanımına ilişkin örneği inceleyelim.

LISTE 3’Te  te bir fonksiyonu olan sifre.dll dosyanın project source verilmiştir.

********************LİSTE 3 - SIFRE.DPR************************
library Sifre;
uses
  Dllsifre in 'DLLSIFRE.PAS' {KontrolForm};
exports
SifreDogruMu; {kulanılacak olan fonksiyon}
{$R *.RES}
begin
end.
********************************************

SIFRE.DPR içinde bildirilen olan SifreDogruMu fonksiyonu, SIFRE.DLL’i çağıracak uygulama tarından kullanılacağından  export bilidirimli  olarak DLLSIFRE.PAS dosyasında tanımlıdır. SifreDogruMu fonksiyonu SifreyiAl parametresiyle gelen şifreyi alır ve doğru şifre olan ‘BYTE’ kelimesi ile karşılaştırır. Eğer SifreyiAl parametresi ile gelen kelime ‘BYTE’ ise formu açar ve geri dönüş değeri olarak ‘True’ değerini yollar, değilse ‘Yalnış Şifre’ mesajını verir ve geri dönüş değeri olarak ‘False’ değerini yollar. DLLSIFRE.PAS Liste 4 ‘te verilmiştir.


ŞEKIL 1 dllsifre.pas’ın formu


******************** LISTE 4 DLLSIFRE.PAS*****************************
unit Dllsifre;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, Buttons;

type
  TKontrolForm = class(TForm)
    BitBtn1: TBitBtn;
    Label1: TLabel;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
  SIFRE:String;
    { Public declarations }
  end;

var
  KontrolForm: TKontrolForm;
  function SifreDogruMu(SifreyiAl:String) :Boolean;export;

implementation

{$R *.DFM}

procedure TKontrolForm.BitBtn1Click(Sender: TObject);
begin
Close;
end;

function SifreDogruMu(SifreyiAl:String) :Boolean;
begin
Result::=False;
KontrolForm:=TKontrolForm.Create(Application);

 try
  if (SifreyiAl='BYTE') then
    begin
      KontrolForm.ShowModal;
      Result::=True;
    end
    else MessageDlg('Yalnış Şifre',mtWarning,[mbOk],0);
   finally
   KontrolForm.Free;
 end;
end;

end.
*********************** **************************************

SIFRE.DLL’i çağıran DLLCAGIR.EXE’nin project source LİSTE 5’te verilmiştir.


ŞEKIL 2 -dllcagir.exe ‘nin penceresi

***********LISTE 5 -DLLCAGIR.DPR-***************************
program Dllcagir;

uses
  Forms,
  Cagir in 'CAGIR.PAS' {Form1};

{$R *.RES}

begin
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
**********************************************
Liste 6 ‘de sifre.dll ‘in içindeki SifreDogruMu fonkksiyonunu çağıran cagir.pas’ın kodu verilmiştir.
*******************LISTE 6 CAGIR.PAS********************
unit Cagir;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ButtonSifre: TButton;
    ButtonKapat: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure ButtonKapatClick(Sender: TObject);
    procedure ButtonSifreClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ButtonKapatClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.ButtonSifreClick(Sender: TObject);
var
tutacak:THandle;
SifreSonuc: function (SifreyiAl:String) :Boolean;
begin
  try
  tutacak:=LoadLibrary('SIFRE.DLL');{sifre.dll harici olarak yükleniyor}
  @SifreSonuc:= GetProcAddress(tutacak,'SifreDogruMu');
     {SifreDogruMu Fonksiyonunun adresi işaretçiye veriliyor}
  SifreSonuc(Edit1.Text);
     {SifreDogruMu fonksiyonu SifreSonuc işaretçisi tarfından çağırılıyor}
  finally
  FreeLibrary(tutacak); {sifre.dll hafızadan siliniyor}
  end;
end;

end.


19 Eylül 2012 Çarşamba

Delphi DataSnap ve Uygulamaları

Delphi  DataSnap ve Uygulamaları
Her işletim sisteminde çalışan client programları yazmak istiyorum diyorsanız tam yerine geldiniz. Delphi’de DataSnap  bunun için hazırlanmıştır.  DataSnap İnternet yada İntranet üzerinden kullanılabilen platformdan bağımsız olarak serverdan fonksiyonları çağırabilen  uygulamalar olarak nitelendirilebilir. Kısacası datana nerede istersen, nasıl istersen öyle ulaşmanın yolu DataSnap teknolojisidir. Bunu ilgili bir örneği kodları ile birlikte vermek istiyorum. Kodları makalenin sonunda indirebilirsiniz.
DataSnap Tarihçesi
DataSnap teknolojisi ilk olarak Delphi 3 ile Midas teknolojisinin içinde gelmiştir. Delphi 4 te Midas II ve Delphi 5 te Midas III içinde olmuştur. COM tabanlı TCP/IP ve http (D) COM kapasiteli bağlantı ile uzak data bağlantısı kurmanın güçlü bir yolu idi. Delphi 6 da DataSnap ismiyle sunuldu ve Delphi 2007 bu yapı daha da sağlamlaştırıldı.
Delphi 2009 da yeniden DataSnap mimarisi tanıtıldı. Uzak bağlantı sunucu nesneleri ve client bağlantı üretmenin daha kolay yolu sunularak, başlangıçta sadece TCP/IP bağlantısı ile bir de Delphi Prism 2009 kullanarak .NET clientları inşa etme yeteneği ile COM bağımlılığı kaldırıldı.
Delphi 2010 DataSnap 2009 mimarisi üzerine kurulmuştur ve bu yapı yeni işlevseliklerle genişletilmiştir. İki wizard kullanarak yeni hedefleri desteklemeyi kapsayarak (VCL formları, Windows servisleri ISAPI, CGI ve web App Debugger gibi konsol uygulamaları).Daha sonraki sürümlerde (Delphi XE2) 64 bit mimariye geçen Delphi, DataSnap wizardlarını geliştirerek mobil ve masaüstü çözümleri entegre bir biçimde çalışmasını daha da kolaylaştırdı.
DataSnap Kullanmanın Avantajları

Bu çok katmanlı(multi-tier) teknolojide birkaç ana makina (server) kullanılabilir. Örneğin bir server veritabanını saklamak için diğer server uygulama dosyasını yani .exe uzantılı dosyayı çalıştırmak için kullanılabilir. Cilentlarda ayrı akıllı-akılsız terminallar, mobil cihazlar , bilgisayarlar vs. olabilir. Çok katmanlı teknoloji ile pek çok farklı cihazın bir ya da birkaç anamakinadan kontrolu sağlanbilir. Böylelikle maliyetlerden ve zamandan tasarruf edilir.

Delphi uzun zamandır çok katmanlı veri tabanı uygulamaları için gerekli teknolojiyi barındırıyordu. Önceleri MIDAS ve daha sonraları DataSnap olarak bilinen Delphi’nin çok katmanlı tekonolojisi , uzaktan bağlantı soketleri ve http ile sağlansa bile DCOM yerine, COM üzerine kuruludur . Bazen CORBA teknolojisini bile destekler.  Az biraz değişmiş versiyonu SOAP bağlantısı olarak sunulur.
Delphi 2009 ve sonrası halen klasik DataSnap teknolojisini  içermekle beraber yeni  uzaktan ve çok katmanlı teknoloji içeren yeni bir markayı da içermektedir. Kısmi olarak dbExpress mimarisi üzerine kuruludur. Bu yeni teknoloji halen DataSnap olarak adlandırılmaktadır fakat karışıklıklardan kaçınmak adına genelde “DataSnap 2009” “DataSnap 2010” “DataSnap  XE2” “DataSnap  XE3”vs olarak adlandırılmaktadır. DataSnap uygulmaları mutlaka bir anamakine (server) uygulaması olmak üzere, ihtiyaca göre DataSnap desktop client bağlantısı, DataSnap web client bağlantısı ve/veya DataSnap mobile client bağlantısı(Android, Apple iOS,BlackBerry, Windows Phone 7 vs.) olabilir.

İlk DataSnap Demosunu İnşa Edelim
Bu konuda çok detaya girmeden basit üç katmanlı demoya başlamak faydalı olacaktır.  Biri server uygulaması ve diğeri client tarafı uygulaması olmak üzere iki uygulama hazırlayacağız. Bunun için .groupproj uzantılı grup oluşturup bu dosyada, bu iki exe yi barındırmak dizayn açısından bize kolaylık sağlayacaktır.
Server tarafı
Uzak bağlantıların erişip çalıştıracağı, uzak fonksiyonları DSServerModule de barındıryoruz. Bunun için Delphi 2009 ve öncesi için menüden  File->New->VCL Form Application Delphi seçip (yani standart vcl projesi) yeni proje açalım. Sonra buna yine menüden  File->New->Other->ServerModule eklenmeli ve bir Datamodule eklenmeli.  Delphi 2010 ve sonrası için direkt File->New->Other->Datasnap server(ilk simge) seçilebilir. Böylelikle DataSnap wizardı yardımı ile proje açılmış olur. Delphi 2010 daki wizardı çalıştırırsak şekil 1 deki görüntüyü elde ederiz.




Şekil-1
Ok tuşuna basıldıktan sonra karşımıza Şekil-2 deki pencere çıkacaktır. Bu pencereden hangi seçeneği seçerseniz seçin TDSServer komponentini içeren ServerContainerUnit adlı bir Delphi uniti oluşacaktır. Diğer tüm ek komponentler TDSServer a bağlıdır. Bu komponent server özelliğine sahiptir. Eğer protokol TCP/IP seçilirse Server TDCTCPServerTransport komponenti içerecektir. Eğer iletişim protokolu olarak http seçilirse server TDSHTTPService komponenti içerecektir.

Şekil-2
Bu penceredekilerin anlamaları aşağıdaki tabloda DataSnap Server wizardının seçeneklerini göstermektedir.
Madde
Açıklaması
VCL Forms Application
Bu seçenek işaretlenirse Server yazılımı VCL Forms uygulaması olacaktır.
Console Application
Bu seçenek işaretlenirse Server yazılımı Konsol uygulaması olacaktır.
Service Application
Bu seçenek işaretlenirse Server yazılımı Servis uygulaması olacaktır.
TCP/IP
Haberleşme protokolü, genellikle  TCP/IP olarak bilinen Internet Protokol suiti
HTTP
 Hypertext Transfer Protocol olarak bilinen haberleşme protokolü . HTTP protokolü seçildiğinde Authentication seçeneği aktif hale gelir.
Authentication
Eğer bu seçeneği işaretlerseniz TDSHTTPServiceAuthenticationManager komponenti Serverın olduğu formda yer alır.  TDSHTTPService komponenti TDSHTTPServiceAuthenticationManager i   DataSnap Server için http kullanıcı doğrulama yürütmesine  izin veren  doğrulama yöneticisi olarak  kullanır. Yürütme HTTPAuthenticate olayını yürütmeyi içerir.  When Authentication seçeneği seçildiğinde, clientlarDataSnap kullanıcı adı ve şifresini SQL bağlantı özelliği olarak sağlamaya ihtiyaç duyarlar.
Add Server Methods Class
Server formuna TDSServerClass komponenti eklemek için ve client uygulamalarına server methodlarını göstercek Serverda klas tanımlamasına izin verilmesi için  bu seçeneği işaretleyin.
Ancestor
Bu seçenek Server klasınız için ankestör belirlemeye izin verir. TDSServerModule  Client uygulamalarına serverdan data setleri göstermek için seçiniz. Görsel olmayan komponentleri Server klasınızda kullanmak isterseniz TDataModule ü seçiniz. Sever klasınızı tamamen yürürlüğe geçirmek isterseniz TComponent i seçiniz.
Include sample methods
Eğer bu seçeneği seçerseniz. ServerMethodsUnit, basit bir method olan ve  verilen değeri geri dönen echoString adlı methodu içerir.

Bu wizardın sonucunda üç unit oluşur.
ServerContainerUnit1.pas
DataSnap Server uygulamasının dış dünya açılmasını sağlayan bu form DataSnap serverların olmazsa olmazı üç komponenti içeriyor. TDSServer komponenti uygulamaya Server özelliği verir.
TDSServerClass  komponenti Dinamik method müracatını kullanan uzak client uygulamadan çağırılabilen yayınlanan metodları olan server–taraflı sınıfları belirlemek için kullanılır.
TDSTCPServerTransport   TDSServer için soket-bazlı bilgi iletim  komponentidir.
ServerMethodsUnit1.pas
Bu form uzak bağlantıların çağıracağı fonksiyonların tanımlandığı formdur. Eğer uzak bağlantıya dataset türü geri dönüş değeri olan fonksiyonlar yollanmak gerekiyorsa  bu form TDSServerModule sınıfından seçilir . Delphi 2010 dan sonraki sürümlerde wizardla oluşturan formda “function EchoString(Value: string): string;”  adlı  fonksiyon varsayılan olarak hazır olarak gelmektedir. Bu fonksiyon gelen değeri geri döndürme özelliğine sahiptir. Biz  de deneme maksatlı olarak uygulamamıza “function MerhabaEchoString(Value: string): string;” fonksiyonunu ekleyelim. Bu eklediğimiz fonksiyon yollanan değere merhaba diyerek geri dönüş değerini geri yollar.
function TServerMethods1.MerhabaEchoString(Value: string): string;
begin
  Result :='Merhaba '+ Value;
end;  
AnaFsrv.pas
Bu unit anaformumuz oluyor. Server tarafında program açık iken gözükecek form.Şimdi F9 ile programı derleyelip çalıştıralım ki exe si oluşsun. Server.exe oluştuktan sonra bunu üzerine tıklayıp çalıştıralım.
Bu yeni DataSnap server mimarisi artık COM üzerine kurulu olmadığı için Data Snap server uygulaması 7x24 mantığı ile devamlı server üzerinde çalışacak şekilde açık kalmalıdır.
Bu client tarafını tasarlarken uzak fonksiyonların gözükmesi için gerekli.
Client Tarafı Uygulama Projesinin Oluşturulması
Daha sonra bu grupa sağ tıklayıp new Project ile çıkan diyolagtan VCL Forms Application ekleyerek yeni projeyi Client.dpr olarak adlandırarak ekleyim..Ve bu uygulamanın ana formuna TSQLconnection ekleyelim. F11 basarak Object Inspectörü açalım TSQLconnection komponentinin Driver özelliğinden “datasnap”ı seçelim. Sonra TSQLconnection komponentinin üzerine tıklayıp farenin sağ tuşuna basalım. Ve çıkan menüden (Şekil-3)“Generate DataSnap client Param” kısmını tıklayıp server fonksiyonlarını ve classlarını tanıtan unitin oluşmasını sağlayıp ve bunu UClass.pas olarak saklayalım ve projeye dahil edelim.



Şekil-3

TSqlServerMethod adlı komponentini “Tool palette”teki dbexpress  sekmesinde den alıp forma ekleyelim. TSqlServerMethod uzak fonksiyonları çağırmak için kullanılan bir komponent ve buna çalıtıracağı ServerMethodMerhaba adını verdik.  Object İnspectorden SQLConnection özelliğine formda “ServerConnection” adı ile tanıtılan komponenti yazdık ve ServerMethodName özelliğini oka basarak (Şekil-4)  (server.exe çalışıyor olmasına da dikkat ederek) TServerMethods1.MerhabaEchoString seçtik.



Şekil-4
Formdaki butonun onclick eventinede
procedure TForm3.Button3Click(Sender: TObject);
var
NeGeldi:String;
begin
 ServerMethodMerhaba.CommandText :='TServerMethods1.MerhabaEchoString';
 ServerMethodMerhaba.Params[0].AsString:=Edit2.Text;//fonksiyona Edit.text değeri yolla
 ServerMethodMerhaba.ExecuteMethod ;//uzak fonksiyonun serverda çalışmasına sağla
NeGeldi:= ServerMethodMerhaba.Params[1].AsString;//fonksiyonun geri dönüş değeri
 Edit2.Text:=NeGeldi;
ServerMethodMerhaba.Close; //fonksiyonun çalışmasını bitir
end;

Artık client uzak fonksiyonu çalıştıracak duruma geldi. F9 ile programı çalıştırp exe yi oluşturalım. Proje tamamdır.

Data Snap Demosunu Buradan İndirebilirsiniz.


Bir sonraki yazıda buluşmak üzere hayır dualarınızı bekliyorum.

ALLAH GÜZEL İSİMLERİ(ESMAÜL HÜSNA) VE KAİNAT VE KORONA VİRÜSÜNÜN HAYIRLI TARAFLARI

Kuranı kerimde Bakara 180 de"En güzel isimler Allah’ındır; bu güzel isimlerle O’na dua edin, O’nun isimleri hakkında doğru inançtan sap...