Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Web servis konusunda yardım
#1
Herkese selam. Çalıştığım fabrikada kullanılan web servislere erişmem için web servisleri açtılar ve tarafıma erişim yetkisi verdiler. Ben ise daha önce web servislerle hiç çalışmadım. ChatGBT ile bir yere kadar ilerleyebildim. Form üzerine koyduğum komponentleri hiç kullanmadım, zaten sonradan bu iş için komponent olduğunu farkettim. Deneme projesi Delphi 7 ile yazılmıştır. Yazıldı demek yanlış olur, çünkü çalışmıyor. Kendi uğraşımı, ekran görüntülerini, açıklamaları zipleyerek ek olarak bırakıyorum. Web servis mantığını anlayabileceğim şekilde yardımcı olursanız sevinirim. Yani WSDL nasıl okunur, hangi function okumak, hangisi yazmak içindir, bunlar nasıl kullanılır. Yardımcı olursanız sevinirim. Şimdiden teşekkürler.


Ek Dosyalar
.zip   DelphiCan.zip (Dosya Boyutu: 1,45 MB / İndirme Sayısı: 28)
Cevapla
#2
ilk olarak bilgisayarınıza SOAPUI 'yi kurun (ggogla aratın çıkar) size ilk olarak bir WSDL linki vermeleri lazım. Bu linki SoapUI'ye girin size örnek bir XML çıkartır. Bu XML'in içine veri girerek SoapUI ile WEB servis üzerinden veri gönderip cevap alabilirsiniz.

Sonraki aşamada SoapUI'nin oluşturduğu XML dosyasını Delphi7 ile gönderip cevap alabilirsiniz. Bunun için D7'deki WebService sekmesindeki HTTPReqResp bileşenini kullanabilirsiniz.
Cevapla
#3
(21-01-2025, Saat: 23:54)enigma Adlı Kullanıcıdan Alıntı: ilk olarak bilgisayarınıza SOAPUI 'yi kurun (ggogla aratın çıkar) size ilk olarak bir WSDL linki vermeleri lazım. Bu linki SoapUI'ye girin size örnek bir XML çıkartır. Bu XML'in içine veri girerek SoapUI ile WEB servis üzerinden veri gönderip cevap alabilirsiniz.

Sonraki aşamada SoapUI'nin oluşturduğu XML dosyasını Delphi7 ile gönderip cevap alabilirsiniz. Bunun için D7'deki WebService sekmesindeki HTTPReqResp bileşenini kullanabilirsiniz.


SOAPUI'yi kurdum, hatta zip dosyasının içinde ekran görüntüsünü de atmıştım. Bu programda web servise ürün kodu gönderip, gelen cevapları görüyorum, bunun da ekran görüntüsünü atmıştım. Delphi, WSDL importer ile bana bir .pas dosyası verdi. İşte ben bu dosyanın içindeki fonksiyonları, gönderme ve almaları nasıl yapacağımı bilmiyorum. Daha şimdi, ChatGPT'ye tekrar soruyordum, "delphi 7'de web servis kullanımı için SoapConnection, HTTPRIO, HTTPReqResp kullanılabilir mi?" diye sohbete başlamıştık. İnternette incelediğim örneklerden benim web servise benzeyen bulamadım. Programcı da değilim, bütün bu yazdıklarıma bakınca nasıl kullanacağımı bilemiyorum. Eklediğim dosyaya bakıp, nerede nasıl yapacağıma dair küçük de olsa yardımcı olursanız sevinirim.
Cevapla
#4
Delphi7'de WDSL import edemezsiniz. Bu kısım doğru çalışmıyor. Ancak D10 ve üzerinde çalışıyor. Bu yüzden aşağıdaki örnekteki gibi gönder al yapıp, gelen XML dosyasını kendiniz işleyeceksiniz. Bunun için SoapUI üzerinden gönderdiğiniz XML dosyasının içini doldurup işlem yapmanız gerekiyor.

mmo1.Lines.Clear;
mmo1.lines.add('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"');
mmo1.lines.add('xmlns:wsdl="http://schemas.i2i.com/ei/wsdl">');
mmo1.lines.add(' <soapenv:Header/>');
mmo1.lines.add(' <soapenv:Body>');
mmo1.lines.add(' <wsdl:CheckUserRequest>');
mmo1.lines.add(' <REQUEST_HEADER>');
mmo1.lines.add(' <SESSION_ID>'+session+'</SESSION_ID>');
mmo1.lines.add(' <REASON>SORGU</REASON>');
mmo1.lines.add(' <APPLICATION_NAME>HAL</APPLICATION_NAME>');
mmo1.lines.add(' <HOSTNAME>izibiz</HOSTNAME>');
mmo1.lines.add(' <CHANNEL_NAME>izibiz</CHANNEL_NAME>');
mmo1.lines.add(' <SIMULATION_FLAG>0</SIMULATION_FLAG>');
mmo1.lines.add(' <COMPRESSED>N</COMPRESSED>');
mmo1.lines.add(' <ATTRIBUTES NAME="?">');
mmo1.lines.add(' </ATTRIBUTES>');
mmo1.lines.add(' </REQUEST_HEADER>');
mmo1.lines.add(' <USER>');
mmo1.lines.add(' <IDENTIFIER>'+VNo+'</IDENTIFIER>');
mmo1.lines.add(' </USER>');
mmo1.lines.add(' </wsdl:CheckUserRequest>');
mmo1.lines.add(' </soapenv:Body>');
mmo1.lines.add('</soapenv:Envelope>');
stream := TMemoryStream.Create;
SOAP := 'http://schemas.i2i.com/ei/wsdl/EFaturaOIBPort/CheckUserRequest';
MyURL := EFaturaURL;
try
HTTPReqResp1.InvokeOptions := [soIgnoreInvalidCerts];
HTTPReqresp1.URL := MyURL;
HTTPReqResp1.UseUTF8InHeader := true;
HTTPReqResp1.SoapAction := Soap;
HTTPReqResp1.UserName := EFatuser;
HTTPReqresp1.Password := EFatpasw;
HTTPReqresp1.Execute(Mmo1.Text,Stream); // burada oluşturduğumuz xml i post ediyoruz. cevap Stream içinde dönecek
Strstream := Tstringstream.Create(s);
try
Strstream.CopyFrom(stream, 0);
mmo2.Text := xmlDoc.FormatXMLData(UTF8Decode(StrStream.DataString)); //Strstream.DataString; // gelen cevabı memo içinde görebilirsin.
finally strstream.Free;
end;
finally stream. Destroy;
end;
mmo2.Lines.SaveToFile('CheckUser.xml');
Cevapla
#5
Delphi 7 icinde yer alan wsldimport.exe'nin guncellenmis bir vesiyonu olmasi lazim: https://cc.embarcadero.com/Item/24535

Tam emin degilim ama parcalara ayrilmis wsdl'i import edemiyordu galiba, ege oyle bir hata alirsaniz, once wsdl'i tek bir dosya haline getirin: https://github.com/lenardg/WSDLMerge
Cevapla
#6
(22-01-2025, Saat: 11:52)mkysoft Adlı Kullanıcıdan Alıntı: Delphi 7 icinde yer alan wsldimport.exe'nin guncellenmis bir vesiyonu olmasi lazim: https://cc.embarcadero.com/Item/24535

Tam emin degilim ama parcalara ayrilmis wsdl'i import edemiyordu galiba, ege oyle bir hata alirsaniz, once wsdl'i tek bir dosya haline getirin: https://github.com/lenardg/WSDLMerge

Bir çok serviste single özelliği de bulunur. Parçalanmış wsdli import edemediğinde (ki ben yıllar önce ws leri delphide yazarken edemiyordu.) ....?wsdl yerine ...?singleWsdl yazdığınızda tek parça olarak getiriyor o zaman import edebiliyorsunuz. bu özellik her serviste olmuyordu olmadığında da tek tek oluşturmam gerekiyordu.
WWW
Cevapla
#7
@enigma yardımın için çok teşekkürler. Senin bu cevabın ve daha önce benzer konuda ( https://www.delphican.com/showthread.php?tid=5900 ) yazdığın kodlar sayesinde hatanın Delphi 7'nin WSDL importeri'nin yanlış başlıklar göndermesi olduğunu anladım. Senin burada yukarıdaki cevabın sayesinde SOAPUI'nin test yaparken oluşturduğu XML dosyasını , yine linkini verdiğim diğer cevabındakilerle birlikte kullanarak HTTPReqResp1 componenti le hiç olmazsa Ürün Kodu gönderip gelen sonuçları yine XML'den parse edip, okuyup bir ClientDataSet'e aktarabildim. Aslında direkt web servis içindeki servisi (maddeler_Servisi) ve o servis cevabından dönen sonuçları (maddeler.No, Maddeler.Description, Maddeler.DigerSonuc gibi) kullanmak isterdim ama olmadı.

Web Servis konusunda SOAPUI gibi harici programlarla çalışmanın önemi burada ortaya çıkıyor. Bu konu ile ilgili örnek olarak şunu verebilirim : SOAPUI ile gönderdiğim test sorgusunda dönen XML şöyle:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mad="urn:microsoft-dynamics-schemas/page/maddeler">
<soapenv:Header/>
<soapenv:Body>
<mad:Read>
<mad:No>HF09.23.19.0563</mad:No>
</mad:Read>
</soapenv:Body>
</soapenv:Envelope>

ama Delphi'nin HTTPRIO komponentinin SOAPRequest sonucu :

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<NS1:Read xmlns:NS1="urn:microsoft-dynamics-schemas/page/maddeler">
<No xsi:type="xsd:string"></No>
</NS1:Read>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

No alanına Edit1.Text değerini atamama rağmen bir şekilde boş gitmiş, ben de boşu boşuna uğraşıp, web servisten gelen hata mesajlarını çözmeye çalışmışım.

Bir de şunu farkettim; Delphi 7'de New-Web Services- WSDL İmporter yaparak web servis adresini yazıp .pas dosyasını oluştururken, Options kısmından Code Generation ve Other Options seçeneklerinin tamamını işaretlememek gerekiyor. Oluşan .pas dosyaya lüzumsuz çok fazla satır dolduruyor, boğulup kalıyorsunuz. Gereksiz seçenekleri deneme-yanılma yöntemiyle teker teker kaldırmak en iyi yöntem imiş.

Bu daha ilk web servis okuma çalışmam. Diğer web servislerde Read yanında create, Create Multiple, Update ve Delete fonksiyonları/özellikleri olduğunu görüyorum. Özellikle @enigma senden ricam RequestRespons kullanarak okuduğumuz gibi nasıl kayıt ve güncelleme yapıyorsun, veya bunun için hangi yolları kullanıyorsun, bu konuda da (mümkünse örnek kodlarla) yardımcı olursan sevinirim. Senin 2 satır cevabın ufkumu açtı diyebilirim.

Yorum yazan ve yardımcı olmaya çalışan diğer arkadaşlara da teşekkür ederim. @mkysoft 'un belirttiği wsldimport.exe'nin güncellenmis versiyonunu malum sebeplerden indiremedim, ama internette arayacağım.
Konu henüz kapanmadı, yazma ve güncelleme konusunda da yaşadıklarımı yazacağım buraya.
Cevapla
#8
(23-01-2025, Saat: 12:40)Patriot Adlı Kullanıcıdan Alıntı: @enigma  yardımın için çok teşekkürler. Senin bu cevabın ve daha önce benzer konuda ( https://www.delphican.com/showthread.php?tid=5900 ) yazdığın kodlar sayesinde hatanın Delphi 7'nin WSDL importeri'nin yanlış başlıklar göndermesi olduğunu anladım. Senin burada yukarıdaki cevabın sayesinde SOAPUI'nin test yaparken oluşturduğu XML dosyasını , yine linkini verdiğim diğer cevabındakilerle birlikte kullanarak  HTTPReqResp1 componenti le hiç olmazsa Ürün Kodu gönderip gelen sonuçları yine XML'den parse edip, okuyup bir ClientDataSet'e aktarabildim. Aslında direkt web servis içindeki servisi (maddeler_Servisi) ve o servis cevabından dönen sonuçları (maddeler.No, Maddeler.Description, Maddeler.DigerSonuc gibi) kullanmak isterdim ama olmadı.

Web Servis konusunda SOAPUI gibi harici programlarla çalışmanın önemi burada ortaya çıkıyor. Bu konu ile ilgili örnek olarak şunu verebilirim : SOAPUI ile gönderdiğim test sorgusunda dönen XML şöyle:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mad="urn:microsoft-dynamics-schemas/page/maddeler">
  <soapenv:Header/>
  <soapenv:Body>
     <mad:Read>
        <mad:No>HF09.23.19.0563</mad:No>
     </mad:Read>
  </soapenv:Body>
</soapenv:Envelope>

ama Delphi'nin HTTPRIO komponentinin SOAPRequest sonucu :

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<NS1:Read xmlns:NS1="urn:microsoft-dynamics-schemas/page/maddeler">
<No xsi:type="xsd:string"></No>
</NS1:Read>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

No alanına Edit1.Text değerini atamama rağmen bir şekilde boş gitmiş, ben de boşu boşuna uğraşıp, web servisten gelen hata mesajlarını çözmeye çalışmışım.

Bir de şunu farkettim; Delphi 7'de New-Web Services- WSDL İmporter yaparak web servis adresini yazıp .pas dosyasını oluştururken, Options kısmından Code Generation ve Other Options seçeneklerinin tamamını işaretlememek gerekiyor. Oluşan .pas dosyaya lüzumsuz çok fazla satır dolduruyor, boğulup kalıyorsunuz. Gereksiz seçenekleri deneme-yanılma yöntemiyle teker teker kaldırmak en iyi yöntem imiş.

Bu daha ilk web servis okuma çalışmam. Diğer web servislerde Read yanında create, Create Multiple, Update ve Delete fonksiyonları/özellikleri olduğunu görüyorum. Özellikle @enigma senden ricam RequestRespons kullanarak okuduğumuz gibi nasıl kayıt ve güncelleme yapıyorsun, veya bunun için hangi yolları kullanıyorsun, bu konuda da (mümkünse örnek kodlarla) yardımcı olursan sevinirim. Senin 2 satır cevabın ufkumu açtı diyebilirim.

Yorum yazan ve yardımcı olmaya çalışan diğer arkadaşlara da teşekkür ederim. @mkysoft 'un belirttiği wsldimport.exe'nin güncellenmis versiyonunu malum sebeplerden indiremedim, ama internette arayacağım.
Konu henüz kapanmadı, yazma ve güncelleme konusunda da yaşadıklarımı yazacağım buraya.
Delphi7'de XML işleri biraz kısıtlı. Delphi 11 yada 12 ile daha esnek çalışabilirsiniz. Gelen verinin otomatik parse edilmesi gib kolaylıklar var. Ancak D7'de basit uygulamalarda gelen XML cevabı kendim analiz edip, ayıklayıp kullanıyorum.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Rest servis api uygulaması yapma tuna 13 1.346 17-10-2025, Saat: 18:40
Son Yorum: tuna
  Edge Browser Hakkında Yardım. glagher 6 3.271 14-06-2025, Saat: 23:40
Son Yorum: maxpaynen
  Modern Servis Uygulama İskeleti Tuğrul HELVACI 22 24.674 02-05-2025, Saat: 14:30
Son Yorum: bakyuz
  Open cv Yardım woywod 0 430 30-12-2024, Saat: 01:50
Son Yorum: woywod
  Buton Oluşturma Konusunda Yardım İhtiyacı cemakkus 31 8.256 27-09-2024, Saat: 21:00
Son Yorum: cemakkus



Konuyu Okuyanlar: 1 Ziyaretçi