Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi RPC und Delphi 2009 (https://www.delphipraxis.net/132879-rpc-und-delphi-2009-a.html)

mjustin 21. Apr 2009 16:18

Re: RPC und Delphi 2009
 
Delphi-Quellcode:
HashMessageDigest := TIdHashMessageDigest5.Create;
  try
    { determine the md5 digest hash of the request }
    Hash := Hash128AsHex(HashMessageDigest.HashValue(XmlRequest)); // <-
Indy muss auf jeden Fall auf die neue Tiburon-Version upgedated werden, aber der XML-RPC Code scheint etwas älter zu sein.
Es gibt aber auch in der neuen Indy Version MD5 Funktionen, die den gewünschten Hash liefern sollten. Nur heissen sie jetzt wahrscheinlich anders.

Meine Indy-basierte MD5 Funktion sieht so aus:
Delphi-Quellcode:
function MD5Hash(const Input: WideString): string;
begin
  with TIdHashMessageDigest5.Create do
  try
    Result := LowerCase(HashStringAsHex(string(Input)));
  finally
    Free;
  end;
end;

alphaflight83 22. Apr 2009 10:47

Re: RPC und Delphi 2009
 
Joa, mit deiner MD5 Funktion kompiliert es, allerdings wirft Indy (idHTTP) bei der Ausführung Fehler.
Wärs gelaufen hätte ich mich gefreut wie'n Schnitzel, aber so müsste ich jetzt doch tiefer in die Thematik einsteigen,
als ich das eigentlich wollte.
Da die mMn größte Problematik hier der verwendete XML-Parser ist, der nur begrenzte Unicode Unterstützung mitbringt,
muss man sich wohl damit mal genauer auseinandersetzen, bzw. einen adäquaten Ersatz finden.

PS: Wenn jemand natürlich den Stein der Weisen zu diesem Thema parat hat ... :wink:

alphaflight83 23. Apr 2009 10:33

Re: RPC und Delphi 2009
 
Liste der Anhänge anzeigen (Anzahl: 1)
So hab jetzt doch noch mal versucht was Vernünftiges zu Stande zu bringen,
bin aber nach erfolgreichem Kompilieren wieder an der Ausführung gescheitert:

EIdHttpProtocolException HTTP/1.0 500 Internal Error
The server encountered an unexpected condition which prevented it from fulfilling the request.


Unter Delphi 7 mit XML-RPC-2.0.0 funktioniert das ganze mit dem selben Aufruf ohne Probleme.

In LibXmlParser.pas hab ich folgende Änderungen vorgenommen
(Alle Änderungen im Code durch Note (SeHa-2009-04-23) gekennzeichnet)
- Die AnsiToUtf8 und Utf8ToAnsi Funktionen auskommentiert
- Special Helper Functions rausgenommen, da die zu Fehlern geführt haben.
- TranslateEncoding schleift nur noch durch:

Delphi-Quellcode:
FUNCTION TXmlParser.TranslateEncoding (CONST Source : STRING) : STRING;
BEGIN
  Result := Source;
END;
In XmlRpcCommon.pas:
- IdHashMessageDigest eingebunden
- Funktion eingefügt: function HashStringMD5AsHex(const AStr: WideString): string; welche der Funktion von mjustin entspricht
In XmlRpcClient.pas:
- Bekannte benötigte Änderungen für Indy10 eingesetzt
- In TRpcCaller.Execute HashStringMD5AsHex Funktion eingesetzt
Delphi-Quellcode:
  { determine the md5 digest hash of the request }
  // Hash := Hash128AsHex(HashMessageDigest.HashValue(XmlRequest));
  Hash := HashStringMD5AsHex(XmlRequest);
In XmlRpcServer.pas:
- IdContext eingebunden
- Bekannte benötigte Änderungen für Indy10 eingesetzt
DiMime.pas: durch aktuellere Version ersetzt

Wie gesagt, hat es nach den Änderungen kompiliert (Auch ohne dass Ansi-Strings und -Chars ersetzt wurden)
Aber bei der Ausführung kommt besagter Fehler.

Hab das ganze Gedönz mal angehängt.

alphaflight83 15. Jun 2009 12:54

Re: RPC und Delphi 2009
 
Ab heute gibt es den Real Thin Client (RTC) unter der freien BSD Lizenz.
Hiermit sollte sich dann das leidige Thema RPC auf D2009 vernünftig lösen lassen.
(Edit: Wodurch dann für mich auch die Änderungsversuche am XML-RPC hinfällig werden)

himitsu 15. Jun 2009 13:32

Re: RPC und Delphi 2009
 
hatte mir grad mal dieses XML-RPC angesehn und sowas find ich schon witzig ... wozu haben die da XML-Klassen verwaut, wo sie nichtmal genutzt werden? :shock:
Delphi-Quellcode:
function TRpcFunction.GetRequestXML: string;
var
  Strings: TStrings;
begin
  Strings := TStringList.Create;
  try
    Strings.Add('<?xml version="1.0"?>' + #13#10);
    Strings.Add('<methodCall>' + #13#10);
    Strings.Add('  <methodName>' + FObjectMethod + '</methodName>' + #13#10);
    GetBodyXML(Strings);
    Strings.Add('</methodCall>' + #13#10);
    Result := Strings.Text;
  finally
    Strings.Free;
  end;
end;
nja, und den darin verwendeten LibXmlParser hatte ich auch noch nicht so richtig unter D09 zum Laufen gebracht.

alphaflight83 15. Jun 2009 14:45

Re: RPC und Delphi 2009
 
Jo, ich hatte mich etwas darin verrannt den Parser umschreiben zu wollen,
woran ich gescheitert bin. Dann wollte ich den Parser ersetzen, bin aber nach gottseidank nur kurzer Versuchszeit
heute auf die Nachricht beim RTC gestoßen. Jetzt versuch ich mich mal daran.

himitsu 15. Jun 2009 14:54

Re: RPC und Delphi 2009
 
Also einen in D09 laufenden Parser hab ich ja ... nur kenn ich mich mit diesem RPC nicht so aus und da wäre es schwer nun etwas dafür zu machen,
wobei der Aufbau der XML-Dateien schonmal recht einfach gestaltet ist.

Wie nutzt man es denn programmseitig?

alphaflight83 16. Jun 2009 07:29

Re: RPC und Delphi 2009
 
Die Antwort wird dir wahrscheinlich nicht sehr viel bringen, da ich zur komplizierten Seite, dem Server leider gar nichts sagen kann,
da das ein Kollege in Python geschrieben hat.
Der Aufruf auf Client-Seite ist simpel, da nur die Eigenschaften EndPoint, ObjectMethod sowie Ip-Adresse und Port benötigt werden.

Beispiel-Aufruf:
Das Programm würde hier eine Beschreibung zu einem Item anhand seiner ItemID aus einer serverseitig hinterlegten Liste holen.
(Wie gesagt, die eigentliche Logik steckt dabei im Serverprogramm.)

Delphi-Quellcode:
(**********************************
** Function: RPC_ItemDescription **
**********************************)
function RPC_ItemDescription (IP_Address: String; TCP_Port, ItemID : Integer):LongInt;
var
  RpcCaller   : TRpcCaller;
  RpcFunction : IRpcFunction;
  RpcResult   : IRpcResult;
begin
  RpcCaller := TRpcCaller.Create;
  try
    RpcCaller.EndPoint := '/RPC2';
    RpcCaller.HostName := IP_Address;
    RpcCaller.HostPort := TCP_Port;

    RpcFunction             := TRpcFunction.Create;
    RpcFunction.ObjectMethod := 'get_item_descr';
    RpcFunction.AddItem       (ItemID);

    RpcResult := RpcCaller.Execute(RpcFunction);
    Result := RpcResult.AsInteger;
  finally
    RpcCaller.Free;
  end;
end;

himitsu 16. Jun 2009 08:16

Re: RPC und Delphi 2009
 
Also im Prinzip wird nur eine XML-Datei zusammengebastelt,
wo ein Funktionsname und Parameter eingetragen werden.
Dann wird das via TCPIP an eine IP+Port versendet,
man bekommt eine neue XML-Datei zurück und sucht da das Ergebnis raus.

Also im eigenem Programm werden keine Funktionen aufgerufen?

Na da sollte sich ja,
wenn die Parameter nicht all zu aufwändig und Exotisch ausfallen,
was mit einer kleinen Klasse machen lassen. :stupid:

Müßte ich nur mal sehn, wie ich das mit dem Internetversand hinbekomm.

alphaflight83 16. Jun 2009 09:00

Re: RPC und Delphi 2009
 
Joa, möglich, dass das nicht allzu komplex ist, wenn man sich da allerdings ohne XML Vorwissen reinwirft,
kann das schnell ganz schön viel werden. :gruebel:

Das Problem dabei ist nur, dass das ganze XML-RPC kompatibel bleiben muss, da das eben in nahezu jeder Sprache verfügbar ist.
Edit: Wie gesagt, Mit Delphi 7 war die Sache für mich mit Aufrufen der gezeigten Größenordnung erledigt.
Mit dem Thema selbst musste ich mich da nicht allzu sehr befassen. Meine gescheiterten Versuche mit dem Parser haben mir dann eher
Frust als Lust bereitet.


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

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