AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke HILFE! SOAP-Client für document literal Webservice!?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von RuX · begonnen am 26. Okt 2007 · letzter Beitrag vom 10. Mai 2014
Antwort Antwort
RuX

Registriert seit: 21. Jul 2004
Ort: Nürnberg
115 Beiträge
 
Delphi 7 Architect
 
#1

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

  Alt 26. Okt 2007, 13:59
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.
Delphi3/Delphi5/Delphi7/Delphi8 User
  Mit Zitat antworten Zitat
RuX

Registriert seit: 21. Jul 2004
Ort: Nürnberg
115 Beiträge
 
Delphi 7 Architect
 
#2

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

  Alt 30. Okt 2007, 08:37
hat keiner ne Idee?
Delphi3/Delphi5/Delphi7/Delphi8 User
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#3

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

  Alt 9. Mai 2014, 15:51
Hallo

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

LG
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#4

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

  Alt 10. Mai 2014, 10:44

Ich stehe heute exakt vor dem gleichen Problem.
In der akzeptierten Antwort in http://stackoverflow.com/a/2484722/80901 wird angegeben soLiteralParams in 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.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 10. Mai 2014, 11:07
Würde der Funktionsaufruf den mit D2007 funktionieren?
AFAIK waren die uralten Delphi Implementierung (D6/7) alles andere als ein Quell von Kompatibilität.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 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