Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webservice (https://www.delphipraxis.net/196134-webservice.html)

InschenierSB 2. Mai 2018 15:31

AW: Webservice
 
Zitat:

Zitat von hoika (Beitrag 1400521)
Hallo,
Zitat:

und soll jetzt das bestehende System an einen Webserver anbinden.
Hier könnte man dann auch über eine DLL in einer neueren Delphi-Version nachdenken,
die in die Delphi6-Exe eingebunden wird.

Servus hoika,
du hattest letzte Woche in deinem Beitrag über die Einbindung einer DLL von einer neueren Version (Delph2010) in eine alte Delphi6-exe gesprochen. Wie funktioniert so etwas (kurze Beschreibung)?
Der Hintergrund ist folgender:
Mein Webservice funktioniert nur in der Delphi 2010er Version.
Das Projekt, in welches der Webservice eingebunden werden soll, ist allerdings in Delphi6 erstellt. Die Idee war es hoch zu konvertieren, aber da sehe ich schwarz. Es müssten etwa 5 Packages installiert werden. Die kann ich schon gar nicht installieren, welche ich aber in Delphi 6 ohne Problem installieren kann.
Grüße
Sebastian

TiGü 3. Mai 2018 07:55

AW: Webservice
 
Erst mal dieses Tutorial durcharbeiten, dann werden wir konkret:
https://www.delphi-treff.de/tutorial...ctpascal/dlls/

hoika 3. Mai 2018 08:01

AW: Webservice
 
Hallo,
die Dll wird mit D2010 gebaut und exportiert diverse Funktionen.
In D6 wird eine dieser Funktionen aufgerufen (LoadLibrary/GetProcAdress usw.), in der Dll wird die (Indy?)-Komponente erzeugt,
ruft den Webservice auf, gibt das Ergebnis an D6 zurück und gibt die Komponente wieder frei.

2 virtuelle Maschinen, eine mit D6, eine mit D2010, ev. auf der gleichen Maschine mit dem RemoteDebugger.

Der Dll-Code sollte so gebaut ein, das man ihn in eine Test-Exe einbauen kann für einfaches Debuggen.

Elrond 3. Mai 2018 08:55

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401107)
Zitat:

Zitat von hoika (Beitrag 1400521)
Hallo,
Zitat:

und soll jetzt das bestehende System an einen Webserver anbinden.
Hier könnte man dann auch über eine DLL in einer neueren Delphi-Version nachdenken,
die in die Delphi6-Exe eingebunden wird.

Servus hoika,
du hattest letzte Woche in deinem Beitrag über die Einbindung einer DLL von einer neueren Version (Delph2010) in eine alte Delphi6-exe gesprochen. Wie funktioniert so etwas (kurze Beschreibung)?
Der Hintergrund ist folgender:
Mein Webservice funktioniert nur in der Delphi 2010er Version.
Das Projekt, in welches der Webservice eingebunden werden soll, ist allerdings in Delphi6 erstellt. Die Idee war es hoch zu konvertieren, aber da sehe ich schwarz. Es müssten etwa 5 Packages installiert werden. Die kann ich schon gar nicht installieren, welche ich aber in Delphi 6 ohne Problem installieren kann.
Grüße
Sebastian

Ich vermute das bei diesen Ansatz die ganze Unterstützung von Delphi bezüglich Webservices verloren geht. Den wozu lässt man sich einen Client erzeugen aus der WSDL, um natürlich schöneren und wartbaren Quelltext zu schreiben. Wird der Client jetzt in eine DLL gepackt, was hat man dann am Ende davon? Dein Delphi 6 Programm hat keine Kenntnis über die verwendeten Klassen, also müsste man alles erneut nachbauen. An diesen Punkt kann man sich aber ernsthaft Fragen warum man nicht einfach direkt aus Delphi6 den Webservice anspricht?

InschenierSB 3. Mai 2018 13:54

AW: Webservice
 
Zitat:

Zitat von Elrond (Beitrag 1401143)
Ich vermute das bei diesen Ansatz die ganze Unterstützung von Delphi bezüglich Webservices verloren geht. Den wozu lässt man sich einen Client erzeugen aus der WSDL, um natürlich schöneren und wartbaren Quelltext zu schreiben. Wird der Client jetzt in eine DLL gepackt, was hat man dann am Ende davon? Dein Delphi 6 Programm hat keine Kenntnis über die verwendeten Klassen, also müsste man alles erneut nachbauen. An diesen Punkt kann man sich aber ernsthaft Fragen warum man nicht einfach direkt aus Delphi6 den Webservice anspricht?

Das Problem an der ganzen Sache ist dass das Delphi 6 beim Importieren der WSDL-Datei nicht den gleichen Quell-Code erzeugt als wie wenn ich die selbe WSDL-Datei ins Delphi 2010 importiere, sprich da sieht der Quell-Code komplett anders aus --> ist ca. 30 Seiten länger, etc. Für mich sieht es so aus, als fehlen irgendwelche Komponenten im Delphi 6, deshalb kann es die Unit nicht in der Form erzeugen wie es in Delphi 2010 geschieht.
Fest steht dass der Server im Delphi 2010 mit den entsprechenden Requests antwortet, was er aber im Delphi 6 nicht macht, da gibt er nur irgendwelche lustigen Fehlermeldungen raus.
Der Gedanke war jetzt unter anderem das gesamte Projekt ins Delphi 2010 hoch zu konvertieren, aber da scheitert es schon am ersten Tool-Package. Es gibt da viele eigens erstellte Packages.... Ich denke es braucht da einige Zeit an Erfahrung um das zu bewerkstelligen.
Deswegen die Option mit der DLL...

InschenierSB 3. Mai 2018 15:17

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1401131)
Erst mal dieses Tutorial durcharbeiten, dann werden wir konkret:
https://www.delphi-treff.de/tutorial...ctpascal/dlls/


Also das Tutorial habe ich durch und auch mit dem entsprechenden Beispiel, das ist ja garnicht soooo anpruchsvoll. Aber ich glaube "lustig" wird es erst den Webservice und das WSDL-Dokument einzubinden...

Elrond 3. Mai 2018 15:32

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401210)
Das Problem an der ganzen Sache ist dass das Delphi 6 beim Importieren der WSDL-Datei nicht den gleichen Quell-Code erzeugt als wie wenn ich die selbe WSDL-Datei ins Delphi 2010 importiere, sprich da sieht der Quell-Code komplett anders aus --> ist ca. 30 Seiten länger, etc. Für mich sieht es so aus, als fehlen irgendwelche Komponenten im Delphi 6, deshalb kann es die Unit nicht in der Form erzeugen wie es in Delphi 2010 geschieht.
Fest steht dass der Server im Delphi 2010 mit den entsprechenden Requests antwortet, was er aber im Delphi 6 nicht macht, da gibt er nur irgendwelche lustigen Fehlermeldungen raus.
Der Gedanke war jetzt unter anderem das gesamte Projekt ins Delphi 2010 hoch zu konvertieren, aber da scheitert es schon am ersten Tool-Package. Es gibt da viele eigens erstellte Packages.... Ich denke es braucht da einige Zeit an Erfahrung um das zu bewerkstelligen.
Deswegen die Option mit der DLL...

Mir ist nicht ganz klar was du mit diesen Ansatz erreichen willst, du hast einen Client mit Delphi 2010 automatisch erzeugt und jetzt möchtest du die meisten bzw. alle Methoden mit einer DDL durchreichen? Um vernünftig auf der anderen Seite (Delphi 6) zu arbeiten müsstest du jetzt alle benötigten Typen nachbauen und beim Aufruf gibt es auch einiges zu beachten (z.B. welche string Kodierung genau). Bei dieser Konstellation frage ich mich warum nicht gleich über http direkt mit den Webservice in Delphi 6 kommunizieren? Soweit ich weiß verwendet Delphi nativ eh die Windows-Api, damit läuft es am Ende mit jeder Delphiversion auf das gleiche hinaus.

Wenn der Webservice recht komplex ist und die Typen stark verschachtelt (würde sich das auch bei der DLL Methode bemerkbar machen), könnte man auch über einen eigenen kleinen Anfrage<>XML Parser nachdenken (natürlich wäre eine Projektmigration zum neuen Delphi die bessere Lösung).

InschenierSB 3. Mai 2018 15:42

AW: Webservice
 
Zitat:

Zitat von Elrond (Beitrag 1401218)
Zitat:

Zitat von InschenierSB (Beitrag 1401210)
Das Problem an der ganzen Sache ist dass das Delphi 6 beim Importieren der WSDL-Datei nicht den gleichen Quell-Code erzeugt als wie wenn ich die selbe WSDL-Datei ins Delphi 2010 importiere, sprich da sieht der Quell-Code komplett anders aus --> ist ca. 30 Seiten länger, etc. Für mich sieht es so aus, als fehlen irgendwelche Komponenten im Delphi 6, deshalb kann es die Unit nicht in der Form erzeugen wie es in Delphi 2010 geschieht.
Fest steht dass der Server im Delphi 2010 mit den entsprechenden Requests antwortet, was er aber im Delphi 6 nicht macht, da gibt er nur irgendwelche lustigen Fehlermeldungen raus.
Der Gedanke war jetzt unter anderem das gesamte Projekt ins Delphi 2010 hoch zu konvertieren, aber da scheitert es schon am ersten Tool-Package. Es gibt da viele eigens erstellte Packages.... Ich denke es braucht da einige Zeit an Erfahrung um das zu bewerkstelligen.
Deswegen die Option mit der DLL...

Mir ist nicht ganz klar was du mit diesen Ansatz erreichen willst, du hast einen Client mit Delphi 2010 automatisch erzeugt und jetzt möchtest du die meisten bzw. alle Methoden mit einer DDL durchreichen? Um vernünftig auf der anderen Seite (Delphi 6) zu arbeiten müsstest du jetzt alle benötigten Typen nachbauen und beim Aufruf gibt es auch einiges zu beachten (z.B. welche string Kodierung genau). Bei dieser Konstellation frage ich mich warum nicht gleich über http direkt mit den Webservice in Delphi 6 kommunizieren? Soweit ich weiß verwendet Delphi nativ eh die Windows-Api, damit läuft es am Ende mit jeder Delphiversion auf das gleiche hinaus.

Wenn der Webservice recht komplex ist und die Typen stark verschachtelt (würde sich das auch bei der DLL Methode bemerkbar machen), könnte man auch über einen eigenen kleinen Anfrage<>XML Parser nachdenken (natürlich wäre eine Projektmigration zum neuen Delphi die bessere Lösung).

Ich habe eine Maschine mit einer in Delphi 6 erstellten GUI, die ziemlich komplex und umfangreich ist. Diese Maschine soll jetzt über einen Webservice bestimmten Daten erhalten. D.h. ich muss den Webservice in das vorhandene Delphi 6 Projekt implementieren. Da mir dies aber nicht gelungen ist habe ich es mit Delphi 2010 versucht und war erfolgreich.
Alles was ich vom Kunden habe ist das WSDL-Dokument. XML-Parser usw. kenne ich mich nicht wirklich aus.
Viele Grüße
Sebastian

Elrond 3. Mai 2018 17:32

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401222)
Ich habe eine Maschine mit einer in Delphi 6 erstellten GUI, die ziemlich komplex und umfangreich ist. Diese Maschine soll jetzt über einen Webservice bestimmten Daten erhalten. D.h. ich muss den Webservice in das vorhandene Delphi 6 Projekt implementieren. Da mir dies aber nicht gelungen ist habe ich es mit Delphi 2010 versucht und war erfolgreich.
Alles was ich vom Kunden habe ist das WSDL-Dokument. XML-Parser usw. kenne ich mich nicht wirklich aus.
Viele Grüße
Sebastian

Mal anders gefragt, weißt du was ein Webservice (insbesondere einer der auf SOAP basiert) ist und wie auch die Kommunikation zu einen Webservice erfolgt? Du musst in Delphi keine WSDL importieren oder irgendwelche Klassen erzeugen um einen Webservice zu nutzen. Delphi erstellt basierend auf der WSDL einfach nur eine Abstraktionsschicht zum Webservice, weil es (wenn es klappt) komfortabler ist, mehr steckt nicht dahinter. Die Methoden und ihre Parameter werden einfach ins XML serialisiert(das siehst man schön bei SoapUI) und via http verschickt. Du könntest sogar einfach mit cURL eine Anfrage an den Webservice schicken, kurz alles was über http kommunizieren kann, kann auch den Webservice nutzen.

Wenn es dir jetzt also nur um paar Methoden geht, dann kannst du wie gesagt es einfach nativ über Delphi 6 verschicken, bzw. dir das Indy Package installieren. Ist dein Webservice jedoch sehr umfangreich und enthält stark verschachtelte Typen, kannst du dich natürlich selber darum kümmern die Anfragen/Antworten automatisch ins XML umzuwandeln oder du kaufst dir die Funktionalität ein (z.B. http://www.clevercomponents.com/products/inetsuite/ die decken auch große Teile des WS-* Stacks ab). Du könntest auch eine eigene DDL verwenden, bedenke jedoch das die mit der Größe/Komplexität des Webservices skaliert.

InschenierSB 4. Mai 2018 08:05

AW: Webservice
 
Zitat:

Zitat von Elrond (Beitrag 1401232)
Zitat:

Zitat von InschenierSB (Beitrag 1401222)
Ich habe eine Maschine mit einer in Delphi 6 erstellten GUI, die ziemlich komplex und umfangreich ist. Diese Maschine soll jetzt über einen Webservice bestimmten Daten erhalten. D.h. ich muss den Webservice in das vorhandene Delphi 6 Projekt implementieren. Da mir dies aber nicht gelungen ist habe ich es mit Delphi 2010 versucht und war erfolgreich.
Alles was ich vom Kunden habe ist das WSDL-Dokument. XML-Parser usw. kenne ich mich nicht wirklich aus.
Viele Grüße
Sebastian

Mal anders gefragt, weißt du was ein Webservice (insbesondere einer der auf SOAP basiert) ist und wie auch die Kommunikation zu einen Webservice erfolgt? Du musst in Delphi keine WSDL importieren oder irgendwelche Klassen erzeugen um einen Webservice zu nutzen. Delphi erstellt basierend auf der WSDL einfach nur eine Abstraktionsschicht zum Webservice, weil es (wenn es klappt) komfortabler ist, mehr steckt nicht dahinter. Die Methoden und ihre Parameter werden einfach ins XML serialisiert(das siehst man schön bei SoapUI) und via http verschickt. Du könntest sogar einfach mit cURL eine Anfrage an den Webservice schicken, kurz alles was über http kommunizieren kann, kann auch den Webservice nutzen.

Wenn es dir jetzt also nur um paar Methoden geht, dann kannst du wie gesagt es einfach nativ über Delphi 6 verschicken, bzw. dir das Indy Package installieren. Ist dein Webservice jedoch sehr umfangreich und enthält stark verschachtelte Typen, kannst du dich natürlich selber darum kümmern die Anfragen/Antworten automatisch ins XML umzuwandeln oder du kaufst dir die Funktionalität ein (z.B. http://www.clevercomponents.com/products/inetsuite/ die decken auch große Teile des WS-* Stacks ab). Du könntest auch eine eigene DDL verwenden, bedenke jedoch das die mit der Größe/Komplexität des Webservices skaliert.

Guten Morgen,
im Prinzip weiß ich schon was ein Webservice ist, jedoch klar bin ich auf dem ganzen Gebiet was jetzt Delphi betrifft ziemlich unerfahren. Man muss sich erst langsam einarbeiten.
Du meinst ich könnte es z.B. mit einem IdHTTP1 in Delphi 6 realisieren. Weiß zwar auch noch nicht so genau wie ich das aufbauen soll aber da finde ich bestimmt Tutorials.
Was auch Fakt ist das ich den Service über SOAP-UI wunderbar ansprechen kann. Hier sehe ich auch wie der Header aufgebaut ist, ja?!

TiGü 4. Mai 2018 08:17

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401216)
Zitat:

Zitat von TiGü (Beitrag 1401131)
Erst mal dieses Tutorial durcharbeiten, dann werden wir konkret:
https://www.delphi-treff.de/tutorial...ctpascal/dlls/


Also das Tutorial habe ich durch und auch mit dem entsprechenden Beispiel, das ist ja garnicht soooo anpruchsvoll. Aber ich glaube "lustig" wird es erst den Webservice und das WSDL-Dokument einzubinden...

Bevor Elrond weiter den Teufel an die Wand malt und DLL mit DDL verwechselt: Weißt du denn JETZT schon, welche Informationen du von dem komplexen WebService benötigst? Sind es nur eine handvoll Daten oder brauchst du so gut wie alle möglichen Informationen aller Responses?

InschenierSB 4. Mai 2018 10:31

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1401253)
Zitat:

Zitat von InschenierSB (Beitrag 1401216)
Zitat:

Zitat von TiGü (Beitrag 1401131)
Erst mal dieses Tutorial durcharbeiten, dann werden wir konkret:
https://www.delphi-treff.de/tutorial...ctpascal/dlls/


Also das Tutorial habe ich durch und auch mit dem entsprechenden Beispiel, das ist ja garnicht soooo anpruchsvoll. Aber ich glaube "lustig" wird es erst den Webservice und das WSDL-Dokument einzubinden...

Bevor Elrond weiter den Teufel an die Wand malt und DLL mit DDL verwechselt: Weißt du denn JETZT schon, welche Informationen du von dem komplexen WebService benötigst? Sind es nur eine handvoll Daten oder brauchst du so gut wie alle möglichen Informationen aller Responses?

Hallo Tilo,
ach deswegen, habe mich schon gewundert was nun DDL schon wieder sein soll?!
Also später werde ich wahrscheinlich alle Respones benötigen. Nun geht es aber in erster Linie mal darum eine Antwort mit mindestens 1 Parameter zu bekommen und das in Delphi 6.
Wenn du mich da etwas unterstützen könntest.... Gibt dann auch wieder was weißt schon...

TiGü 4. Mai 2018 11:07

AW: Webservice
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich würde den Ansatz mit der DLL weiterverfolgen.

Minimalbeispiel:

InschenierSB 4. Mai 2018 14:51

AW: Webservice
 
Zitat:

Zitat von TiGü (Beitrag 1401281)
Ich würde den Ansatz mit der DLL weiterverfolgen.

Minimalbeispiel:

Ich werde es jetzt doch über Indy-HTTP versuchen, vielleicht hast du ein paar Tipps oder Tutorials dazu, habe schon angefangen den Header aufzubauen.

TiGü 4. Mai 2018 15:48

AW: Webservice
 
Hier zum Beispiel:
https://www.delphi-treff.de/tutorial...internet/indy/

Du musst dich aber auch mit XML und den Umgang damit in Delphi auskennen, wenn du das umsetzen willst.

InschenierSB 7. Mai 2018 08:48

AW: Webservice
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von TiGü (Beitrag 1401307)
Hier zum Beispiel:
https://www.delphi-treff.de/tutorial...internet/indy/

Du musst dich aber auch mit XML und den Umgang damit in Delphi auskennen, wenn du das umsetzen willst.

Hallo Tilo,
Vielleicht kannst du mir einen kleinen Tipp geben.
Habe einen Webservice gefunden, welcher mir auf Anfrage der Bankleitzahlen entsprechende Daten der jeweiligen Bank gibt.
Im SOAP-UI passt soweit alles. Ich weiß jetzt nur nicht wie ich den Request in Delphi formulieren soll?! Also in meinem Beispiel die Anfrage der BLZ.
Ich hänge auch nochmal einen Screenshot vom SOAP-UI an.
Danke schonmal.

Hier der CODE:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
   // procedure IdHTTP1Connected(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//SB procedure TForm1.IdHTTP1Connected(Sender: TObject);

var
Stream:TMemoryStream;
Url: String;
URL_:String;
List: TStrings;
HTTP_Version: TStringStream;
Result: String;
 Test:TIdHeaderInfo;
 procedure TForm1.Button1Click(Sender: TObject);
begin
  IdHTTP1:=TIdHTTP.Create(nil);
  HTTP_Version:= TStringStream.Create('HTTP/1.1');
  List:=TStringlist.Create;
  List.Add('axis2');
  List.Add('services');
  List.Add('BLZService');


  Url:= 'http://thomas-bayer.com/axis2/services/BLZService';

  // IdHTTP1.ProtocolVersion:='1.1';
 IdHTTP1.Request.ContentType:='text/xml;charset=UTF-8';
 IdHTTP1.Request.Connection:='Keep-Alive';
 IdHTTP1.Host:= 'thomas-bayer.com';
 IdHTTP1.Request.UserAgent:= 'Apache-HttpClient/4.1.1 (java 1.5)';
 IdHTTP1.Request.ContentLength:= 280;
// IdHHTP1.Request.
 IdHTTP1.Request.AcceptEncoding:= 'gzip,deflate';
 IdHTTP1.Post('ttp://thomas-bayer.com',List,HTTP_Version);
 IdHTTP1.Port:=80;
 IdHTTP1.Get(URL_,Stream);
// Stream.LoadFromStream();
 memo1.Lines.Add(IdHTTP1.Response.Server);
 //Memo2.text:=IdHTTP1.Post('http://thomas-bayer.com/axis2/services/BLZService',List,HTTP_Version);
end;

Elrond 7. Mai 2018 10:08

AW: Webservice
 
Schnell zusammen gebastelt und es klappt auch:
Siehe dazu:
http://docwiki.embarcadero.com/CodeE...TP_Get_(Delphi)
https://www.delphipraxis.net/184029-...en-fehler.html

Code:
procedure TForm1.FormCreate(Sender: TObject);
var
  HTTP: TIdHTTP;
  Body: TStringList;
  Response: String;
  IdLogDebug: TIdLogDebug;
  Stream: TMemoryStream;
begin
  try
    IdLogDebug := TIdLogDebug.Create;
    IdLogDebug.Active := true;
    Stream := TMemoryStream.Create;
    HTTP := TIdHTTP.Create;

    HTTP.Request.ContentType := 'application/soap+xml;charset=UTF-8';

    HTTP.Request.AcceptEncoding := 'gzip,deflate';
    HTTP.Intercept := IdLogDebug;
    Body := TStringList.Create;
    Body.Add('<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:blz="http://thomas-bayer.com/blz/">');
    Body.Add('<soap:Header/>');
    Body.Add('<soap:Body>');
    Body.Add('<blz:getBank>');
    Body.Add('<blz:blz>50010517</blz:blz>');
    Body.Add('</blz:getBank>');
    Body.Add('</soap:Body>');
    Body.Add('</soap:Envelope>');
    Body.SaveToStream(Stream);

    Response := HTTP.Post('http://thomas-bayer.com/axis2/services/BLZService', Stream);

    HTTP.Destroy;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end;
PS: Das Schnipsel sollte man nicht 1 zu 1 übernehmen, ich bin mir recht sicher das hier einiges nicht korrekt freigegeben wird, ganz zu schweigen vom style.

Elrond 7. Mai 2018 10:52

AW: Webservice
 
So am Rande, auch indy kann SOAP:
http://www.indyproject.org/SOAP/

InschenierSB 7. Mai 2018 10:53

AW: Webservice
 
Kein Thema Elrond,
habe e soweit schon hinbekommen. Was noch nicht so ganz klappt ist die Response auszugeben.
Im Wireshark habe ich eine Aufzeichnung parallel laufen, da sehe ich das die Antwort korrekt gesendet wird.
Mein Problem ist der Post. Der möchte drei Parameter übergeben bekommen, und wenn ich die Response zuweise meckert der Compiler wegen inkompatibler Daten.

Nehme mal an dass das wieder an der steinalten Delphi-Version (6) liegt. Aber ich muss diese verwenden.
Ich habe mal einen Screenhot vom Code angehangen.

InschenierSB 7. Mai 2018 10:54

AW: Webservice
 
Liste der Anhänge anzeigen (Anzahl: 1)
Man sollte den Screen-Shot auch hochladen.....

mjustin 7. Mai 2018 11:06

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401499)
Nehme mal an dass das wieder an der steinalten Delphi-Version (6) liegt. Aber ich muss diese verwenden.

Die aktuelle Version 10.6.2 von Indy ist auch noch mit alten Delphi Versionen einsetzbar (bis zu Delphi 5).

Wenn die Komponenten im Code dynamisch erzeugt werden, spart man sich auch die Package-Installation und kann neue Projekte parallel mit der neuen Version entwickeln.

Elrond 7. Mai 2018 11:56

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401499)
Kein Thema Elrond,
habe e soweit schon hinbekommen. Was noch nicht so ganz klappt ist die Response auszugeben.
Im Wireshark habe ich eine Aufzeichnung parallel laufen, da sehe ich das die Antwort korrekt gesendet wird.
Mein Problem ist der Post. Der möchte drei Parameter übergeben bekommen, und wenn ich die Response zuweise meckert der Compiler wegen inkompatibler Daten.

Nehme mal an dass das wieder an der steinalten Delphi-Version (6) liegt. Aber ich muss diese verwenden.
Ich habe mal einen Screenhot vom Code angehangen.

Mein Beispiel müsste 1 zu 1 bei dir klappen und im Response steht auch die Antwort als string. Da ich kein Delphi 6 habe kann ich es natürlich nicht überprüfen, aber falls tatsächlich die API von Indy nicht zu 100% gleich ist für jede Version, dann musst du eben die Methode korrekt aufrufen. Aus der ferne würde ich einfach mal raten das dein Post noch einen Parameter für die Antwort erwartet und zwar von Typ TStream. Wenn du jetzt mein Response von Typ string reinpackst, dann ist es logisch das es nicht geht.

InschenierSB 7. Mai 2018 12:38

AW: Webservice
 
Habe es glaube ich rausgefunden.
Bis hierher schonmal danke an alle!

InschenierSB 7. Mai 2018 12:56

AW: Webservice
 
Was ich aber noch nicht so richtig verstanden habe ist
was es mit der Try....Finally usw. Anweisung auf sich hat!?

TiGü 7. Mai 2018 13:10

AW: Webservice
 
Ich möchte dir die offizielle Dokumentation ans Herz legen, auch für weitere allgemeinere Fragen zu Delphi und seinen Sprachkonstrukten:
http://docwiki.embarcadero.com/RADSt...finally_Blocks
http://docwiki.embarcadero.com/RADSt...lly_Statements

InschenierSB 7. Mai 2018 14:51

AW: Webservice
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann jemand mit folgender FM (siehe Screen-Shot Anhang) was anfangen?

Delphi-Quellcode:
 Result: String;
 Test:TIdHeaderInfo;

 //IdLogDebug: TIdLogDebug;
 procedure TForm1.Button1Click(Sender: TObject);
begin




  IdHTTP1:=TIdHTTP.Create(nil);
  HTTP_Stream:= TStringStream.Create('');
  Body:=TStringlist.Create;
  Body.Add('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cim="http://cim.osram.ws.gefasoft.com/" xmlns:dat="http://cim.osram.ws.gefasoft.com/DataContracts">');
  Body.Add('<soapenv:Header/>');
  Body.Add('<soapenv:Body>');
  Body.Add('<cim:GetLotInfoByLotName>');
  Body.Add('<cim:requestMessage>');
  Body.Add('<dat:ToolCode>?</dat:ToolCode>');
  Body.Add(' <dat:CheckSlotPos>false</dat:CheckSlotPos>');
  Body.Add('<dat:EquipmentValidation>false</dat:EquipmentValidation>');
  Body.Add('<dat:LotName>R173419P</dat:LotName>');
  Body.Add('<dat:ReturnBrokenWafers>true</dat:ReturnBrokenWafers>');
  Body.Add('<dat:UseSlotPosition>false</dat:UseSlotPosition>');
  Body.Add('</cim:requestMessage>');
  Body.Add('</cim:GetLotInfoByLotName>');
  Body.Add('</soapenv:Body>');
  Body.Add('</soapenv:Envelope>');


  Url:= 'http://tst-rbg14:8019/Lot.svc';

    IdHTTP1.Post('http://tst-rbg14:8019/Lot.svc',Body,HTTP_Stream);
   IdHTTP1.ProtocolVersion:=pv1_1;
   try
 // IdHTTP1.ProtocolVersion:='1.1';
  IdHTTP1.Request.AcceptEncoding:= 'gzip,deflate';
  IdHTTP1.Request.ContentType:='text/xml';
  IdHTTP1.Request.ContentEncoding:='UTF-8';
  IdHTTP1.Request.ExtraHeaders.Add('http://cim.osram.ws.gefasoft.com/ILot/GetLotInfoByLotName');
  IdHTTP1.Request.ContentLength:= 918;
  IdHTTP1.Host:= 'tst-rbg14:8019';
  IdHTTP1.Request.Connection:='Keep-Alive';
  IdHTTP1.Request.UserAgent:= 'Apache-HttpClient/4.1.1 (java 1.5)';
  IdHTTP1.Port:=8019;
 // Body.SaveToStream(Stream);
 //  Response:= IdHTTP1.Post('http://thomas-bayer.com/axis2/services/BLZService',Body,Stream);
// IdHHTP1.Request.
    HTTP_Stream.Position:=0;




 //IdHTTP1.Get(URL_,Stream);
// showMessage(IdHTTP1.Request.);
// Stream.LoadFromStream();
 memo1.Lines.Add(IdHTTP1.Response.Server);
   // Memo2.Lines.Add(Format('Response Code: %d', [IdHTTP1.ResponseCode]));
   //Memo2.Lines.Add(Format('Response Text: %s', [IdHTTP1.ResponseText]));
    Body.LoadFromStream(HTTP_Stream);
   Memo2.Lines.AddStrings(Body);
    finally

   HTTP_Stream.Free;
   end;


end;




end.

KodeZwerg 7. Mai 2018 15:23

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401549)
Kann jemand mit folgender FM (siehe Screen-Shot Anhang) was anfangen?
Delphi-Quellcode:
  IdHTTP1.Request.ContentType:='text/xml';

So sollte die Fehlermeldung verschwinden, ob es zu dem Rest von Dir passt weiß ich nicht.
Delphi-Quellcode:
IdHTTP1.Request.ContentType:='application/octet-stream';

InschenierSB 7. Mai 2018 15:43

AW: Webservice
 
Zitat:

Zitat von KodeZwerg (Beitrag 1401551)
Zitat:

Zitat von InschenierSB (Beitrag 1401549)
Kann jemand mit folgender FM (siehe Screen-Shot Anhang) was anfangen?
Delphi-Quellcode:
  IdHTTP1.Request.ContentType:='text/xml';

So sollte die Fehlermeldung verschwinden, ob es zu dem Rest von Dir passt weiß ich nicht.
Delphi-Quellcode:
IdHTTP1.Request.ContentType:='application/octet-stream';

Leider bleibt alles so wie es ist, selbst wenn ich es auskommentiere.... die Meldung ändert sich nicht

KodeZwerg 7. Mai 2018 16:57

AW: Webservice
 
application/octet-stream bedeuted das Du mit binär Daten arbeiten musst.
Ich vermute Dein Code basiert auf Text Inhalt, da sollest Du alles auf Binär umstellen damit ein Fernzugriff klappt.
Also nicht nur das Transport Protocol "application/octet-stream" setzen, alles was damit zu tun hat muss entsprechend angepasst werden.
Vor ein paar Tagen hab ich verschiedene Download Varianten mit GET() durchgekaut, schau da mal in den Thread rein, vielleicht kannst Du meinen Code ohne große Probleme nach Indy portieren, die Befehle sind fast identisch. (THttpClient)

mjustin 7. Mai 2018 17:06

AW: Webservice
 
Zitat:

Zitat von KodeZwerg (Beitrag 1401558)
application/octet-stream bedeuted das Du mit binär Daten arbeiten musst.
Ich vermute Dein Code basiert auf Text Inhalt, da sollest Du alles auf Binär umstellen damit ein Fernzugriff klappt.
Also nicht nur das Transport Protocol "application/octet-stream" setzen, alles was damit zu tun hat muss entsprechend angepasst werden.
Vor ein paar Tagen hab ich verschiedene Download Varianten mit GET() durchgekaut, schau da mal in den Thread rein, vielleicht kannst Du meinen Code ohne große Probleme nach Indy portieren, die Befehle sind fast identisch. (THttpClient)

Die Fehlermeldung im Screenshot sagt, das erwartete Encoding ist "text/xml". Gesendet hat der Client laut Fehlermeldung stattdessen "application/octet-stream".

Vielleicht hilft Wireshark oder ein HTTP Proxy wie Fiddler2 bei der Aufklärung wie die gesendeten Requests aussehen.

p.s. Host, Port, ContentLength anzugeben ist nicht sinnvoll, da diese Werte von TIdHTTP ermittelt werden.

InschenierSB 8. Mai 2018 06:26

AW: Webservice
 
Zitat:

Zitat von mjustin (Beitrag 1401559)
Zitat:

Zitat von KodeZwerg (Beitrag 1401558)
application/octet-stream bedeuted das Du mit binär Daten arbeiten musst.
Ich vermute Dein Code basiert auf Text Inhalt, da sollest Du alles auf Binär umstellen damit ein Fernzugriff klappt.
Also nicht nur das Transport Protocol "application/octet-stream" setzen, alles was damit zu tun hat muss entsprechend angepasst werden.
Vor ein paar Tagen hab ich verschiedene Download Varianten mit GET() durchgekaut, schau da mal in den Thread rein, vielleicht kannst Du meinen Code ohne große Probleme nach Indy portieren, die Befehle sind fast identisch. (THttpClient)

Die Fehlermeldung im Screenshot sagt, das erwartete Encoding ist "text/xml". Gesendet hat der Client laut Fehlermeldung stattdessen "application/octet-stream".

Vielleicht hilft Wireshark oder ein HTTP Proxy wie Fiddler2 bei der Aufklärung wie die gesendeten Requests aussehen.

p.s. Host, Port, ContentLength anzugeben ist nicht sinnvoll, da diese Werte von TIdHTTP ermittelt werden.

Guten Morgen,
ja mit dem Wireshark da bin ich aktuell schon dran, finde nur aktuell den Request nicht, es sind glaube ich zu viele Dienste aktiv. Mal schauen....

Elrond 8. Mai 2018 07:10

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401632)
Guten Morgen,
ja mit dem Wireshark da bin ich aktuell schon dran, finde nur aktuell den Request nicht, es sind glaube ich zu viele Dienste aktiv. Mal schauen....

Warum hast du dann nicht einfach den Interceptor aus meinen Beispiel drin gelassen?
Hast du nicht bereits erzählt das es mit SoapUI geklappt? Dann übernimm einfach alle sinnvollen http Header (der Server und die Länge gehören logischerweise nicht dazu!).

InschenierSB 8. Mai 2018 07:39

AW: Webservice
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Elrond (Beitrag 1401644)
Zitat:

Zitat von InschenierSB (Beitrag 1401632)
Guten Morgen,
ja mit dem Wireshark da bin ich aktuell schon dran, finde nur aktuell den Request nicht, es sind glaube ich zu viele Dienste aktiv. Mal schauen....

Warum hast du dann nicht einfach den Interceptor aus meinen Beispiel drin gelassen?
Hast du nicht bereits erzählt das es mit SoapUI geklappt? Dann übernimm einfach alle sinnvollen http Header (der Server und die Länge gehören logischerweise nicht dazu!).

Ja Elrond,
mit dem Bankleitzahlen-Service da passt auch alles. Aber das war nur testweise. Die eigentliche Aufgabe besteht aber darin einen Webservice zu Osram Regensburg aufzubauen. Den Header hatte ich jetzt analog zu SoapUI aufgebaut und da bekomme ich dann die Fehlermeldung. Ich sende einfach auch mal einen Screen-Shot vom SoapUI.

Elrond 8. Mai 2018 07:50

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401647)
Zitat:

Zitat von Elrond (Beitrag 1401644)
Zitat:

Zitat von InschenierSB (Beitrag 1401632)
Guten Morgen,
ja mit dem Wireshark da bin ich aktuell schon dran, finde nur aktuell den Request nicht, es sind glaube ich zu viele Dienste aktiv. Mal schauen....

Warum hast du dann nicht einfach den Interceptor aus meinen Beispiel drin gelassen?
Hast du nicht bereits erzählt das es mit SoapUI geklappt? Dann übernimm einfach alle sinnvollen http Header (der Server und die Länge gehören logischerweise nicht dazu!).

Ja Elrond,
mit dem Bankleitzahlen-Service da passt auch alles. Aber das war nur testweise. Die eigentliche Aufgabe besteht aber darin einen Webservice zu Osram Regensburg aufzubauen. Den Header hatte ich jetzt analog zu SoapUI aufgebaut und da bekomme ich dann die Fehlermeldung. Ich sende einfach auch mal einen Screen-Shot vom SoapUI.

Nochmal, wie wäre es wenn du einfach den Interceptor (TIdLogDebug) aus meinen Beispiel verwendest? Dann wirst du schon sehen inwiefern deine Anfrage von SoapUI abweicht. Davon abgesehen ist eine vernünftige Protokolierungsfunktionalität sowieso Pflicht oder möchtest du auf den einzelnen Kundenrechnern immer Wireshark/Fidler what ever installieren und dazu noch immer persönlich vorbeikommen?

InschenierSB 8. Mai 2018 08:05

AW: Webservice
 
Ja das hatte ich ja auch aber das sagte mir der Compiler dass TIdLogDebug ein undefinierter Bezeichner ist. Kann das sein dass vielleicht eine Unit unter USES fehlt?!

TiGü 8. Mai 2018 08:57

AW: Webservice
 
Zitat:

Zitat von InschenierSB (Beitrag 1401652)
Ja das hatte ich ja auch aber das sagte mir der Compiler dass TIdLogDebug ein undefinierter Bezeichner ist. Kann das sein dass vielleicht eine Unit unter USES fehlt?!

Ja, höchstwahrscheinlich!

Bitte frage jetzt nicht nach dem Namen der Unit.

Tipp:
Die Suche in Delphi (wobei ich mir bei Delphi 6 nicht sicher bin) funktioniert auch auf Ordnern.
Alternativ nimmt man Notepad++ und sucht mit Filefilter *.pas nach TIdLogDebug.

InschenierSB 14. Mai 2018 06:53

AW: Webservice
 
Guten Morgen,
Noch eine letzte Frage dann kann ich glaube ich den Thread schließen. Mein Webservice läuft jetzt soweit, allerdings werden Zeichen wie ü, usw. im Ausgabefenster als Hieroglyphen dargestellt. Hat jemand eine Idee womit das zusammenhängt?!
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    IdHTTP1: TIdHTTP;
    GroupBox1: TGroupBox;
    ToolCode: TEdit;
    CheckSlotPos: TEdit;
    EquipmentValidation: TEdit;
    LotName: TEdit;
    ReturnBrokenWafers: TEdit;
    UseSlotPos: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

var
 Stream:TMemoryStream;
 //Url: String;
 //URL_:String;
    my_Request : TStringList;
    my_Response: TStringList;
  //SB Body: TStringStream;
 HTTP_Stream: TStringStream;


 //SB IdLogDebug: TIdLogDebug;


 procedure TForm1.Button1Click(Sender: TObject);
begin

  try
  //SB IdLogDebug := TIdLogDebug.Create;
  //SB IdLogDebug.Active := true;


  //SB IdHTTP1.Intercept:=IdLogDebug;
  IdHTTP1:=TIdHTTP.Create(nil);
  HTTP_Stream:= TStringStream.Create('');
  my_Request :=TStringList.Create;
  my_Response:=TStringList.Create;
  my_Request.Add('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cim="http://cim.osram.ws.gefasoft.com/" xmlns:dat="http://cim.osram.ws.gefasoft.com/DataContracts">');
  my_Request.Add('<soapenv:Header/>');
  my_Request.Add('<soapenv:Body>');
  my_Request.Add('<cim:GetLotInfoByLotName>');
  my_Request.Add('<!--Optional:-->');
  my_Request.Add('   <cim:requestMessage>');
  my_Request.Add('   <dat:ToolCode>' + ToolCode.Text + '</dat:ToolCode>');
  my_Request.Add('   <!--Optional:-->');
  my_Request.Add('   <dat:CheckSlotPos>' + CheckSlotPos.Text + '</dat:CheckSlotPos>');
  my_Request.Add('      <!--Optional:-->');
  my_Request.Add('   <dat:EquipmentValidation>' + EquipmentValidation.Text + '</dat:EquipmentValidation>');
  my_Request.Add('     <!--Optional:-->');
  my_Request.Add('   <dat:LotName>' + LotName.Text + '</dat:LotName>');
  my_Request.Add('   <!--Optional:-->');
  my_Request.Add('   <dat:ReturnBrokenWafers>' + ReturnBrokenWafers.Text + '</dat:ReturnBrokenWafers>');
  my_Request.Add('   <!--Optional:-->');
  my_Request.Add('   <dat:UseSlotPosition>' + UseSlotPos.Text + '</dat:UseSlotPosition>');
  my_Request.Add('</cim:requestMessage>');
  my_Request.Add('</cim:GetLotInfoByLotName>');
  my_Request.Add('</soapenv:Body>');
  my_Request.Add('</soapenv:Envelope>');

  IdHTTP1.Request.ExtraHeaders.SetText('SoapAction: "http://cim.osram.ws.gefasoft.com/ILot/GetLotInfoByLotName"');
  IdHTTP1.Request.Accept:='';
  IdHTTP1.Request.AcceptEncoding:='gzip,deflate';
  IdHTTP1.Request.Connection:='Keep-Alive';
  // SB IdHTTP1.Request.ContentType:='text/xml;charset=UTF-8';
  IdHTTP1.Request.ContentType:='application/soap+xml;charset=UTF-8';
  IdHTTP1.Request.UserAgent:= 'Apache-HttpClient/4.1.1(java 1.5)';
  IdHTTP1.Request.ContentLength:= 918;
  //IdHTTP1.Post('http://192.168.100.25:80/Lot.svc',my_Request,HTTP_Stream);
  //IdHTTP1.Request.ContentEncoding := 'utf-8';
  IdHTTP1.Post('http://tst-rbg14:8019/Lot.svc',my_Request,HTTP_Stream);



  HTTP_Stream.Position:=0;
//  my_Request.LoadFromStream(HTTP_Stream);
  my_Response.LoadFromStream(HTTP_Stream);
  Memo1.Lines.AddStrings(my_Request);
  Memo2.Lines.AddStrings(my_Response);


    finally

   HTTP_Stream.Free;
   end;


end;

{$R *.dfm}

end.

Schokohase 14. Mai 2018 07:24

AW: Webservice
 
SelfHTML: XML-Deklaration
Zitat:

Wenn Sie keine Angaben zur Kodierung der XML-Datei machen, wird per Voreinstellung UTF-8 angenommen.
Du versendest aber einen String der entweder ANSI (z.B bei Delphi 6) oder UTF32 (z.B. ab Delphi 2009 und neuer) ist.
Und hier
Delphi-Quellcode:
IdHTTP1.Request.ContentType:='application/soap+xml;charset=UTF-8';
behauptest du gegenüber dem Empfänger, dass es tatsächlich UTF8 sei (was aber definitiv falsch ist).

Fatal an ANSI vs. UTF8 dass die Standard-Zeichen exakt gleich codiert sind und man sich beim Testen (natürlich mit den Standard-Zeichen) in eine falsche Sicherheit wiegt.

Bernhard Geyer 14. Mai 2018 08:06

AW: Webservice
 
Zitat:

Zitat von Schokohase (Beitrag 1401996)
Du versendest aber einen String der entweder ANSI (z.B bei Delphi 6) oder UTF32 (z.B. ab Delphi 2009 und neuer) ist.

Ab D2009 verwendet Delphi UTF-16 als Standard-String-Typ (String = UnicodeString).

InschenierSB 14. Mai 2018 08:16

AW: Webservice
 
Zitat:

Zitat von Schokohase (Beitrag 1401996)
SelfHTML: XML-Deklaration
Zitat:

Wenn Sie keine Angaben zur Kodierung der XML-Datei machen, wird per Voreinstellung UTF-8 angenommen.
Du versendest aber einen String der entweder ANSI (z.B bei Delphi 6) oder UTF32 (z.B. ab Delphi 2009 und neuer) ist.
Und hier
Delphi-Quellcode:
IdHTTP1.Request.ContentType:='application/soap+xml;charset=UTF-8';
behauptest du gegenüber dem Empfänger, dass es tatsächlich UTF8 sei (was aber definitiv falsch ist).

Fatal an ANSI vs. UTF8 dass die Standard-Zeichen exakt gleich codiert sind und man sich beim Testen (natürlich mit den Standard-Zeichen) in eine falsche Sicherheit wiegt.

Danke für deine Antwort. Kann ich denn jetzt mit Delphi 6 überhaupt UTF-8 darstellen/versenden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 Uhr.
Seite 2 von 3     12 3      

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