Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi RPC-Request per TIdTCPClient (Indy) (https://www.delphipraxis.net/135711-rpc-request-per-tidtcpclient-indy.html)

himitsu 16. Jun 2009 12:55


RPC-Request per TIdTCPClient (Indy)
 
Ich hatte jetzt noch nie so richtig mit den Indys gearbeitet

und würd jetzt nur gern mal wissen, ob es so in etwa funktionieren würde...

Hab mich auch schon in der DP umgesehn und auch das "kleine" Tutorial im Delphi-Treff angeguckt,
aber so ganz hab ich da nicht alles verstanden, bzw. es passte nicht zu meinem "Problem".


das Problem, bzw der Grund ist von da:
XML > RPC und Delphi 2009

die Spezifikation des Formates steht so in etwa da drin verteckt:
XML-RPC Specification > Abschnitte "Request example" und "Response example"

ja und mein Code:
- ist erstmal nur so zusammengeschrieben und kommt dann mal in eine Funktion rein
- der Compiler meckert schonmal nicht mehr
- Const sind quasi die Funktions-Parameter
- und in Var versteckt das Result
- ja und hier geht es erstmal nur um die Datenübertragung


quasi eine HTML-ähliche POST-Anfrage und dann das Ergebnis vom Server auslesen:
(die ganzen Funktionen hab ich mir vorwiegend über die Code-Vervollständigung zusammengesucht, in Verbindung mit der OH)
Delphi-Quellcode:
Const TimeOut: Integer = 30000;
  IPVersion: TIdIPVersion = Id_IPv4;
  Host: String = '123.45.67.89';
  Port: Word = 0;
  URI: String = '/RPC2';
  UserAgent: String = 'himXML-RPC/1.0.0 (WinNT)';
  RequestXML: String = '<?xml version="1.0"?><methodCall><methodName>examples</methodName></methodCall>';

Var S: String;
  ResponseHeader: Array of String;
  ResponseXML: String;
  ResponseOK: Boolean;

Begin
  IdTCPClient1.ConnectTimeout := TimeOut;
  IdTCPClient1.ReadTimeout   := TimeOut;

  IdTCPClient1.IPVersion := IPVersion;
  IdTCPClient1.Host     := Host;
  IdTCPClient1.Port     := Port;

  IdTCPClient1.Connect;
  Try
    IdTCPClient1.IOHandler.WriteBufferClear;
    IdTCPClient1.IOHandler.WriteBufferOpen;
    Try
      IdTCPClient1.IOHandler.WriteLn('POST ' + URI + ' HTTP/1.0');
      IdTCPClient1.IOHandler.WriteLn('User-Agent: ' + UserAgent);
      IdTCPClient1.IOHandler.WriteLn('Host: ' + Host);
      IdTCPClient1.IOHandler.WriteLn('Content-Type: text/xml');
      IdTCPClient1.IOHandler.WriteLn('Content-length: ' + IntToStr(Length(RequestXML)));
      IdTCPClient1.IOHandler.WriteLn;
      IdTCPClient1.IOHandler.Write(RequestXML);
      IdTCPClient1.IOHandler.WriteBufferFlush;
      IdTCPClient1.IOHandler.WriteBufferClose;
    Except
      IdTCPClient1.IOHandler.WriteBufferCancel;
      Raise;
    End;

    ResponseHeader := nil;
    Repeat
      S := IdTCPClient1.IOHandler.ReadLn(enUTF8);
      If Trim(S) = '' Then Break;
      SetLength(ResponseHeader, Length(ResponseHeader) + 1);
      ResponseHeader[High(ResponseHeader)] := S;
    Until not IdTCPClient1.Connected;
    ResponseXML := IdTCPClient1.IOHandler.AllData(enUTF8);

    If Assigned(ResponseHeader) Then S := ResponseHeader[0] Else S := '';
    S := Trim(Copy(S, Pos(' ', S) + 1, Length(S)));
    S := Trim(Copy(S, 1, Pos(' ', S) - 1));
    ResponseOK := (Trim(ResponseXML) <> '') and (S = '200');

  Finally
    IdTCPClient1.Disconnect;
  End;
End;

Ich schau mir aber auch grad noch TIdHTTP an und werd mal sehn, wie/ob ich damit klarkomm usw.


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