Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webservice-Client: Parameter werden nicht übergeben (https://www.delphipraxis.net/145887-webservice-client-parameter-werden-nicht-uebergeben.html)

TheJeed 10. Jan 2010 03:24


Webservice-Client: Parameter werden nicht übergeben
 
Hallo zusammen!

Ich arbeite gerade an einem Java-Webservice mit Delphi-Client. Serverseitig bietet der WS eine Function an, die zwei Strings als Parameter entgegennimmt und ein komplexes Objekt zurückgibt. Als ich die Function über Delphi ohne relevante Parameter testete stellte ich fest, dass es keine Probleme mit dem Rückgabetyp gab, was ich am ehesten erwartete. Delphi rockt!

Nun, wo ich mit dem Delphi-clientseitigen Aufruf aber die beiden Strings übergeben möchte, kommen diese aber nicht an, sondern nur 2x'null'. Ich bin nun einigermaßen ratlos. Habt Ihr vielleicht Ideen?

Mein Webservice läuft auf Tomcat 6.0.20 / J2EE 5.

Die angesprochene Function ist wie folgt definiert:
Delphi-Quellcode:
   /**
     * Web service operation
     */
    @WebMethod(operationName = "doLogin")
    public LoginRecord doLogin(@WebParam(name = "login")String login, @WebParam(name = "pwdHash") String pwdHash)
Der Delphi Aufruf erfolgt ganz einfach über
Delphi-Quellcode:
s.doLogin('name','passswordhash');
Mein Verdacht ist, dass ich mit den übergebenen Strings vielleicht noch irgendwas anstellen muss. Für Ratschläge wäre ich sehr dankbar :)

Astat 10. Jan 2010 04:20

Re: Webservice-Client: Parameter werden nicht übergeben
 
Zitat:

Zitat von TheJeed
Mein Verdacht ist, dass ich mit den übergebenen Strings vielleicht noch irgendwas anstellen muss. Für Ratschläge wäre ich sehr dankbar :)

Hallo TheJeed, schau dir mal an was übers Netzwerk transportiert wird (Paketizer), oder verwende einen Proxy (PuTTY).
Die XML Dinger lassen sich sehr schön mitlesen.
Da Du Delphi 2009 verwendest, sind die von Dir definierten Strings Unicode, verwende WideStrings oder AsiStrings.


lg. Astat

mjustin 10. Jan 2010 11:14

Re: Webservice-Client: Parameter werden nicht übergeben
 
Zitat:

Zitat von TheJeed
Nun, wo ich mit dem Delphi-clientseitigen Aufruf aber die beiden Strings übergeben möchte, kommen diese aber nicht an, sondern nur 2x'null'.

Ja, Delphi läßt einen im SOAP Bereich oft im Dunkeln :)

Ich habe einen Service mit NetBeans 6.8 geschrieben und den Client in Delphi 2009, und kann das Problem auch schon für den einfachsten Fall (kein komplexes Objekt als Rückgabe) nachvollziehen.

Der SoapTester in NetBeans zeigt diesen korrekt funktionierenden SOAP Request:

Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Header/>
    <S:Body>
        <ns2:login xmlns:ns2="http://betabeans.de/">
            <login>a</login>
            <pwd>b</pwd>
        </ns2:login>
    </S:Body>
</S:Envelope>
Delphi sendet etwas anderes:
Delphi-Quellcode:
<?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">
  <SOAP-ENV:Body>
    <login xmlns="http://betabeans.de/">
      <login>a</login>
      <pwd>b</pwd>
    </login>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Nach Korrektur (siehe unten) funktioniert es in Delphi:
Delphi-Quellcode:
<?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:login xmlns:NS1="http://betabeans.de/">
      <login xsi:type="xsd:string">a</login>
      <pwd xsi:type="xsd:string">b</pwd>
    </NS1:login>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Ich musste dazu nur

Delphi-Quellcode:
InvRegistry.RegisterInvokeOptions(TypeInfo(NewWebService), ioDocument);
ändern in

Delphi-Quellcode:
InvRegistry.RegisterInvokeOptions(TypeInfo(NewWebService), ioDefault);

Cheers,

Keldorn 10. Jan 2010 11:18

Re: Webservice-Client: Parameter werden nicht übergeben
 
Zitat:

InvRegistry.RegisterInvokeOptions(TypeInfo(NewWebS ervice), ioDefault);
kannst Du erklären, warum es dann damit geht ?
Das problem habe ich auch öfters, daß bei der Übergabe von Strings das xsd mit dazu geschrieben wird.
Bisher habe ich mir immer damit geholfen, daß ich die XML-Übermittlung im onbeforeexecute selber geändert habe, muß ich dann gleichmal probieren :-)

Gruß Frank

mjustin 10. Jan 2010 11:38

Re: Webservice-Client: Parameter werden nicht übergeben
 
Zitat:

Zitat von Keldorn
Zitat:

InvRegistry.RegisterInvokeOptions(TypeInfo(NewWebS ervice), ioDefault);
kannst Du erklären, warum es dann damit geht ?
Das problem habe ich auch öfters, daß bei der Übergabe von Strings das xsd mit dazu geschrieben wird.
Bisher habe ich mir immer damit geholfen, daß ich die XML-Übermittlung im onbeforeexecute selber geändert habe, muß ich dann gleichmal probieren :-)

Gruß Frank

Trial and error :(

In der WSDL steht ja

Delphi-Quellcode:
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
Dass Delphi daraus folgert

Delphi-Quellcode:
InvRegistry.RegisterInvokeOptions(TypeInfo(NewWebService), ioDocument);
nehmen zu müssen klingt vernünftig. Warum es damit dann aber nicht funktioniert sondern nur mit ioDefault, ist schon seltsam.

Ich freue mich auf den ersten Februar, dann gibt es den "Sun Certified Developer for Java Web Services" Study Guide. Dass Delphi sich mit SOAP so schwer tut (sobald andere Plattformen angesprochen werden müssen), ist schade. Vermutlich gibt es zu wenig Entwickler, die damit in größerem Rahmen cross-platform arbeiten wollen. Oder sie setzen andere SOAP Libraries ein, die besser sind als die in Delphi enthaltene?

Viele Grüße,

TheJeed 10. Jan 2010 11:48

Re: Webservice-Client: Parameter werden nicht übergeben
 
Danke für Eure Tipps. Der Hinweis von mjustin hat Abhilfe geschaffen(btw: schön, mal einen Netbeans-Benutzer zu treffen :cheers: ).

(Zwischenzeitlich beantwortet: Allerdings würde mich ebenfalls interessieren, warum das so funktioniert.)

Was gibts denn an alternativen SOAP-Implementierungen für Delphi, auf denen man aufsetzen könnte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz