Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   HILFE! SOAP-Client für document literal Webservice!? (https://www.delphipraxis.net/102309-hilfe-soap-client-fuer-document-literal-webservice.html)

RuX 26. Okt 2007 13:59


HILFE! SOAP-Client für document literal Webservice!?
 
Hallo, vielleicht könnt ihr mir ja noch helfen? Bin langsam ratlos...
Ich probier gerade einen SOAP-Client für einen Webservice hinzukriegen der mit document/literal Encoding arbeitet.
Der Webservice hat nur eine einzige Funktion der man ein WideString (XML) übergeben kann und die mir auch wieder einen WideString (XML) zurückliefert.

Die Webservice Client Unit hab ich durch den WSDLImport generiert (WSDL und generierte Unit siehe unten).
Ich arbeite mit Delphi 7 und weiß dass man für document/literal Support einen Patch installieren muss was ich auch getan habe.

Folgende Exception beim aufrufen der Funktion:

Delphi-Quellcode:
  End tag 'body' does not match the start tag 'HR'.
  Linie: 1
  <html><head><title>Apache Tomcat/5.5.15
Was soviel bedeutet ich krieg den HTML(!)-Text der WebService-URL zurück als wenn man sie im Browser aufrufen würde plus (ich vermute mal) irgendein Parser-Fehler.

Von rpc/encoded bin ich gewöhnt NICHTS an der generierten Unit anfassen zu müssen und es funktioniert. Es erscheint mir alledings schon komisch dass nirgends in der Unit auf document/literal eingegangen wird. Deswegen habe ich selber mal probiert durch verschiedenste Kombinationen von
Delphi-Quellcode:
initialization
  InvRegistry.RegisterInvokeOptions(TypeInfo(SoapPort), ioLiteral);
und/oder
  InvRegistry.RegisterInvokeOptions(TypeInfo(SoapPort), ioDocument);
oder
Delphi-Quellcode:
  RIO.Converter.Options := RIO.Converter.Options + [SoDocument];
und/oder
  RIO.Converter.Options := RIO.Converter.Options + [soLiteralParams];
irgendwas zu bewegen.
Hat leider alles nicht geklappt.

Was mach ich falsch? :(

die wsdl schaut folgendermaßen aus:
Kann bitte jemand mit D2007 das für mich importieren und schauen ob das gleiche rauskommt?
Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2">
   <wsdl:types/>
   <wsdl:service name="ContractSqlSoap">
      <wsdl:port name="SOAPEventSource" binding="tns:SOAPEventSourceBinding">
         <soap:address location="https://url:12345/abc/ContractService"/>
      </wsdl:port>
   </wsdl:service>
   <wsdl:portType name="SoapPort">
      <wsdl:operation name="SendMessage">
         <wsdl:input message="tns:SendMessage"/>
         <wsdl:output message="tns:SendMessageResponse"/>
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="SOAPEventSourceBinding" type="tns:SoapPort">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="SendMessage">
         <soap:operation style="document" soapAction="/abc/ContractService" soapActionRequired="true"/>
         <wsdl:input>
            <soap:body use="literal" parts="XMLInput"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal" parts="Result"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:message name="SendMessage">
      <wsdl:part name="XMLInput" type="xs:string"/>
   </wsdl:message>
   <wsdl:message name="SendMessageResponse">
      <wsdl:part name="Result" type="xs:string"/>
   </wsdl:message>
</wsdl:definitions>
die generierte unit:
Delphi-Quellcode:
// ************************************************************************ //
// Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus
// unten beschriebener WSDL-Datei stammen:
// WSDL    : W:\abc\meine.wsdl
// Codierung : UTF-8
// Version : 1.0
// (26.10.2007 14:49:12 - 1.33.2.5)
// ************************************************************************ //

unit meine;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei
  // nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen,
  // aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie
  // sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen
  // für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..
  // ************************************************************************ //
  // !:string         - "http://www.w3.org/2001/XMLSchema"


  // ************************************************************************ //
  // Namespace : [url]http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2[/url]
  // Bindung  : SOAPEventSourceBinding
  // Service  : ContractSqlSoap
  // Port     : SOAPEventSource
  // ************************************************************************ //
  SoapPort = interface(IInvokable)
  ['{D5E57539-5BA3-BF46-0EEF-979D83C3A6CE}']
    function SendMessage(const XMLInput: WideString): WideString; stdcall;
  end;

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


implementation

function GetSoapPort(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SoapPort;
const
  defWSDL = 'W:\abc\meine.wsdl';
  defURL = '';
  defSvc = 'ContractSqlSoap';
  defPrt = 'SOAPEventSource';
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 SoapPort);
    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(SoapPort), 'http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SoapPort), '');

end.

RuX 30. Okt 2007 08:37

Re: HILFE! SOAP-Client für document literal Webservice!?
 
hat keiner ne Idee?

cherry 9. Mai 2014 15:51

AW: HILFE! SOAP-Client für document literal Webservice!?
 
Hallo

Ich stehe heute exakt vor dem gleichen Problem. Hast du damals eine Lösung gefunden ?

LG

mjustin 10. Mai 2014 10:44

AW: HILFE! SOAP-Client für document literal Webservice!?
 
Zitat:

Zitat von cherry (Beitrag 1258449)

Ich stehe heute exakt vor dem gleichen Problem.

In der akzeptierten Antwort in http://stackoverflow.com/a/2484722/80901 wird angegeben
Delphi-Quellcode:
soLiteralParams
in
Delphi-Quellcode:
THttpRio.Converter.Options
zu setzen, dann verwendet der Delphi SOAP Client den Document/Literal/Wrapped Standard.

"Notfalls" kann man auch das Free Pascal Web Services Toolkit einsetzen, es ist Delphi kompatibel und diese Tage in Version 0.6 erschienen.

Bernhard Geyer 10. Mai 2014 11:07

AW: HILFE! SOAP-Client für document literal Webservice!?
 
Würde der Funktionsaufruf den mit D2007 funktionieren?
AFAIK waren die uralten Delphi Implementierung (D6/7) alles andere als ein Quell von Kompatibilität.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:56 Uhr.

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