Acemiler için Delphi Web Servis Server App + Client App
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Acemiler için Delphi Web Servis Server App + Client App
Merhaba Arkadaşlar,
Uzun zamandır delphi kullanıyorum. Fakat web servisler konusunda hiç bir bilgim yok.
Web servisler konusunda hiç bir bilgim ve tecrübem olmadığı için nereden başlayacağımı bilemedim. Internette veya youtube baktığım örnekler var.
Server Yazılımı + Client Yazılımı olacak. Server tarafında yapmam gereken hangi ayar ve/veya ayarlar var. Örneğin php kodları çalıştırmak için php server kuruluyor. Bunun gibi bir işlem yapmak gerekiyor mu? Eğer gerekiyorsa nelerin yapılması lazım.
Örneğin ben localde ufak bir uygulama yapmak istiyorum. Server ve Client yazılan kodlar aynı bilgisayar üstünde (localde) denemek için neler gerekli.
Kısacası web servisler konusu hakkında bilgisi olmayan bir kişi için basit bir örnekle mesela iki sayının (a + b) toplamı veren, server ve client tarafında neler yapılacağını açıklayan dökümana nereden ulaşabilirim. Forumda aradım fakat en baştan basit bir şekilde nelerin yapılması gerektiğini anlatan bir bilgi bulamadım.
İleride bilgilerim üzerine ekleyerek yapmak istediğim işlem ise veri tabanından (örnek: stok miktarını öğrenmek) ürün kodunu parametre olarak gönderip stok miktarını öğrenmek.
Bazı sitelerde raudus diye bir component gördüm.
İşin doğrusu ve kullanışlı olanı nasıldır.
Bu web application veya web servis dediğimiz işlemin server tarafını linux altında delphi ile birlikte yapabilirmiyim? Bazı yerlerde platform bagımsız yazıyor. XML dosyaları ile bilgi paylaşımı aktırımı gerçekleştiği için. Bu durum eFatura ve eDefter gibi devlet kurumlarınında kullandığı bir uygulama.
Çok şey istedim kusura bakmayın. Fakat web servislerinin programcılar için birer nimet olduğu açıkca ortada
Teşekkürler kolay gelsin.
Uzun zamandır delphi kullanıyorum. Fakat web servisler konusunda hiç bir bilgim yok.
Web servisler konusunda hiç bir bilgim ve tecrübem olmadığı için nereden başlayacağımı bilemedim. Internette veya youtube baktığım örnekler var.
Server Yazılımı + Client Yazılımı olacak. Server tarafında yapmam gereken hangi ayar ve/veya ayarlar var. Örneğin php kodları çalıştırmak için php server kuruluyor. Bunun gibi bir işlem yapmak gerekiyor mu? Eğer gerekiyorsa nelerin yapılması lazım.
Örneğin ben localde ufak bir uygulama yapmak istiyorum. Server ve Client yazılan kodlar aynı bilgisayar üstünde (localde) denemek için neler gerekli.
Kısacası web servisler konusu hakkında bilgisi olmayan bir kişi için basit bir örnekle mesela iki sayının (a + b) toplamı veren, server ve client tarafında neler yapılacağını açıklayan dökümana nereden ulaşabilirim. Forumda aradım fakat en baştan basit bir şekilde nelerin yapılması gerektiğini anlatan bir bilgi bulamadım.
İleride bilgilerim üzerine ekleyerek yapmak istediğim işlem ise veri tabanından (örnek: stok miktarını öğrenmek) ürün kodunu parametre olarak gönderip stok miktarını öğrenmek.
Bazı sitelerde raudus diye bir component gördüm.
İşin doğrusu ve kullanışlı olanı nasıldır.
Bu web application veya web servis dediğimiz işlemin server tarafını linux altında delphi ile birlikte yapabilirmiyim? Bazı yerlerde platform bagımsız yazıyor. XML dosyaları ile bilgi paylaşımı aktırımı gerçekleştiği için. Bu durum eFatura ve eDefter gibi devlet kurumlarınında kullandığı bir uygulama.
Çok şey istedim kusura bakmayın. Fakat web servislerinin programcılar için birer nimet olduğu açıkca ortada
Teşekkürler kolay gelsin.
PostgreSQL - Delphi - Linux 

Re: Acemiler için Delphi Web Servis Server App + Client App
Merhaba.
- Daha önce herhangi bir projenizde bir DLL yazmış mıydınız ? Yazmadıysanız önce bir DLL yazarak denemelerinize başlayın.
- Web Servisler aslında birer DLL benzeri yapıdır. Tek farkı; iletişiminin farklı ortamlar ve hatta farklı platformlardan kaynaklı olduğundan XML ile yapılıyor olmasıdır, ancak sizin direkt olarak şu aşamada XML bilmenize de gerek yok. Bu protokol kendiliğinden arka planda yürür. Sadece İlerleyen aşamalarda olası sorunların tespiti için XML okumaya da giriş yapmak durumunda kalacaksınız ama sonraki bir aşamadır.
- DLL demiştim ya oradan devam edeyim. Asıl projeniz içerisinden, kullanmak istediğiniz DLL dosyasının yerini ve adını refere ederek, bu DLL içinden kullanacağınız fonksiyonu deklere edersiniz. Böylece proje içerisinde fonksiyon /procedure ne ise nasıl kullanılacağını parametre bazında biliyor olursunuz.
- WebService olayında da aynı işlem XML formunda bir çağrı ile bu içerik bir defalığına import edilerek, kullanılacak fonksiyonların bir Delphi PAS uniti halinde oluşmasıyla yapılır.
- Aşamaları daha ileriki zamanlarda sorularınıza göre yeniden cevaplarım. Zaten vakit bulup bir WebService konusunda eğitim planı hazırlamak istiyorum. Bunu Google Hangout ile bir Web Semineri haline yapmayı da forumda konuşmuştuk ancak asli işim ve projelerim sahada olduğundan şu an çok yoğunum.
- Sizin gelişmeniz ile oluşan örnek ve sorulara vereceğim cevapları orada metin oluştururken de kullanabilirim.
- Daha önce herhangi bir projenizde bir DLL yazmış mıydınız ? Yazmadıysanız önce bir DLL yazarak denemelerinize başlayın.
- Web Servisler aslında birer DLL benzeri yapıdır. Tek farkı; iletişiminin farklı ortamlar ve hatta farklı platformlardan kaynaklı olduğundan XML ile yapılıyor olmasıdır, ancak sizin direkt olarak şu aşamada XML bilmenize de gerek yok. Bu protokol kendiliğinden arka planda yürür. Sadece İlerleyen aşamalarda olası sorunların tespiti için XML okumaya da giriş yapmak durumunda kalacaksınız ama sonraki bir aşamadır.
- DLL demiştim ya oradan devam edeyim. Asıl projeniz içerisinden, kullanmak istediğiniz DLL dosyasının yerini ve adını refere ederek, bu DLL içinden kullanacağınız fonksiyonu deklere edersiniz. Böylece proje içerisinde fonksiyon /procedure ne ise nasıl kullanılacağını parametre bazında biliyor olursunuz.
- WebService olayında da aynı işlem XML formunda bir çağrı ile bu içerik bir defalığına import edilerek, kullanılacak fonksiyonların bir Delphi PAS uniti halinde oluşmasıyla yapılır.
- Aşamaları daha ileriki zamanlarda sorularınıza göre yeniden cevaplarım. Zaten vakit bulup bir WebService konusunda eğitim planı hazırlamak istiyorum. Bunu Google Hangout ile bir Web Semineri haline yapmayı da forumda konuşmuştuk ancak asli işim ve projelerim sahada olduğundan şu an çok yoğunum.
- Sizin gelişmeniz ile oluşan örnek ve sorulara vereceğim cevapları orada metin oluştururken de kullanabilirim.
Re: Acemiler için Delphi Web Servis Server App + Client App
mrmarman hocam ilginiz için çok teşekkür ederim.
Daha önce kendim örnek olması açısından ve nasıl oluyor diye merak ettiğim için ufak bir dll yazdım. Ama uzun zaman önceydi. Birde bir pdf oluşturma işlemi için dll fonksiyonlarını kullanmıştım.
Evet dediğiniz gibi araştırmalarım sırasında kodların derlenmesi sonucunda dll oluşduğunu görmüştüm.
Fakat ben hiçbir bilgim olmadığı için oluşan dll dosyasını nasıl test ederim nasıl kullanırım bilmiyorum. Yani server application veya client application için özel bir işlem yapmak gerekiyor mu?
Normal bir uygulama yazınca derleme işleminden sonra ban bir exe veriyor bende bu programı çift tıklama ile açıp çalıştırıyorum. Fakat web servisde o dll dosyasını bir şekilde yüklemek çalıştırmak gerekiyor.
Örnek kod mesela bunu bulmuştum.
// #### WebServiceTest.dpr ####
// #### WSTestIntf.pas ####
// #### WSTestImpl.pas ####
// #### MainSoap.pas ####
WSTestIntf dosyasında test isimli bir fonksiyon tanımlanıyor. stdcall ile çağırılabilir bir fonksiyon diyor. Dll dosylarında olduğu gibi. Yanlışım varsa düzeltin lütfen.
WSTestImpl dosyasında fonksiyonun içeriği burata aktarılıyor.
Intf ve Impl dosyaları otomatik kendisi oluşuyor. Bu dosyaların farkları nelerdir. Fonksiyon tanımını iki kere yazdık. Bir yerde sadece imzasını attık Impl dosyasında ise fonksiyonun yapacağı işlemide yazdık.
Birde bütün bilgileri öğrenemem zaten. Ben asıl başlangıç olarak bu oluşan dll dosyasını nasıl deneyebilirim.
Anladığım kadarı ile bu sadece server tarafı.
Yani client servere Test('ABC') gönderecek serverde 'ABC' return edecek.
Daha önce kendim örnek olması açısından ve nasıl oluyor diye merak ettiğim için ufak bir dll yazdım. Ama uzun zaman önceydi. Birde bir pdf oluşturma işlemi için dll fonksiyonlarını kullanmıştım.
Evet dediğiniz gibi araştırmalarım sırasında kodların derlenmesi sonucunda dll oluşduğunu görmüştüm.
Fakat ben hiçbir bilgim olmadığı için oluşan dll dosyasını nasıl test ederim nasıl kullanırım bilmiyorum. Yani server application veya client application için özel bir işlem yapmak gerekiyor mu?
Normal bir uygulama yazınca derleme işleminden sonra ban bir exe veriyor bende bu programı çift tıklama ile açıp çalıştırıyorum. Fakat web servisde o dll dosyasını bir şekilde yüklemek çalıştırmak gerekiyor.
Örnek kod mesela bunu bulmuştum.
// #### WebServiceTest.dpr ####
Kod: Tümünü seç
library WebServiceTest;
uses
ActiveX,
ComObj,
WebBroker,
ISAPIThreadPool,
ISAPIApp,
MainSoap in 'MainSoap.pas' {WebModule1: TWebModule},
WSTestImpl in 'WSTestImpl.pas',
WSTestIntf in 'WSTestIntf.pas';
{$R *.res}
exports
GetExtensionVersion,
HttpExtensionProc,
TerminateExtension;
begin
CoInitFlags := COINIT_MULTITHREADED;
Application.Initialize;
Application.CreateForm(TWebModule1, WebModule1);
Application.Run;
end.
// #### WSTestIntf.pas ####
Kod: Tümünü seç
{ Invokable interface IWSTest }
unit WSTestIntf;
interface
uses InvokeRegistry, Types, XSBuiltIns;
type
{ Invokable interfaces must derive from IInvokable }
IWSTest = interface(IInvokable)
['{184CC80A-4EBA-4F56-BAF7-AA7F5D805BE0}']
function Test(s_in:string):string; stdcall;
{ Methods of Invokable interface must not use the default }
{ calling convention; stdcall is recommended }
end;
implementation
initialization
{ Invokable interfaces must be registered }
InvRegistry.RegisterInterface(TypeInfo(IWSTest));
end.
// #### WSTestImpl.pas ####
Kod: Tümünü seç
{ Invokable implementation File for TWSTest which implements IWSTest }
unit WSTestImpl;
interface
uses InvokeRegistry, Types, XSBuiltIns, WSTestIntf;
type
{ TWSTest }
TWSTest = class(TInvokableClass, IWSTest)
public
function Test(s_in:string):string; stdcall;
end;
implementation
function TWSTest.Test(s_in:string):string;
begin
result := 'webservice=' + s_in;
end;
initialization
{ Invokable classes must be registered }
InvRegistry.RegisterInvokableClass(TWSTest);
end.
// #### MainSoap.pas ####
Kod: Tümünü seç
{ SOAP WebModule }
unit MainSoap;
interface
uses
SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo,
WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
SOAPHTTPDisp, WebBrokerSOAP;
type
TWebModule1 = class(TWebModule)
HTTPSoapDispatcher1: THTTPSoapDispatcher;
HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
WSDLHTMLPublish1: TWSDLHTMLPublish;
procedure WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
WebModule1: TWebModule1;
implementation
{$R *.dfm}
procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;
end.
WSTestIntf dosyasında test isimli bir fonksiyon tanımlanıyor. stdcall ile çağırılabilir bir fonksiyon diyor. Dll dosylarında olduğu gibi. Yanlışım varsa düzeltin lütfen.
WSTestImpl dosyasında fonksiyonun içeriği burata aktarılıyor.
Intf ve Impl dosyaları otomatik kendisi oluşuyor. Bu dosyaların farkları nelerdir. Fonksiyon tanımını iki kere yazdık. Bir yerde sadece imzasını attık Impl dosyasında ise fonksiyonun yapacağı işlemide yazdık.
Birde bütün bilgileri öğrenemem zaten. Ben asıl başlangıç olarak bu oluşan dll dosyasını nasıl deneyebilirim.
Anladığım kadarı ile bu sadece server tarafı.
Yani client servere Test('ABC') gönderecek serverde 'ABC' return edecek.
PostgreSQL - Delphi - Linux 

Re: Acemiler için Delphi Web Servis Server App + Client App
Beni yanlış anladınız.
- Ayrıca herhangi bir DLL oluşturup bunu WebService uygulamasından kullanabilirsiniz bu başka bir konu.
- Web Servis uygulamaları DLL uzantılı demek istemedim. Yapısal olarak bir DLL ile benzerdir demek istedim.
- Function ve Procedure kütüphanesidirler. Başka projelerden başvuru yapılarak işlem ve/veya cevap dönmesi esasına göre çalışırlar.
- DLL tek başına hafızada kaldığı sürece bekler veya belli durumlarda işlem yapacak, windows mesajları yayınlayacak şekilde yapılandırılabilir. Sonuçta bu da aslında bir EXE dosyasıdır.
- Ayrıca herhangi bir DLL oluşturup bunu WebService uygulamasından kullanabilirsiniz bu başka bir konu.
- Web Servis uygulamaları DLL uzantılı demek istemedim. Yapısal olarak bir DLL ile benzerdir demek istedim.
- Function ve Procedure kütüphanesidirler. Başka projelerden başvuru yapılarak işlem ve/veya cevap dönmesi esasına göre çalışırlar.
- DLL tek başına hafızada kaldığı sürece bekler veya belli durumlarda işlem yapacak, windows mesajları yayınlayacak şekilde yapılandırılabilir. Sonuçta bu da aslında bir EXE dosyasıdır.
Re: Acemiler için Delphi Web Servis Server App + Client App
Şimdi anladım. Çalışma mantığı dll dosya mantığı gibi. Ben araştırma yapmaya devam ediyorum. Umarim en kısa zamanda bununla ilgili basit sade anlatımlı bir makale veya örnek bulurum. Peki on hazırlık gerekli mi yani server veya client için herhangi bir ekstra yazılım kurulmalı mı.
Kusura bakmayın bu konuda acemi olduğum için çok basit sorularıda soruyorum
Kusura bakmayın bu konuda acemi olduğum için çok basit sorularıda soruyorum
PostgreSQL - Delphi - Linux 

Re: Acemiler için Delphi Web Servis Server App + Client App
- DLL mantığının oturması; tümüyle temrin (eğitim için temel olması açısından antraman gibi düşünün) niteliğindedir.
- Projenizde bir sorunla illa ki karşılaşmanız muhtemeldir. Bunun WSDL/SOAP yakasında takip etmek için sonraki aşama olarak bahsettiğim XML yapısını bilmeniz, temel olarak projeniz kaynaklı bir sorun olup olmadığını takip etmek içinde DLL mantığıyla takibi için olduğunu ifade edeyim.
- Daha üçüncü bir yakası daha var ama o da en sonra öğrenmeniz gereken işlemdir. Nedir ? Yerel ağ üzerinden daha uzaktan yani şirket içindeki farklı ağlar / gateway'ler veya direkt Internet üzerinden projenizin client'ler ile kuracağı diyalog.
- Bu bağlamda PORT yönlendirme konusunu da öğrenmeniz gerekecektir. WEB Server projeniz, bir yerel ağ altındaki birden fazla bilgisayardan hangisinde kurulu ise, internet üzerinden bu projeye erişmek için; belirleyeceğiniz port numarasının, ilgili bilgisayarın IP adresine modem router üzerinden yönlendirilmesi gerekir. Modem ayarlarından yapılan bir ayardır.
- Sorun neler olabilir; farklı platformlarla uyumlu olmayan değişken tipi tanımlıyor olabilirsiniz, XML versiyonları farklı olabilir, gelen veri içeriğinin dil uyumu olmadığından karakter sorunu yaşıyor olabilirsiniz, portlar uymadığından iletişim kurulamıyor olabilir, firewall altında engelleniyor olabilirsiniz vs. vs. daha saymadığım bir sürü bir birinden farklı etken ile karşılaşmanız muhtemeldir.
- Ön hazırlık gerekmiyor. Delphi tek başına internet WSDL sunucusu olarak çalışabilir nitelikte. Yani bilgisayarınıza herhangi bir ISS kurmak zorunda değilsiniz. EXE çalışır çalışmaz explorer açıp, client olacak gerek yerel ağ gerekse internet üzerinden projenin IP adresini yazıp XML cevabını alırsınız. mesela http://localhost:1024/wsdl url'si ile 1024 nolu portu tanımladığınızı varsayarak yerel ağdaki WSDL yapısını görebilirsiniz.Peki on hazırlık gerekli mi yani server veya client için herhangi bir ekstra yazılım kurulmalı mı.
Kusura bakmayın bu konuda acemi olduğum için çok basit sorularıda soruyorum
- Projenizde bir sorunla illa ki karşılaşmanız muhtemeldir. Bunun WSDL/SOAP yakasında takip etmek için sonraki aşama olarak bahsettiğim XML yapısını bilmeniz, temel olarak projeniz kaynaklı bir sorun olup olmadığını takip etmek içinde DLL mantığıyla takibi için olduğunu ifade edeyim.
- Daha üçüncü bir yakası daha var ama o da en sonra öğrenmeniz gereken işlemdir. Nedir ? Yerel ağ üzerinden daha uzaktan yani şirket içindeki farklı ağlar / gateway'ler veya direkt Internet üzerinden projenizin client'ler ile kuracağı diyalog.
- Bu bağlamda PORT yönlendirme konusunu da öğrenmeniz gerekecektir. WEB Server projeniz, bir yerel ağ altındaki birden fazla bilgisayardan hangisinde kurulu ise, internet üzerinden bu projeye erişmek için; belirleyeceğiniz port numarasının, ilgili bilgisayarın IP adresine modem router üzerinden yönlendirilmesi gerekir. Modem ayarlarından yapılan bir ayardır.
- Sorun neler olabilir; farklı platformlarla uyumlu olmayan değişken tipi tanımlıyor olabilirsiniz, XML versiyonları farklı olabilir, gelen veri içeriğinin dil uyumu olmadığından karakter sorunu yaşıyor olabilirsiniz, portlar uymadığından iletişim kurulamıyor olabilir, firewall altında engelleniyor olabilirsiniz vs. vs. daha saymadığım bir sürü bir birinden farklı etken ile karşılaşmanız muhtemeldir.

Re: Acemiler için Delphi Web Servis Server App + Client App
Hazır konu açılmışken bu konuda ben de birşey sorayım 
Web servis yazma konusunda C#'ın Delphi'ye göre ne üstünlüğü var?
Çünkü, "web servis yazmak" deyince hemen akla C# geliyor, Delphi'nin bazı sıkıntıları olduğu söyleniyor vs...

Web servis yazma konusunda C#'ın Delphi'ye göre ne üstünlüğü var?
Çünkü, "web servis yazmak" deyince hemen akla C# geliyor, Delphi'nin bazı sıkıntıları olduğu söyleniyor vs...
There's no place like 127.0.0.1
Re: Acemiler için Delphi Web Servis Server App + Client App
Mesela yeni bir proje yazıyorum.
Windows8 32 bit işletim sistemi ve Delphi XE5 kullanıyorum.
Resimlerle adım adım neler yaptığımı göstereyim bilgiler havada kalmasın yanlış birşey çıkıp sizin de zamanınızı boşa almak istemem.




Ben örnek methodlarıda oluştursun dedim. Zaten örnek kodlar geldi birkaç tane fonksiyon yazılı olarak geldi.
interface kısmında 3 adet sınıf tanımlamış ve 4 tane fonksiyon için tanım yapılmış.
implementation kısmında ise 4 adet fonksiyonun içeriğini yazılmış. Oluşturulan sınıfları görmesi için WebServiceDenem1Intf uses a eklenmiş.
Buraya kadar herşey tamam.
http://localhost:1024/wsdl sizin verdiğiniz örnekte olduğu gibi oluşturulan uygulamayı yayınlamak için neler yapmalıyım.
http://aysenlik.blogspot.com.tr/2012/11 ... -soap.html
buradaki linkte bazı şeyler anlatılmış ve internette araştırıken gördüğüm örneklerde uygulamayı yayınlamak için,
IIS altında ISAPI, CGI vs uygulamaları çalıştırmak için bazı windows bileşenleri için ayar mı yapmak gerekiyor.
Bundan sonra Denetim masası -> yönetimsel araçlar altında -> Internet Information Services (IIS) Yöneticisi içinde neler yapmak gerekli.
Gecenin 2'sinde umarım yanlış anlayıp herşeyi birbirine katmamışımdır.
Ciddi anlamda WebServis için bir makale şart
hiç bir yerde tam olarak en baştan son olarak uygulamanın çalıştırılmasına kadar olan süreci anlatan küçük bir örnek bulamadım veya yanlış anahtar kelimeler ile arama yapıyorum.
Kolay gelsin.
Windows8 32 bit işletim sistemi ve Delphi XE5 kullanıyorum.
Resimlerle adım adım neler yaptığımı göstereyim bilgiler havada kalmasın yanlış birşey çıkıp sizin de zamanınızı boşa almak istemem.




Ben örnek methodlarıda oluştursun dedim. Zaten örnek kodlar geldi birkaç tane fonksiyon yazılı olarak geldi.
interface kısmında 3 adet sınıf tanımlamış ve 4 tane fonksiyon için tanım yapılmış.
Kod: Tümünü seç
{ Invokable interface IWebServiceDenem1 }
unit WebServiceDenem1Intf;
interface
uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns;
type
TEnumTest = (etNone, etAFew, etSome, etAlot);
TDoubleArray = array of Double;
TMyEmployee = class(TRemotable)
private
FLastName: AnsiString;
FFirstName: AnsiString;
FSalary: Double;
published
property LastName: AnsiString read FLastName write FLastName;
property FirstName: AnsiString read FFirstName write FFirstName;
property Salary: Double read FSalary write FSalary;
end;
{ Invokable interfaces must derive from IInvokable }
IWebServiceDenem1 = interface(IInvokable)
['{98A81952-DA49-4490-9235-247ECE7BBB5B}']
{ Methods of Invokable interface must not use the default }
{ calling convention; stdcall is recommended }
function echoEnum(const Value: TEnumTest): TEnumTest; stdcall;
function echoDoubleArray(const Value: TDoubleArray): TDoubleArray; stdcall;
function echoMyEmployee(const Value: TMyEmployee): TMyEmployee; stdcall;
function echoDouble(const Value: Double): Double; stdcall;
end;
implementation
initialization
{ Invokable interfaces must be registered }
InvRegistry.RegisterInterface(TypeInfo(IWebServiceDenem1));
end.
Kod: Tümünü seç
{ Invokable implementation File for TWebServiceDenem1 which implements IWebServiceDenem1 }
unit WebServiceDenem1Impl;
interface
uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, WebServiceDenem1Intf;
type
{ TWebServiceDenem1 }
TWebServiceDenem1 = class(TInvokableClass, IWebServiceDenem1)
public
function echoEnum(const Value: TEnumTest): TEnumTest; stdcall;
function echoDoubleArray(const Value: TDoubleArray): TDoubleArray; stdcall;
function echoMyEmployee(const Value: TMyEmployee): TMyEmployee; stdcall;
function echoDouble(const Value: Double): Double; stdcall;
end;
implementation
function TWebServiceDenem1.echoEnum(const Value: TEnumTest): TEnumTest; stdcall;
begin
{ TODO : Implement method echoEnum }
Result := Value;
end;
function TWebServiceDenem1.echoDoubleArray(const Value: TDoubleArray): TDoubleArray; stdcall;
begin
{ TODO : Implement method echoDoubleArray }
Result := Value;
end;
function TWebServiceDenem1.echoMyEmployee(const Value: TMyEmployee): TMyEmployee; stdcall;
begin
{ TODO : Implement method echoMyEmployee }
Result := TMyEmployee.Create;
end;
function TWebServiceDenem1.echoDouble(const Value: Double): Double; stdcall;
begin
{ TODO : Implement method echoDouble }
Result := Value;
end;
initialization
{ Invokable classes must be registered }
InvRegistry.RegisterInvokableClass(TWebServiceDenem1);
end.
http://localhost:1024/wsdl sizin verdiğiniz örnekte olduğu gibi oluşturulan uygulamayı yayınlamak için neler yapmalıyım.
http://aysenlik.blogspot.com.tr/2012/11 ... -soap.html
buradaki linkte bazı şeyler anlatılmış ve internette araştırıken gördüğüm örneklerde uygulamayı yayınlamak için,
IIS altında ISAPI, CGI vs uygulamaları çalıştırmak için bazı windows bileşenleri için ayar mı yapmak gerekiyor.
Bundan sonra Denetim masası -> yönetimsel araçlar altında -> Internet Information Services (IIS) Yöneticisi içinde neler yapmak gerekli.
Ağ konusunda çok sorun yaşamam. Ağ bilgim iyidir. Firewall yönetimi veya modem içinden yönetim (port yönlendirme) birçok defa yaptım.- Ön hazırlık gerekmiyor. Delphi tek başına internet WSDL sunucusu olarak çalışabilir nitelikte. Yani bilgisayarınıza herhangi bir ISS kurmak zorunda değilsiniz. EXE çalışır çalışmaz explorer açıp, client olacak gerek yerel ağ gerekse internet üzerinden projenin IP adresini yazıp XML cevabını alırsınız. mesela http://localhost:1024/wsdl url'si ile 1024 nolu portu tanımladığınızı varsayarak yerel ağdaki WSDL yapısını görebilirsiniz.
Gecenin 2'sinde umarım yanlış anlayıp herşeyi birbirine katmamışımdır.
Ciddi anlamda WebServis için bir makale şart

Kolay gelsin.
PostgreSQL - Delphi - Linux 

Re: Acemiler için Delphi Web Servis Server App + Client App
@SimaWB
- Forumda tecrübeli olan başkaları da vardır, onların da bu konudaki yorumumu beklerim.
- Naçizane bilgim çerçevesinde diyebileceğim;
(1) Genelde WebService konusunda yaygın kullanım olarak CLIENT (istemci) olarak çalışmalar ile karşılaşıyorum. Forumdaki başlıkların WSDL içerikli hallerine bu konu başlığı gerekçesiyle baktım ki; genelinde HAL kayıt sistemi ya da diğer e-devlet uygulamalarına erişim için sadece istemci rolüyle sorular gelmiş.
(2) Delphi ile ilgili sıkıntılardan dikkatimi çeken tümüyle (C#) ile yazılmış Web Servislerine (Delphi) ile bağlantı konusundaki uyumsuzluklar ile ilgili. Ya da başka bir konu varsa bana link referans verirseniz onu da beraberce irdeleriz.
(*) (Delphi) yakası WSDL Server olan, (C#) yakası client projeler daha önce de hazırladım. (C#)'ı server olarak tercih etmemek şeklinde algılanmasın, (C#) bilgi seviyem SERVER kurup kovuşturacak seviyede yeterli değil de ondan.
(*) (C#) diline (Windows CE) çalışan el terminalleri ile (Windows Mobile) 5 ve 6 serisi mobil telefonlar için kod yazmaktan başka yerde ihtiyacım olmadı. Geriye kalan yerlerden kesin bir dille söylüyorum, (Delphi) beni hiç bir an yarı yolda bırakmadı
(*) Önemli olduğunu değerlendirdiğim yegane konu; sadece standart tipteki değişken tiplerini ( INTEGER, STRING ve DOUBLE) kullandığımızda her platformdan Delphi SOAP sunucularına sorun çıkmadan bağlantı sağlayabiliyoruz. (C#) Web Reference ekleyip (Delphi'deki WSDL import benzeridir) hiç sıkıntı olmadan iletişim sağlanabiliyor.
(3) Şimdi SOAP yanında bir de JSON XML kullanabilen REST geldi ki onun üzerinde araştırmalarımı sürdürüyorum. Kendi projelerimde sıkıntı yaşamadım ama daha profesyonel çalışmalarda yetersiz kalmış olmalı ki buna alternatif olarak REST yapısını ortaya koydular.
@3ddark
- ISAPI için erken. Şimdi görsel olarak StandAlone VCL Application olanı seçip başlarsanız daha yere basan örnekler elde edebilirsiniz. Bir süre sonra TForm arayüz ile işinizin kalmadığına kanaat getirdiğinde ISAPI DLL olayına giriş yaparsınız.
- Size örnek bir proje hazırladım. Bu linkten indirip deneyebilirsiniz. Delphi XE6 ile ama XE5 ile de uyumludur, sizde de çalışacaktır.
- Bu başlığı okuyanlar için de proje aşamasını ekran kopyası olarak aldım. Üzerlerine tıklayınca normal boyutlarında büyütebilirsiniz.



- Forumda tecrübeli olan başkaları da vardır, onların da bu konudaki yorumumu beklerim.
- Naçizane bilgim çerçevesinde diyebileceğim;
(1) Genelde WebService konusunda yaygın kullanım olarak CLIENT (istemci) olarak çalışmalar ile karşılaşıyorum. Forumdaki başlıkların WSDL içerikli hallerine bu konu başlığı gerekçesiyle baktım ki; genelinde HAL kayıt sistemi ya da diğer e-devlet uygulamalarına erişim için sadece istemci rolüyle sorular gelmiş.
(2) Delphi ile ilgili sıkıntılardan dikkatimi çeken tümüyle (C#) ile yazılmış Web Servislerine (Delphi) ile bağlantı konusundaki uyumsuzluklar ile ilgili. Ya da başka bir konu varsa bana link referans verirseniz onu da beraberce irdeleriz.
(*) (Delphi) yakası WSDL Server olan, (C#) yakası client projeler daha önce de hazırladım. (C#)'ı server olarak tercih etmemek şeklinde algılanmasın, (C#) bilgi seviyem SERVER kurup kovuşturacak seviyede yeterli değil de ondan.
(*) (C#) diline (Windows CE) çalışan el terminalleri ile (Windows Mobile) 5 ve 6 serisi mobil telefonlar için kod yazmaktan başka yerde ihtiyacım olmadı. Geriye kalan yerlerden kesin bir dille söylüyorum, (Delphi) beni hiç bir an yarı yolda bırakmadı

(*) Önemli olduğunu değerlendirdiğim yegane konu; sadece standart tipteki değişken tiplerini ( INTEGER, STRING ve DOUBLE) kullandığımızda her platformdan Delphi SOAP sunucularına sorun çıkmadan bağlantı sağlayabiliyoruz. (C#) Web Reference ekleyip (Delphi'deki WSDL import benzeridir) hiç sıkıntı olmadan iletişim sağlanabiliyor.
(3) Şimdi SOAP yanında bir de JSON XML kullanabilen REST geldi ki onun üzerinde araştırmalarımı sürdürüyorum. Kendi projelerimde sıkıntı yaşamadım ama daha profesyonel çalışmalarda yetersiz kalmış olmalı ki buna alternatif olarak REST yapısını ortaya koydular.
@3ddark
- ISAPI için erken. Şimdi görsel olarak StandAlone VCL Application olanı seçip başlarsanız daha yere basan örnekler elde edebilirsiniz. Bir süre sonra TForm arayüz ile işinizin kalmadığına kanaat getirdiğinde ISAPI DLL olayına giriş yaparsınız.
- Size örnek bir proje hazırladım. Bu linkten indirip deneyebilirsiniz. Delphi XE6 ile ama XE5 ile de uyumludur, sizde de çalışacaktır.
- Bu başlığı okuyanlar için de proje aşamasını ekran kopyası olarak aldım. Üzerlerine tıklayınca normal boyutlarında büyütebilirsiniz.









Kod: Tümünü seç
uses ARMAN_WebServisi_UnitIntf;
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
Sorgu : tARMAN_OrnekSinif;
begin
Sorgu := tARMAN_OrnekSinif.Create;
Sorgu.Adi := Edit1.Text;
Sorgu.Soyadi := Edit2.Text;
Sorgu.DogumTarihi := DateTimePicker1.Date;
HTTPRIO1.WSDLLocation := 'http://'+ Edit3.Text + ':' + Edit4.Text + '/wsdl/IARMAN_WebServisi';
HTTPRIO1.Service := 'IARMAN_WebServisiservice';
HTTPRIO1.Port := 'IARMAN_WebServisiPort';
Try
if (HTTPRIO1 as IARMAN_WebServisi).Sorgula( Sorgu )
then MessageDlg( 'Bilgi başarıyla gönderildi...', mtInformation, [mbOk], 0)
else MessageDlg( 'Bilgi karşıya ulaşırken sorun oldu..', mtWarning, [mbCancel], 0);
Except
MessageDlg( 'Servis Çalışmıyor veya bağlantı hatası var. İletişim kurulamadı..', mtError, [mbCancel], 0);
End;
Sorgu.Free;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Edit3.Text := 'localhost';
Edit4.Text := '1234';
end;
Re: Acemiler için Delphi Web Servis Server App + Client App
Muharrem hocam çok teşekkür ederim. Verdiğiniz örnek üzerinden ilerleyerek.
Ben kendim bir sınıf yazdım ve server tarafında veri tabanı bağlantı işlemlerini yaptım. Fakat güvenlik adına herşeyi gözardı ederek.
Aşağıdaki bilgileri client içindeki editlerden alarak sınıfı parametre olarak gönderdim.
fonksiyonu ile SQL Insert yaptım (PostgreSQL DB). Sonuç olarak çalıştı.
Fakat benim aklıma takılan sorular var. Güvenlik adına neler yapılabilir.
Web servis güvenliği hakkında bilgim olmadığı için kullanıcı adı ve şifre mantığı ile kullanıcıyı bağlayıp kullanıcıya ait ID hafzıda tutulup. Sonraki işlemleri bu ID ile göndermek.
Ben kendim bir sınıf yazdım ve server tarafında veri tabanı bağlantı işlemlerini yaptım. Fakat güvenlik adına herşeyi gözardı ederek.
Aşağıdaki bilgileri client içindeki editlerden alarak sınıfı parametre olarak gönderdim.
Kod: Tümünü seç
TUrun = Class;
UrunKodu
UrunAdı
Renk
Kalinlik
En
Boy
Agirlik
InsertUrunKodu(urun:TUrun):boolean; stdcall;
Fakat benim aklıma takılan sorular var. Güvenlik adına neler yapılabilir.
Web servis güvenliği hakkında bilgim olmadığı için kullanıcı adı ve şifre mantığı ile kullanıcıyı bağlayıp kullanıcıya ait ID hafzıda tutulup. Sonraki işlemleri bu ID ile göndermek.
PostgreSQL - Delphi - Linux 

Re: Acemiler için Delphi Web Servis Server App + Client App
- Biraz hızlı ilerliyorsunuz.
- Çünkü SOAP konusunda örnek olarak sizin için hazırladığım class(TInvokableClass, IARMAN_WebServisi) sınıfını tam manasıyla irdelemeden direkt bir sonraki örneğim olan class(TInvokableClass, IARMAN_Authenticator) aşamasına alelacele geçmek istiyorsunuz ki bu doğru olmaz.
- O zaman bana tam bir WebService örneği hazırlatmış, mimarinizi bu örneğe bağımlı olarak kurarsınız. Bu şekilde herkes yazılımcı olur, çünkü bir proje varsa kod okumayı bilen herkes bu kodları kendine göre manipüle ederek istediği şeyi yapar. Bu şekilde bir yazılım hazırlamış sayılır mı bu tartışılır.
- Şimdilik özetleyeyim :
(1) Her bir bağlantı talebi bir session olsun. Serverinizi bir session açmak için bir isim ve parola soracak değil mi ? Bunun için bir function yazıcaz. Önceki yazdığımdan hiç bir farkı yoktur. Tabandan tavana aynıdır.
(2) Bu isim parola parametre olarak geçildiğinde eğer doğru ise, bu user için bir SESSION ID ( GUID olarak ) üretip bir Server yakasında bir ClientDataset olabilir text tabloda geçici olarak tutuyorsunuz. Hatta önce bu user daha önce login olmuş mu kontrolünü yapıp bu GUID string'ini tablodan geri çekip kullanacaksınız. Trik burada.
(3) Kullanıcı logout olduğunda veya bir timeout süresi sonunda kişinin kaydını bu table'dan pasife alıyorsunuz ki kişi yeniden login olmak zorunda kalsın.
- Bu üç başlık basit bir kurgudur ama temrin olarak girdi / çıktısı olan bir mekanizmadır ve bilinmesi pratik kazanılması önemlidir. Özetle ilk sorgumuz kapı açacak, bundan sonraki her sorguda bu kapı kullanılacak.
- Takip eden sıradaki aşama ise HTTPS ile secure bağlantı kurup bu login diyaloğunun içeriğinin encrypt edilmesi konusudur.
- Çünkü SOAP konusunda örnek olarak sizin için hazırladığım class(TInvokableClass, IARMAN_WebServisi) sınıfını tam manasıyla irdelemeden direkt bir sonraki örneğim olan class(TInvokableClass, IARMAN_Authenticator) aşamasına alelacele geçmek istiyorsunuz ki bu doğru olmaz.
- O zaman bana tam bir WebService örneği hazırlatmış, mimarinizi bu örneğe bağımlı olarak kurarsınız. Bu şekilde herkes yazılımcı olur, çünkü bir proje varsa kod okumayı bilen herkes bu kodları kendine göre manipüle ederek istediği şeyi yapar. Bu şekilde bir yazılım hazırlamış sayılır mı bu tartışılır.
- Şimdilik özetleyeyim :
(1) Her bir bağlantı talebi bir session olsun. Serverinizi bir session açmak için bir isim ve parola soracak değil mi ? Bunun için bir function yazıcaz. Önceki yazdığımdan hiç bir farkı yoktur. Tabandan tavana aynıdır.
(2) Bu isim parola parametre olarak geçildiğinde eğer doğru ise, bu user için bir SESSION ID ( GUID olarak ) üretip bir Server yakasında bir ClientDataset olabilir text tabloda geçici olarak tutuyorsunuz. Hatta önce bu user daha önce login olmuş mu kontrolünü yapıp bu GUID string'ini tablodan geri çekip kullanacaksınız. Trik burada.
(3) Kullanıcı logout olduğunda veya bir timeout süresi sonunda kişinin kaydını bu table'dan pasife alıyorsunuz ki kişi yeniden login olmak zorunda kalsın.
- Bu üç başlık basit bir kurgudur ama temrin olarak girdi / çıktısı olan bir mekanizmadır ve bilinmesi pratik kazanılması önemlidir. Özetle ilk sorgumuz kapı açacak, bundan sonraki her sorguda bu kapı kullanılacak.
- Takip eden sıradaki aşama ise HTTPS ile secure bağlantı kurup bu login diyaloğunun içeriğinin encrypt edilmesi konusudur.
Re: Acemiler için Delphi Web Servis Server App + Client App
Muharrem hocam ilgin için teşekkür ederim.
Benim şu andaki amacım bir proje çıkartmak veya bir iş yapmak değil. Belki ilerde çok işime yarayacak çok fazla kullanabileceğim özellik.
Ama şu anda ben öğrenmek amacı ile farklı denemeler yapıyorum.
Sizin gönderdiğiniz kod üzerinden mantık yürüterek kendi sınıfımı yazıp neler yapabilirim neler ile karşılarım adına gücenlik ile alaklı gördüğüm sıkıntıyı dile getirdim.
Tekrardan amacım nasıl çalışır nasıl işler. Yani işin mantığını öğrenmek. Kopyala yapıştırın bana hiç bir faydası olmaz. Kendimi kandırım geçici bir bilgi olur.
Örneğin şu anda edindiğim bir tecrübe bir projemizde DATABASE sınıfı var 65536 satırı aştı ve debug edemiyoruz. Satır sayısını azaltınca 65536 nın altına çekince debug işlemini yapabiliyoruz. Delphinin ilginçliğidir. Şimdi onun için çözüm bakıyoruz. Çok garip bir programlama dili için satır kısıtlaması olması en azından bu kadar az olması. Her bir dosya için 65536 limiti var. Çözüm bulamazsak dosyayı parçalamak zorunda kalacağız.
Benim şu andaki amacım bir proje çıkartmak veya bir iş yapmak değil. Belki ilerde çok işime yarayacak çok fazla kullanabileceğim özellik.
Ama şu anda ben öğrenmek amacı ile farklı denemeler yapıyorum.
Sizin gönderdiğiniz kod üzerinden mantık yürüterek kendi sınıfımı yazıp neler yapabilirim neler ile karşılarım adına gücenlik ile alaklı gördüğüm sıkıntıyı dile getirdim.
Tekrardan amacım nasıl çalışır nasıl işler. Yani işin mantığını öğrenmek. Kopyala yapıştırın bana hiç bir faydası olmaz. Kendimi kandırım geçici bir bilgi olur.

Örneğin şu anda edindiğim bir tecrübe bir projemizde DATABASE sınıfı var 65536 satırı aştı ve debug edemiyoruz. Satır sayısını azaltınca 65536 nın altına çekince debug işlemini yapabiliyoruz. Delphinin ilginçliğidir. Şimdi onun için çözüm bakıyoruz. Çok garip bir programlama dili için satır kısıtlaması olması en azından bu kadar az olması. Her bir dosya için 65536 limiti var. Çözüm bulamazsak dosyayı parçalamak zorunda kalacağız.
PostgreSQL - Delphi - Linux 

Re: Acemiler için Delphi Web Servis Server App + Client App
Bir ünit içinde 65536 satır kod, hele hele bir sınıf için 65536 kod3ddark yazdı:Örneğin şu anda edindiğim bir tecrübe bir projemizde DATABASE sınıfı var 65536 satırı aştı ve debug edemiyoruz. Satır sayısını azaltınca 65536 nın altına çekince debug işlemini yapabiliyoruz. Delphinin ilginçliğidir. Şimdi onun için çözüm bakıyoruz. Çok garip bir programlama dili için satır kısıtlaması olması en azından bu kadar az olması. Her bir dosya için 65536 limiti var. Çözüm bulamazsak dosyayı parçalamak zorunda kalacağız.

Otomatik oluşturulmuş bir Unit değilse kesinlikle değişiklik yapmanızı öneririm.
Hangi versiyon Delphi kullanıyorsunuz bilmiyorum ama yeni versiyonlarda böyle bir sınır yok sanırım. Burada Marco Cantu 81732. satıra break point koyduğunu göstermiş.
There's no place like 127.0.0.1
Re: Acemiler için Delphi Web Servis Server App + Client App
@mrmarman
Merhaba,
Konuyu hortlatmak gibi olacak ancak link çalışmıyor. Projeyi tekrar upload etme şansınız var mı?
Kolay gelsin.
Merhaba,
Konuyu hortlatmak gibi olacak ancak link çalışmıyor. Projeyi tekrar upload etme şansınız var mı?
Kolay gelsin.
Bildiğim tek şey, hiç bir şey bilmediğim.