Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SOAP Problem (https://www.delphipraxis.net/178831-soap-problem.html)

hungrycoder 30. Jan 2014 12:52

SOAP Problem
 
Hallo Leute,
versuche mich gerade mit QAddress. Vielleicht kennt ja einer von euch den Service. Mein Problem ist, dass ich kein Response bekomme. Versuche seit gestern irgendwelche Einstellungen und Möglichkeiten zu finden, dass es doch funktioniert, klappt nur irgendwie nicht.

Delphi-Quellcode:
var checks : UCheckAddressSimple;
    results : UCheckAddressSimpleResponse;
begin
  try
    checks := UCheckAddressSimple.Create;
    checks.UserName := 'test';
    checks.UserPassword := 'test';
    checks.Tolerance := 1;
    checks.Country := 'DE';
    checks.ZIP := '41252';
    checks.City := 'Sp';
    checks.Street := 'Eugen-Bolz-Straße';
    results := UCheckAddressSimpleResponse.Create;
    results := (HTTPRIO1 as QACWebServiceSoap).UCheckAddressSimple(checks);

  finally
    FreeAndNil(results);
    FreeAndNil(checks);
  end;
UCheckAddressSimple erwartet ein Objekt vom Typ UCheckAddressSimple und gibt ein Objekt vom Typ UCheckAddressSimpleResponse zurück. Die Einstellungen von HTTPRIO sind folgende:
Port: QACWebServiceSoap12
Service: QACWebService
WSDLLocation: http://qws2.de/ACWS/QaCWebService.asmx?WSDL

Bekomme folgende Fehlermeldung: URL/Endpunkt für Service/Port 'QACWebService/QACWebServiceSoap12' kann nicht von WSDL 'http://qws2.de/ACWS/QaCWebService.asmx?WSDL' gelesen werden.

Benutze ich den anderen Port der mir zur Verfügung steht: QACWebServiceSoap
Kommt diese Fehlermeldung: Element enthält keinen einzelnen Textknoten

Bitte um eure Hilfe.

Viele Grüße


hungrycoder

mjustin 30. Jan 2014 12:56

AW: SOAP Problem
 
Zur Einkreisung des Problems ist ein Vergleich des von Delphi erzeugten Requests mit einem "funktionierenden" SOAP Request auf diesen Service sinnvoll.

Ideal ist es, wenn der Web Service eine Dokumentation mit vollständigen Request/Response Beispielen enthält.

In der Realität hilft dann SoapUI weiter, wenn damit eine korrekte Response kommt, muss man nur noch den SoapUI Request mit dem Delphi Request vergleichen.

hungrycoder 30. Jan 2014 13:05

AW: SOAP Problem
 
@mjustin danke für deine schnelle Antwort. Hatte vergessen es oben zu schreiben. Bekomme mit SOAPUI mit gleichen Einstellungen einen Response zurück, nur mit Delphi haut es noch nicht so hin.
Die Beispiele in der Doku beziehen sich zwar auf C# konnte es aber richtig umschreiben. Deswegen bin ich auch am verzweifeln, da mir keine weiteren Möglichkeiten einfallen etwas anders zu machen...Noch Ideen?

mjustin 30. Jan 2014 13:10

AW: SOAP Problem
 
Zitat:

Zitat von hungrycoder (Beitrag 1245974)
@mjustin danke für deine schnelle Antwort. Hatte vergessen es oben zu schreiben. Bekomme mit SOAPUI mit gleichen Einstellungen einen Response zurück, nur mit Delphi haut es noch nicht so hin.
Die Beispiele in der Doku beziehen sich zwar auf C# konnte es aber richtig umschreiben. Deswegen bin ich auch am verzweifeln, da mir keine weiteren Möglichkeiten einfallen etwas anders zu machen...Noch Ideen?

Wie gesagt: nun muss man "nur" noch den SoapUI Request mit dem Delphi Request vergleichen.

Also Delphi Request aufzeichnen, als Text speichern, dann mit einem Diff Tool die Unterschiede untersuchen...

hungrycoder 30. Jan 2014 13:21

AW: SOAP Problem
 
@mjustin
Das Problem besteht ja auch darin, dass an der Stelle an der ich den Request anschauen möchte eine Fehlermeldung kommt und er alles weitere abbricht. Ich kenne mich mit SOAP überhaupt nicht aus, was sind die häufigsten Fehler? Vielleicht muss ich nur etwas ändern?!

Bernhard Geyer 30. Jan 2014 14:54

AW: SOAP Problem
 
Welche Delphi-Version wird verwendet?
Hier wurde über die Jahre viel gestrickt damit es halbwegs funktioniert.

mjustin 30. Jan 2014 15:25

AW: SOAP Problem
 
Zitat:

Zitat von hungrycoder (Beitrag 1245980)
@mjustin
Das Problem besteht ja auch darin, dass an der Stelle an der ich den Request anschauen möchte eine Fehlermeldung kommt und er alles weitere abbricht.

Um den Request abzufangen, kann ein HTTP Proxy (Fiddler) benutzt werden, der zeichnet den SOAP XML Request auf bevor er an den Web Service weitergeleitet wird.

Die IP-Adresse des Fiddler Proxyservers (normalerweise läuft auf der Workstation, also 127.0.0.1) wird dazu im Client eingetragen (wenn ich mich richtig erinnere als "ProxyHost").

SOAP kann ein steiniges Pflaster sein :)

hungrycoder 31. Jan 2014 10:31

AW: SOAP Problem
 
@mjustin
Das klingt irgendwie monströs. Ich habe es geschafft den Response und den Request in Delphi auszugeben. Das Problem besteht also nach wie vor nach dem ich die Funtkion aufgerufen habe.
Der Fehler heißt nun: Element enthält keinen einzelnen Textknoten
Die Fehlermeldung an sich nervt mich eigentlich nicht, das Problem ist nur, dass ich auf den Response keinen Zugriff habe. Die Response Anzeige habe ich beim OnAfterExecute durch den Stream des Responses bekommen. Hat jemand eine Idee woran diese Fehlermeldung liegen könnte?


@Bernhard Geyer
Benutze Delphi 2007.

Lemmy 31. Jan 2014 11:03

AW: SOAP Problem
 
hm.. warum erzeugst Du den response selber und wunderst dich, dass die Fehlermeldung kommt, dass ein Textknoten leer ist?

Versuch es mal so:
Bei mir klappt das nicht, weil die Login-Informationen fehlen, die such ich mir jetzt aber nicht auch noc zusammen...


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var checks : UCheckAddressSimple;
    Response : UCheckAddressSimpleResponse;
begin
  try
    checks := UCheckAddressSimple.Create;
    checks.UserName := 'test';
    checks.UserPassword := 'test';
    checks.Tolerance := 1;
    checks.Country := 'DE';
    checks.ZIP := '41252';
    checks.City := 'Sp';
    checks.Street := 'Eugen-Bolz-Straße';

    Response := GetQACWebServiceSoap.UCheckAddressSimple(checks);

    memo1.Lines.Add(Response.UCheckAddressSimpleResult.ErrorMessage);
    Memo1.Lines.Add(IntToStr(Response.UCheckAddressSimpleResult.ErrorCode));
    Memo1.Lines.Add(IntToStr(Response.UCheckAddressSimpleResult.ResultStatus));
  finally
    FreeAndNil(Response);
    FreeAndNil(checks);
  end;
end;

theoneand 31. Jan 2014 11:09

AW: SOAP Problem
 
da kommt dann genau die gleich fehlermeldung

hungrycoder 31. Jan 2014 11:29

AW: SOAP Problem
 
@Lemmy
Ich erzeuge keinen eigenen Response, wie denn auch? Dein Beispiel ist nur eine Umformung meines Codes. Das heißt der Fehler besteht weiterhin, wie auch von theoneand geschrieben.

Lemmy 31. Jan 2014 12:39

AW: SOAP Problem
 
Zitat:

Zitat von hungrycoder (Beitrag 1246139)
@Lemmy
Ich erzeuge keinen eigenen Response, wie denn auch? geschrieben.

hm...
Delphi-Quellcode:
results := UCheckAddressSimpleResponse.Create;
sei es drum: Ich habe dir eben ne PN geschickt.

Keldorn 31. Jan 2014 19:20

AW: SOAP Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich komm andersrum irgendwie immer besser klar (so wie Lemmy)

1. wsdl importieren
2. Httprio mit auf die Form
3. after und beforeexecute zuweisen

Delphi-Quellcode:
procedure TForm6.Button1Click(Sender: TObject);
var WS:QACWebServiceSoap;
    checks : UCheckAddressSimple;
    results : UCheckAddressSimpleResponse;
begin
  WS := GetQACWebServiceSoap(false,'',HTTPRIO1);
  checks := UCheckAddressSimple.Create;
  checks.UserName := 'test';
  checks.UserPassword := 'test';
  checks.Tolerance := 1;
  checks.Country := 'DE';
  checks.ZIP := '41252';
  checks.City := 'Sp';
  checks.Street := 'Eugen-Bolz-Straße';
  results:=WS.uCheckAddressSimple(checks);

  ShowMessage(inttostr(results.UCheckAddressSimpleResult.ResultStatus)+'err:'+results.UCheckAddressSimpleResult.ErrorMessage);
  //ich bin der Meinung, daß hier keine Freigabe erfolgen muß, irgendwo stand das.
end;

procedure TForm6.HTTPRIO1AfterExecute(const MethodName: string; SOAPResponse: TStream);
//soapresponse zu Debugzwecken als xml abspeichern
Var sl:Tstrings;
begin
  sl:=TStringList.Create;
  try
    SOAPResponse.Position:=0;
    sl.LoadFromStream(SOAPResponse);
    sl.SaveToFile(ExtractFilePath(Application.ExeName)+'Soap-Response.xml');

  finally
  sl.free;
  end;
end;

procedure TForm6.HTTPRIO1BeforeExecute(const MethodName: string; SOAPRequest: TStream);
//hier das erzeugte xml abändern, damit es für die Gegenseite "passt" und xml zu debugzwecken speichern
Var sl:TStrings;
    sSoaprequest:string;
begin
  //Debug
  sl:=TStringList.Create;

  soaprequest.Position := 0;
  sl.LoadFromStream(SOAPRequest);
  sSoaprequest:=sl.Text;

  sl.SaveToFile(ExtractFilePath(Application.ExeName)+'Soap-Request-Orig.xml');

  //anpassen
  sSoaprequest:=StringReplace(sSoaprequest,...,...,[rfReplaceAll,rfIgnoreCase]);

  //wieder in stream schreiben
  sl.text:=sSoaprequest;
  SOAPRequest.Position :=0;
  sl.SaveToStream(SOAPRequest);
  sl.free;
end;
bekomme ich mit XE2 erstmal nur den "Login Failed! Login info is incorrect" als Fehler zurück.

wenns nicht passt und ich immer noch nicht weiß wie es besser geht: genau wie mjustin soapui verwenden und den request im beforeexecute solange anpassen, bis es "passt". Bei mir sind es öfters namespace-Angaben, die nicht richtig gesetzt sind.

Wenn du Delphi2007 verwendest, geht das genauso, da waren nur noch keine streams im Event.
Wie sieht dein erzeugter Request aus?

Gruß Frank

hungrycoder 3. Feb 2014 12:02

AW: SOAP Problem
 
@Keldorn
Danke für deine Antwort. Der Request und die Response sieht genau so aus wie in SOAPUI, kein einziger Unterschied...
Ich weiß nicht woran der Fehler liegt, bin aber zu dem Punkt gestossen, dass es etwas mit dem Parser von Delphi 2007 zu tun haben muss. Der Fehler tritt in der Klasse EXMLDocError auf.
Habe jetzt einen kleinen Workaround. Da ich den Response als Stream übergeben bekomme, greife ich diesen Response im AfterExecute von HTTPRio ab und parse ihn in NativeXML Knoten für Knoten durch. Daten werden dann in einem Record abgespeichert. Ist nicht die schönste Lösung, aahaaber sie geht :)

Keldorn 3. Feb 2014 15:26

AW: SOAP Problem
 
Hallo,

hab heute nochmal mein altes Delphi2007 angeworfen. die WSDL mit Delphi2007 importiert und gleiches Vorgehen wie oben und auch gleiches Resultat wie oben mit XE2: "Login Failed! Login info is incorrect."

kannst bitte du mal die echte Response (also eine Abfrage mit richtigen Zugangsdaten) als XML dranhängen?

Gruß Frank

hungrycoder 5. Feb 2014 10:00

AW: SOAP Problem
 
@Keldorn
Natürlich bekommst du nur den Fehler, dass die Login falsch ist. Mein Fehler kommt ja bei der Antwort. Ich kann dir die Login Daten nicht geben, ist aber auch verständlich....

Keldorn 5. Feb 2014 19:12

AW: SOAP Problem
 
ich meinte damit, daß ich den Fehler auch unter 2007 bekomme und nicht gleich den von dir beschriebenen Fehler.
Egal ob Loginfehler oder nicht: die Response hat ja prinzipiell erstmal den gleichen Aufbau. Das du die logindaten nicht rausgeben kannst, ist klar ;-). Wenn Du Lust hast, schickste mir die Response-xml mal per PN an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 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