Müdavim Girişi

E-Posta
Parola

Ücretsiz Kayıt Ol


Online Müdavimler (0 Kişi)
  • Online Kişi Bulunmadı

Yazar Hakkında
x
İsmail Kocacan
İsmail Kocacan is experienced on many development platforms and continues to learn technologies. Since the age of 16-17, dealing with software technologies. And continuous learning, teaching, research, continues to develop.
Delphi ile Xml Web Servislerinin Kullanımı

Bu Makalede sizlere Delphi ile Xml web Servislerinin Kullanimi hakkinda bilgiler vericem.Daha önce XML web servisleri hakkinda bir ders videosu hazirlamistim.Burada ise Delphi ile nasil Kullanilir onu anlaticam.Ama Öncelikle Xml Web Servisleri nedir ,ne ise yarar ,nasil çalisir yenilirmi,içilir mi gibi sorulari bildigim kadariyla cevaplamaya çalisayim.

 
Xml Web Servisleri yani, Xml Web servis methodlari sunucuda çalisan methodlardir.Ve bu methodlar genelde Fonksiyondur.Bildiginiz gibi method Kavrami iki kavramida içinde barindirir.Bu iki kavramda Fonksiyon ve Procedure’dürdür.Procedure’ler kodlari sadece islerler.Fonksiyonlar ise procedure’ler gibi kodlari isler ve kodlari islettikten sonra ise isletilen koda göre geriye deger döndürler.
 
Iste Xml Web Servislerindeki methodlarda bazi islemleri yaparlar ve yaptiklari islemlerin sonuçlarini yani degerleri geriye XmL yapida döndürler.Yine ayni sekilde XML web servislerindeki methodlarin çalistirilabilmesi degerler XML yapida gönderilir.
 
Yani biz XML web servislerindeki methodlari çalistirmak istedigimizde (istek yaptigimizda Request) XML web servis methodlarina isteklerimiz XML yapida gider.XML web servislerindeki methodlarda bu XML yapidaki istegi alir yorumlar ve XML yapida istege cevap manasinda geriye gönderir(Response).Iste XML web servisleri bu döngü içersinde hayatina devam eder.
 
XML web servisleri .net dilleri ile yazilirlar.C#.net ,visual basic.net,delphi.net gibi.
Simdi biz C# ile XML web servis methodlarini yazicaz ve delphi 7 ile bu methodlari kullanicaz.
Simdi File->New Project komutu ile Projemizi olusturulalim.

OK komutuna tikladigimizda asagidaki gibi Servis1.asmx isminde dosya olusturulacaktir.Ve içerigide varsayilan olarak asagidaki gibi olacaktir.Asagida Gördügünüz gibi HelloWorld() isminde geriye HelloWord olarak string tipte veri döndüren bir method var.Ve bu methodun diger methodlardan farki basinda [WebMethod] ifadesinin olmasidir.Adindan da anlasilacagi üzere bu method web’de çalisacak.

[Service1.asmx]
using System;
using System.Web;
using System.Web.Services;
namespace delphi7xmlOrnek
{
    ///<summary>
    /// Summary description for Service1
    ///</summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
 
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}
Yukaridaki Service1 sinifinin içersine web methodlarimizi yazabiliriz.Simdi içersine web methodlar yazalim.
[Service1.asmx]
using System;
using System.Web;
using System.Web.Services;
namespace delphi7xmlOrnek
{
    ///<summary>
    /// Summary description for Service1
    ///</summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
 
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
 
        [WebMethod]
        public string dosyaUzantisiBul(string dosyaAdi)
        {
            System.IO.FileInfo dosyaBilgisi = new System.IO.FileInfo(dosyaAdi);
            return dosyaBilgisi.Extension; // uzantiyi geriye döndür
        }
 
        [WebMethod]
        public string Terstenyaz(string yazdirilacakMetin)
        {
            string tershali="";
            for (int i = yazdirilacakMetin.Length-1; i > -1; i--)
            {
                /*son karakterden basla birer birer al */
                tershali += yazdirilacakMetin.Substring(i, 1);
            }
            return tershali;
        }
       
    }
}
Simdi Solution Explorer Penceresinde Service1.asmx dosyasina Sag tiklayip View in Browser komutu ile sayfayi test edelim.


Gördügünüz gibi methodlar geldi.Simdi Terstenyaz linkine tiklayalim.Ve fonksiyonu test edelim.


yazdirilacakMetin degerini girdikten sonra Invoke komutuna tiklayalim.Invoke komutuna tiklamakla XML web servis methodu olan TerstenYaz methoduna istek yapmis oluyoruz.Oda bize asagidaki gibi cevabini döndürüyor.Gördügünüz gibi ismailkocacan degerini gönderdik oda bize asagidaki gibi tersini çevirip geriye XML yapida gönderdi.


Digerlerinide ayni sekilde test edebilirsiniz.Simdi bu XML webservis methodlarini Delphi 7 ile nasil kullanicaz.Onu inceleyelim.Öncelikle Asagidaki gibi nesneleri form üzerine yerlestirin.

Daha Sonra ise File -> New Other menüsünden asagidaki pencereye ulasin.Burada asagida gördügünüz gibi WSDL importer nesnesini seçtikten sonra OK komutuna tiklayin.


Biz burda WSDL importter seçenegi ile XML web servis methodlarini projemizin anlayacagi sekilde dahil edip ordan kullanicaz.


XML web servis methodlarini projemize dahil edebilmemiz için yukaridaki gördügünüz Service Description Linkine tiklayarak Servis methodlarinin XML yapidaki açiklamasini görebilirsiniz.


Daha sonra tarayicinin adres çubugundaki adresi alip asagida WSDL source yazan yere yapistiriyoruz.


Daha sonra Next ile devam ediyoruz.Gördügünüz gibi methodlar projemize dahil edildi.


Finish komutu ile sonlandirdiktan sonra bize asagidaki gibi Servis1 isminde bir Unit dosyasi olusturuyor.yani Servis1.pas Object pascal Kod dosyasi.Ve Unit dosyasinin adi XML web servisteki Sinifin adi olarak karsimiza geliyor.


[Servis1.pas]

// ***********************************************************************

// The types declared in this file were generated from data read from the

// WSDL File described below:

// WSDL     : http://localhost:2210/Service1.asmx?WSDL

// Encoding : utf-8

// Version  : 1.0

// (18.10.2009 00:03:32 - 1.33.2.5)

// ************************************************************************//

unit Service1;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

 

  //*********************************************************************   

  // The following types, referred to in the WSDL document are not being represented

  // in this file. They are either aliases[@] of other types represented or were referred

  // to but never[!] declared in the document. The types from the latter category

  // typically map to predefined/known XML or Borland types; however, they could also

  // indicate incorrect WSDL documents that failed to declare or import a schema type.

  // *********************************************************************   

  // !:string          - "http://www.w3.org/2001/XMLSchema"

 

 

 

  // ******************************************************************** 

  // Namespace : http://tempuri.org/

  // soapAction: http://tempuri.org/%operationName%

  // transport : http://schemas.xmlsoap.org/soap/http

  // binding   : Service1Soap

  // service   : Service1

  // port      : Service1Soap

  // URL       : http://localhost:2210/Service1.asmx

  // *********************************************************************

  Service1Soap = interface(IInvokable)

  ['{CFE467D4-A39E-2BD2-5836-7685A9E27F8D}']

function HelloWorld: WideString; stdcall;

function dosyaUzantisiBul(const dosyaAdi: WideString):WideString; stdcall;

function Terstenyaz(const yazdirilacakMetin: WideString):WideString; stdcall;

end;

 

function GetService1Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Service1Soap;

 

implementation

function GetService1Soap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Service1Soap;

const

  defWSDL = 'http://localhost:2210/Service1.asmx?WSDL';

  defURL  = 'http://localhost:2210/Service1.asmx';

  defSvc  = 'Service1';

  defPrt  = 'Service1Soap';

var

  RIO: THTTPRIO;

begin

  Result := nil;

  if (Addr = '') then

  begin

    if UseWSDL then

      Addr := defWSDL

    else

      Addr := defURL;

  end;

  if HTTPRIO = nil then

    RIO := THTTPRIO.Create(nil)

  else

    RIO := HTTPRIO;

  try

    Result := (RIO as Service1Soap);

    if UseWSDL then

    begin

      RIO.WSDLLocation := Addr;

      RIO.Service := defSvc;

      RIO.Port := defPrt;

    end else

      RIO.URL := Addr;

  finally

    if (Result = nil) and (HTTPRIO = nil) then

      RIO.Free;

  end;

end;

initialization

  InvRegistry.RegisterInterface(TypeInfo(Service1Soap), 'http://tempuri.org/', 'utf-8');

  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Service1Soap), 'http://tempuri.org/%operationName%');

end.

 

Yukarida Servis1.pas dosyasinda içerigine baktigimizda Servisteki methodlar asagidaki gibi karsimiza gelmektedir.

function HelloWorld: WideString; stdcall;

function dosyaUzantisiBul(const dosyaAdi: WideString):WideString; stdcall;

function Terstenyaz(const yazdirilacakMetin: WideString):WideString; stdcall;

Bu methodlarin C#.net dilinde karsiligi ise asagidaki gibiydi.

public string HelloWorld()
public string dosyaUzantisiBul(string dosyaAdi)
public string Terstenyaz(string yazdirilacakMetin)

Yukaridaki methodlari inceledigimizde bir Dönüsüm söz konusu.Yukaridaki methodardan yola çikarak örnek verecek olursak;Yukardaki methodlarin hepsi geriye string tipte veri gönderiyor.Tabi diger tiplerde olabilir.Mesela int,double vs

C#.net Dili

Delphi Dili

String

WideString

Yukaridaki tabloda gördügünüz gibi delphiden XML web servis methodlarini projemize dahil ettigimizde Servisteki methodlarin delphi karsiliklari bulup çevirdi.

 

Ancak su programlama denilen sey sürekli gelistigi için ve Hele Nesne yönelimli programlama dillerinde gelisim daha hizli oldugu için sürekli ata siniflardan ,yeni mirasçi siniflar nesneler türedigi için delphi 7 bu tipleri tam anlamiyla çeviremiyor.Mesela söyle bir XML web servis methodu düsünün ; XML web servis methodu herhangi bir veriTabanina baglanip herhangi bir Tablodan verileri Dataset Veya DataTable nesnelerine okuyup geriye bu verileri döndürüyor.Tabi geriye dönüs tipi olarak da yine Dataset  dönüyor.Biz bu servisteki methodlari delphi 7 ye dahil ettigimizde karsimiza çok farkli bir tip geliyor.Bu tip TRemoTable seklinde bir class Geliyor.Bu Sinifi inceledigimizde En ata sinif olan Tobject sinifindan türedigini görüyoruz


Belki delphinin üst sürümlerine bu eksikler giderilmistir.Ve aslinda önemli de bir konudur.
 
Neyse simdi bu methodlari delphiden kullanalim.Öncelikle Formumuza bir tane Web Services sekmesinden THTTPRIO nesnesi ve 2 Tane TMemo ve 2 Tane TProgressBar nesnesi yerlestiriyoruz.Son hali asagidaki gibi olmalidir.

[XMLWebOrnek.pas]
unit XMLWebOrnek;
 
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,Service1, InvokeRegistry, Rio, SOAPHTTPClient, ComCtrls,
 AppEvnts;
 
type
 TanaForm = class(TForm)
    Label1: TLabel;
    editdosyaAdi: TEdit;
    Label2: TLabel;
    editMetin: TEdit;
    btnUzantiBul: TButton;
    btnTerstenYaz: TButton;
    HTTPRIO1: THTTPRIO;
    istekMemo: TMemo;
    cevapMemo: TMemo;
    ProgressBarGonderilen: TProgressBar;
    Label3: TLabel;
    Label4: TLabel;
    ProgressBarOkunan: TProgressBar;
    procedure btnUzantiBulClick(Sender: TObject);
    procedure HTTPRIO1BeforeExecute(const MethodName: String;
      var SOAPRequest: WideString);
    procedure HTTPRIO1HTTPWebNode1ReceivingData(Read, Total: Integer);
    procedure HTTPRIO1HTTPWebNode1PostingData(Sent, Total: Integer);
    procedure btnTerstenYazClick(Sender: TObject);
    procedure HTTPRIO1AfterExecute(const MethodName: String;
      SOAPResponse: TStream);
  private
    { Private declarations }
 public
    { Public declarations }
 end;
 
var
 anaForm: TanaForm;
 webHizmeti:Service1Soap; // Tanimlayin
 
implementation
 
{$R *.dfm}
 
// Uzantil bul dügmesi
procedure TanaForm.btnUzantiBulClick(Sender: TObject);
begin
 Application.ProcessMessages; // kilitlenmeyi önle
 HTTPRIO1.URL:='http://localhost:2210/Service1.asmx';
 HTTPRIO1.Service:='Service1';
 InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap), ioDocument);
 editdosyaAdi.Text:=(HTTPRIO1 as Service1Soap).dosyaUzantisiBul(editdosyaAdi.Text);
end;
 
procedure TanaForm.HTTPRIO1BeforeExecute(const MethodName: String;
var SOAPRequest: WideString);
begin
istekMemo.Clear;
istekMemo.Lines.Add('Istek Yapilan Method :'+MethodName);
istekMemo.Lines.Add('XML istek :'+SOAPRequest);
end;
 
//xml istegin cevabi alinirken isletilen method
procedure TanaForm.HTTPRIO1HTTPWebNode1ReceivingData(Read, Total: Integer);
begin
ProgressBarOkunan.Max:=Total;
ProgressBarOkunan.Position:=Read;
end;
 
//xml istek gönderilirken isletin method
procedure TanaForm.HTTPRIO1HTTPWebNode1PostingData(Sent, Total: Integer);
begin
// Maximuma Toplam Büyüklügü aktar
ProgressBarGonderilen.Max:=Total;
// Aktif duruma gönderileni aktar
ProgressBarGonderilen.Position:=Sent;
end;
 
// Tersten yaz Dügmesi
procedure TanaForm.btnTerstenYazClick(Sender: TObject);
begin
 Application.ProcessMessages;
 HTTPRIO1.URL:='http://localhost:2210/Service1.asmx';
 HTTPRIO1.Service:='Service1'; // servis adi
 // Xml istegi gönder
 InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap), ioDocument);
 editMetin.Text:=(HTTPRIO1 as Service1Soap).Terstenyaz(editMetin.Text);
end;
 
// istek yollandiktan sonra
procedure TanaForm.HTTPRIO1AfterExecute(const MethodName: String;SOAPResponse: TStream);
begin
// gelen Xml cevabi al
cevapMemo.Lines.LoadFromStream(SOAPResponse);
cevapMemo.Lines.Add('Cevap veren method :'+MethodName);
end;
end.
 
Uygulamayi çalistirip Test edelim.Dosya Adi etiketinin altindaki kutuya deneme.pas isminde bir dosya adi girelim ve Uzanti Bul butonuna tiklayalim.Gördügünüz gibi sonuç asagida

Yine tersi yazdirilacak metin girelim ve Tersten Yaz butonuna tiklayalim.Gördügünüz gibi tersten yazildi.

Yukaridaki gördügünüz gibi XML web servislerine istekler XML yapida gidiyor.
 
Kaynak Kod indirmek için tiklayin
Geriye VeriKümesi(Dataset) döndüren web servis methodlarini kullanmak için daha önceden hazirlamis oldugum video :
http://yazilimarge.com/delphi-ile-xml-web-servisleri-kullanimi-videosu/11.aspx


Herkese Çalismalarinda Basarilar Dilerim.
Ismail Kocacan (Yazilimci Bozuntusu)
ismailkocacan@gmail.com

 


Kategori : Delphi | 19.03.2011 15:34:00  | 5121 defa okundu  | 0 Yorum |

Yazara Ait Diğer Makaleler(51) Makaleye Yapılan Yorumlar İlk yorum yazan siz olun
Ara
 
Anket
Hangi VeriTabanı Yönetim Sistemini Kullanıyorsunuz ?