![]() |
AW: Webservice
Zitat:
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 |
AW: Webservice
Erst mal dieses Tutorial durcharbeiten, dann werden wir konkret:
![]() |
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. |
AW: Webservice
Zitat:
|
AW: Webservice
Zitat:
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... |
AW: Webservice
Zitat:
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... |
AW: Webservice
Zitat:
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). |
AW: Webservice
Zitat:
Alles was ich vom Kunden habe ist das WSDL-Dokument. XML-Parser usw. kenne ich mich nicht wirklich aus. Viele Grüße Sebastian |
AW: Webservice
Zitat:
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. ![]() |
AW: Webservice
Zitat:
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?! |
AW: Webservice
Zitat:
|
AW: Webservice
Zitat:
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... |
AW: Webservice
Liste der Anhänge anzeigen (Anzahl: 1)
Ich würde den Ansatz mit der DLL weiterverfolgen.
Minimalbeispiel: |
AW: Webservice
Zitat:
|
AW: Webservice
Hier zum Beispiel:
![]() Du musst dich aber auch mit XML und den Umgang damit in Delphi auskennen, wenn du das umsetzen willst. |
AW: Webservice
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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; |
AW: Webservice
Schnell zusammen gebastelt und es klappt auch:
Siehe dazu: ![]() ![]()
Code:
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.
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; |
AW: Webservice
|
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. |
AW: Webservice
Liste der Anhänge anzeigen (Anzahl: 1)
Man sollte den Screen-Shot auch hochladen.....
|
AW: Webservice
Zitat:
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. |
AW: Webservice
Zitat:
|
AW: Webservice
Habe es glaube ich rausgefunden.
Bis hierher schonmal danke an alle! |
AW: Webservice
Was ich aber noch nicht so richtig verstanden habe ist
was es mit der Try....Finally usw. Anweisung auf sich hat!? |
AW: Webservice
Ich möchte dir die offizielle Dokumentation ans Herz legen, auch für weitere allgemeinere Fragen zu Delphi und seinen Sprachkonstrukten:
![]() ![]() |
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. |
AW: Webservice
Zitat:
Delphi-Quellcode:
IdHTTP1.Request.ContentType:='application/octet-stream';
|
AW: Webservice
Zitat:
|
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) |
AW: Webservice
Zitat:
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. |
AW: Webservice
Zitat:
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.... |
AW: Webservice
Zitat:
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!). |
AW: Webservice
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
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. |
AW: Webservice
Zitat:
|
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?!
|
AW: Webservice
Zitat:
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. |
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. |
AW: Webservice
![]() Zitat:
Und hier
Delphi-Quellcode:
behauptest du gegenüber dem Empfänger, dass es tatsächlich UTF8 sei (was aber definitiv falsch ist).
IdHTTP1.Request.ContentType:='application/soap+xml;charset=UTF-8';
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. |
AW: Webservice
Zitat:
|
AW: Webservice
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:14 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