Web Servisinden veri okuma SOAP

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

Arkadaşlar merhaba, forumu uzuuun uzun araştırdım bu konu ile ama sıkıntıma bir çözüm bulamadığım için yeni konu açıyorum. Daha önce hiç webservisleriyle çalışmadım o yüzden sıfır bilgim vardı netten baka baka birşeyler yaptım ama bir yerde takıldım.

bir web servisinden veri okuyorum. WSDL in ne olduğunu öğrendim import ettim ve (elimde gerekli dokümanda var) dokümanımda belirtilen fonksiyonların hepsini gördüm, bu verileri "Servis.pas" diye kaydettim. sonuçta bana servis pas dosyasında şöyle bir yapı oluşturdu

Kod: Tümünü seç


  MGWR1Result = class(TRemotable)
  private
  published
  end;

  ServiceSoap = interface(IInvokable)
  ['{C3236F57-64E7-B9D2-7776-2B908EA4F943}']
    function  Register_(const UserName: WideString; const Password: WideString; const Application_: WideString): WideString; stdcall;
    function  MGW1(const aa1: WideString; const ab1: WideString; const ac1: WideString; const ad1: WideString; const ae1: WideString; const af1: WideString;
                   const ag1: WideString): MGW1Result; stdcall;
  end;

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

burda bir sürü fonksiyon var ben sadece iki tanesini yazdım. Neyse bunu nasıl kullanacağımı kurcalaya kurcalaya öğrenmeye çalışıyorum. şunu yaptım ve çalıştı.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var DummyService: ServiceSoap;
result_string: WideString;
Begin  
DummyService := GetServiceSoap(true, '');
  result_string := DummyService.Register_('abc','abcde','test');
  memo1.Lines.Add(result_string );
End;
bu register_ fonksiyonu string döndürdüğü için problem olmadı gelen değeri direk okuyabildim ve doğru sonuç verdi. yalnız bundan sonraki bütün fonksiyonlar TRemotable dan türemiş classları döndürüyor, örneğin burda yazdığım örnek MGW1 fonksiyonu MGW1Result diye bir tip döndürüyor gördüğünüz üzere. Bundan sonra şöyle bir kod yazdım

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var DummyService: ServiceSoap;
      result_string   : WideString;
     result_var        :MGW1Result;
Begin  
DummyService := GetServiceSoap(true, '');

 result_var := DummyService.MGW1('abc','abcs', '2009-07-20', '2009-07-21','','','');

işte bu noktadan sonra ne yapacağımı bir türlü bulamadım. Şöyle ki, DummyService.MGW1 fonksiyonunun çalıştığını biliyorum zira tarihi hatalı formatta verdim, karşıdan hata döndü hatalı format diye, düzgün formatı vreince verilerin geldiği belli olacak şekilde bekliyor sistem, veri çekiyor yani ve result_var değişkenine atıyor bunları. Fakat ben bu veriyi bu result_var 'ın içinden nasıl alacağımı bilmiyorum...

normal bir componentten farklı olarak 4 tane ek özelliği var, function ObjectToSoap, Procedure SoapToObject, Widestring DataContext, TSerializationOptions SerializationOptions... bunları kullanarak bu veriyi nasıl alacağımı bilmiyorum. elimdeki dokümana göre

Kod: Tümünü seç

<DataTableGW1 diffgr:id="DataTableGW11" msdata:rowOrder="0">
<AA1>148739</AA1>
<AB1>2008-05-23T11:10:17+03:00</AB1>
<AD1>34 TEST 34</AD1>
<AE1>Timed Event</AE1>
<AF1>13.787999153137207</AF1>
<AG1>30.3844051361084</AG1>
<AH1>40.713321685791016</AH1>
<AI1>41.610000610351562</AI1>
<AJ1>8</AJ1>
<AK1>2.7019999027252197</AK1>
<AL1>Türkiye</AL1>
<AM1>SAKARYA</AM1>
<AN1>MERKEZ</AN1>
<AO1>Arifbey</AO1>
<AR1>222.53999328613281</AR1>
<AW1>test</AW1>
<TM1>2008-05-23T11:10:17+03:00</TM1>
<MU1>234496</MU1>
<AY1>35</AY1>
</DataTableGW1>
şeklinde birşey dönmesi Lazım, ben ne yapacağımı bir türlü anlamdım. yardımcı olursanız ya da en azından yol gösterirseniz çok sevinirim.
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

arkadaşlar yardımcı olabilecek yok mu
Kullanıcı avatarı
doctorfunks
Üye
Mesajlar: 105
Kayıt: 26 Oca 2005 10:37
Konum: İstanbul

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen doctorfunks »

selam

bende çok anlamıyorum fakat...
sizin şu kısımda benim aşağıdaki örnek gibi bişeyler yapıp dönen değeri okuyabilirsiniz heralde ;

MGWR1Result = class(TRemotable)
private
published
end;


UploadOrderResult = class(TRemotable)
private
Fschema: WideString;
published
property schema: WideString read Fschema write Fschema;
end;
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

selam dostum, teşekkürler cevap için ama benim fonksiyonum MGWR1Result tipinde bir değer döndürüyor, içine property eklemeyi denedim ama veriyi o şekilde içine almıyor
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

bu çıktı olarak gelecek şeyi propertyler halinde falan mı yazmam gerekiyor acaba o dönen tipin içine... ?
Kullanıcı avatarı
doctorfunks
Üye
Mesajlar: 105
Kayıt: 26 Oca 2005 10:37
Konum: İstanbul

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen doctorfunks »

aşağıdaki linkte verilen örnek işinizi görebilir;

http://www.agnisoft.com/white_papers/soap1.asp
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

@doctorfunks üstadım hayat kurtardın :) evet kesinlikle tam aradığım şey bu. tamamını yapmadım işimin ama kesinlikle işimi görecek. çok teşekkür ederim gerçekten :)
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

xml olarak veriyi aldım ama bir türlü gridde gösteremiyorum yani, client dataset e atıp ordan okuyamıyorum. sanırım bu da xml'imin yapısından kaynaklanıyor. basitçe şu şekilde başlıyor xml

Kod: Tümünü seç

<soap:Envelope>
  <soap:Body>
    <MGW1Response>
      <MGW1Result>
       <xs:schema id="DataSetGW" targetNamespace="http://tempuri.org/DataSetGW.xsd" attributeFormDefault="qualified" elementFormDefault="qualified">
          <xs:element name="DataSetGW" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msdata:EnforceConstraints="False">
             <xs:complexType>
               <xs:choice minOccurs="0" maxOccurs="unbounded">
                 <xs:element name="DataTableGW1">
                    <xs:complexType>
                      <xs:sequence>
                         <xs:element name="AA1" minOccurs="0">
                             <xs:simpleType>
                               <xs:restriction base="xs:string">
                                    <xs:maxLength value="20"/>
                              </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
....
şeklinde kodlar var xml in başında sanırım schema tanımları bu oluyor ama bunun ne olduğunu tam bilmediğim için kalıyorum bu noktada aynı şekilde gelen veri bloğumda şu şekilde, yani yukardaki uuzuuun schema tanımlarından sonra veriler şu blok yapısında gelmeye başlıyor

Kod: Tümünü seç

<diffgr:diffgram>
  <DataSetGW>
    <DataTableGW1 diffgr:id="DataTableGW11" msdata:rowOrder="0">
      <AA1>124407</AA1>
      <AB1>2009-07-22T15:40:30+03:00</AB1>
      <AD1>AA 99 BB</AD1>
      <AE1>Idle Speed Start</AE1>
      <AF1>0</AF1>
      <AG1>29.339876174926758</AG1>
      <AH1>40.908920288085938</AH1>
      <AI1>125.47999572753906</AI1>
      <AJ1>9</AJ1>
      <AK1>0</AK1>
      <AL1>Türkiye</AL1>
      <AM1>İSTANBUL</AM1>
      <AN1>TUZLA</AN1>
      <AO1>Merkez</AO1>
      <AP1>ttt-Orhanlı Yolu</AP1>
      <AR1>107002.3984375</AR1>
      <AW1>yyyy</AW1>
      <MU1>167426</MU1>
      <AY1>35</AY1>
    </DataTableGW1>
xmlmapper la da baktığımda yani map edip transaction yarat dedikten sonra test düğmesine bastığımda veriler görünmüyor... hre gelen veri bloğumun başında ki " diffgr:id="DataTableGW11" msdata:rowOrder="0"" kısımlarını kaldırıp deneme bir xml dosyası yaptım gayet düzgün gösterdi verileri. sebebi ne olabilir?
AraGorN
Üye
Mesajlar: 28
Kayıt: 30 Eyl 2003 02:02
Konum: Bornova - İzmir
İletişim:

Re: Web Servisinden veri okuma SOAP

Mesaj gönderen AraGorN »

sanırım sorunumu çözdüm şimdi verileri okuyabiliyorum, sorun xmlmapper da oluşan dosyanın bir bug ıymış saırım. dosyanın başında ki

<XmlTransformation Version="1.0"><Transform Direction="ToCds" DataEncoding="utf-8"><SelectEach dest="DATAPACKET\ROWDATA\ROW" from="\soap:Envelope\soap:Body\MGW1Response\MGW1Result\diffgr:diffgram\DataSetGW\DataTableGW1">

ifadesin deki "from="\soap:Envelope\soap:Body\MGW...." kısmındaki ilk soap ı silmek gerekiyormuş... yani şöyle olacakmış....

<XmlTransformation Version="1.0"><Transform Direction="ToCds" DataEncoding="utf-8"><SelectEach dest="DATAPACKET\ROWDATA\ROW" from="\Envelope\soap:Body\MGW1Response\MGW1Result\diffgr:diffgram\DataSetGW\DataTableGW1">

yardımcı olan herkese teşekkür ederim.
Cevapla