![]() |
Indy 10 HTTP(S) Protokoll
.
Worum geht es hier? Die Indy Komponenten bieten eine gute Möglichkeit um HTTP(S) Verbindungen zu ermöglichen. Wenn du also Informationen an eine Webseite senden oder empfangen willst bist du hier genau richtig. Inhalt
1. HTTP Komponente Allgemeines Die Komponente findet ihr in der Tool-Palette unter "Indy Clients". Dort klickt ihr auf TIdHTTP (Weltkugel) und zieht dies auf euer Formular. Delphi bindet nun automatisch eine Reihe von Units ein wichtig ist dabei IdHTTP, diese Datei enthält alle benötigten Methoden. Alternativ kann man die Klasse auch zur Laufzeit erstellen, ich bevorzuge diese Methode und gebe deshalb alle Beispiele so an. Daten Empfangen Die TIdHTTP-Klasse stellt eine Funktion GET zur Verfügung, damit lässt sich der komplette Quellcode von einer Webseite empfangen: Daten Senden Zum Senden von Daten wie Login Informationen oder Dateien bietet die Klasse eine Funktion POST. Es gibt nun 3 verschiedene Möglichkeiten, wie man die Daten sendet. Entweder mit einer TStringList, wenn man keine Dateien senden muss, aber bestimmte Formularfelder ansprechen möchte. Wenn man eine API ansprechen möchte z.B. Google Blogger dann sendet man, ohne ein spezielles Formularfeld anzusprechen oder man nutzt die Klasse TIdMultiPartFormDataStream aus der Unit IdMultipartFormData. Oft ist es auch so, dass die Seite vorgibt, wie die Daten gesendet werden müssen. Im HTML Quelltext sollte man im form-Tag auf das Attribut "enctype" achten. Hier stand mal das man keine TStringList benutzen sollte und stattdessen einen TStringStream und dann die Werte selber codieren sollte, dass ist bei alten Indy Versionen notwendig, in den aktuelleren kann man dies aber auch getrost Indy überlassen - so geht's:
Request Einstellungen Der HTTP Client sendet beim Empfangen oder Senden von Daten nebenher noch weitere Informationen. Eine haben wir eben schon kennengelernt, den ContentType. Die Definition von diesen Werten ist eigentlich optional, jedoch gibt es viele Server die Probleme mit den Standardangaben haben. Response Informationen Wenn man den Quelltext von einer Webseite empfängt werden noch weitere Protokoll Informationen gesendet. Weitere Einstellungen Neben den ganzen Header Informationen kann man natürlich noch Timeouts und beispielsweise das Verhalten bei Weiterleitungen definierten. 2. Cookies Hiermit handelt es sich nicht um das Problem, dass es keine Kekse gibt, sondern um kleine Dateien, die eine Webseite auf dem Client erstellt um Daten wie z.b. eine Sitzung's-ID zu speichern. Auch die HTTP Komponente unterstützt dies. Dazu reicht diese Einstellung: Hinweis: Die Cookie Implementation ist erst seit 10.5.8 wirklich alterstauglich. 3. Gzip Je umfangreicher die Webseite, desto mehr Quelltext muss geladen werden und umso länger dauert dies auch. Mit Gzip kann, wenn der Server das unterstützt der Datenaustausch komprimiert werden. Dazu muss zusätzlich die Unit IdCompressorZLib eingebunden werden. 4. SSL Das HTTPS Protokoll verschlüsselt den kompletten Datenverkehr. Vorab: Hierfür werden die passenden Versionen der libeay32.dll und ssleay32.dll Bibliothek benötigt. Die aktuelle Version findet man immer in diesem ![]() 5. HTTP Proxy / SOCKS 4, 5 Was ich euch hier zeigen möchte ist eine Kombi-Lösung für die verschiedenen Proxy Varianten, d.h. man sollte sich eine eigene Proxy Klasse schreiben mit einem Proxy-Typ, der dann generell alles ermöglicht. Damit dies auch in Kombination mit SSL funktioniert habe ich auch dies eingebaut. Natürlich könnte man, wenn man wirklich nur SOCKS 5 benötigt das dementsprechend vereinfachen, aber wie gesagt, hier ein flexibles Beispiel: 6. Konklusion Wie man sieht unterstützt die HTTP Komponente alle nötigen Funktionen eines Browsers. Ich höre/lese immer wieder, dass eine Webseite nicht auslesen werden kann, weil die Komponente kein JavaScript unterstützt. Diese Aussage kann ich zwar nicht widerlegen, jedoch ist mir noch keine Webseite unter den Nagel gekommen, wo die Komponente an ihre Grenzen gestoßen ist. Wenn ihr jetzt also selber viele Teile hiervon benötigt, empfehle ich eine eigene Klasse zu schreiben, die von TIdHTTP erbt. Darin setzt ihr alle Voreinstellungen, damit man das nicht bei jeder Verwendung machen muss (okay eigentlich selbstverständlich nur ..., ja genau). 7. Tools WireShark Bei der Client/Server Kommunikation können sehr leicht Fehler auftreten, meistens weiß man aber nicht so genau, was überhaupt übertragen wurde, deshalb kann ich jetzt nun schon aus langjähriger Erfahrung dieses umfangreiche und kostenlose Programm empfehlen. Filter:FireFox Web Developer Ich bin wohl der letzte Mensch der freiwillig dauerhaft diesen Browser benutzen würde, jedoch gibt es dafür ein wunderbares ![]() Da dies nun mein erstes Tutorial ist, hoffe ich, dass nicht allzu viel falsch gemacht wurde ;) . |
AW: Indy 10 HTTP(S) Protokoll
Sieht super aus. Den Teil mit GZip werde ich unbedingt mal testen, um zu wissen, ob der Server auf dem ich rumspiele das auch gescheit verwendet.
Noch ein Wort zu SSL: Es werden die DLLs benötigt, die zur Version von INDY passen. So bin ich ganz froh, die DLLs für INDY9 noch zu haben, dass das mit meinem Delphi und dem Grundkomponentensatz geht. Bernhard |
AW: Indy 10 HTTP(S) Protokoll
Sehr hilfreich,
vielen Dank. Eine kleine Ergänzung: Die Geschichte mit dem automatischen Konvertieren durch idhttp geht nur mit aktuellen Indy Komponenten. Mit den 150er hat es noch nicht funktioniert, jetzt mit 160 schon. Also für alle die sich wundern warum der zusätzliche Parameter nicht möglich ist -> Indy Update. Für das Tutorial noch einmal meinen herzlichen Dank an den Ersteller. |
AW: Indy 10 HTTP(S) Protokoll
Mir hat das Tutorial auch sehr viel zeigen können. Vieles davon lässt sich sehr schwierig googlen und ist selbst dann nicht immer ersichtlich was überhaupt jetzt damit gemeint ist da man hauptsächlich auch viele Themen zu alten Indy Versionen findet.
|
AW: Indy 10 HTTP(S) Protokoll
Hallo,
ich bin neu hier, deswegen weiss ich nicht, ob es noch Sinn macht auf ein so altes Thema zu antworten, aber ich versuche es einfach mal. Vielleicht kann mir ja einer weiterhelfen. Ich versuche mit der neusten Delphi version Tokio 10.2 eine Anwendung zu Programmieren, die eine HTTPS Webseite liest, was ich aber leider nicht hinbekomme. Es liegt wohl auch daran das mir das basis wissen dazu fehlt. Ich kann problemlos eine HTTP Seite mit derr Anwendung lesen. Kann mir jemand weiterhelfen ? Eine Frage z.B habe ich, benötige ich bei Delphi 10.2 immer noch die libeay32.dll und ssleay32.dll Bibliothek, oder sind die mitlerweile im Delphi integriert. Wäre nett, wenn ich eine info bekommen würde. |
AW: Indy 10 HTTP(S) Protokoll
Seit XE8 gibt es
![]() ![]() Indy benötigt weiterhin OpenSSL. |
AW: Indy 10 HTTP(S) Protokoll
Eine ganz brauchbare Resource für OpenSSL mit anderen Libraries findest Du
![]() Ich selbst habe auch positive Erfahrung mit der Overbyte (ICS) Variante gemacht, falls einem pures Indy zu wenig bietet/zu schwer ist einzusetzen, da ist eine sehr steile Lernkurve bei wenig Programmierung geboten. Also falls alle Stricke reißen, einfach mal da reinschnuppern, ist sehr Neueinsteiger-freundlich will ich damit sagen. Das hier zugrunde liegende Tutorial, gute Arbeit, genug und nachvollziehbar erklärt, Danke dafür. |
AW: Indy 10 HTTP(S) Protokoll
Danke erst einmal ich schaue mir das jetzt mal in ruhe an, was ich nun zum download der https Seite nehmen werde.
Die beiden Möglichkeiten von Redeeemer gefallen mir. Also Danke Euch beiden. |
AW: Indy 10 HTTP(S) Protokoll
Zitat:
|
AW: Indy 10 HTTP(S) Protokoll
Ja. Um OpenSSL würde ich, wenn möglich, einen grossen Bogen machen. Die System.Net Funktionen laufen nativ auf Windows und brauchen daher kein OpenSSL.
Habe damit aber das Problem, dass es bei Redirects (301/302) keine Möglichkeit zu geben scheint, die wirklich gelesene URL zu ermitteln. Die Funktinon ist also recht eingeschränkt. Ich muss für meine Anwendung wissen wie die zurückgelieferte URL denn nun genau gelautet hat. Habe keine Weg gefunden da an die nötige Info zu gelangen. |
AW: Indy 10 HTTP(S) Protokoll
Randbemerkung: Um OpenSSL kann man aber nur einen Bogen machen, wenn man nicht plattformübergreifend entwickeln will.
Sherlock |
AW: Indy 10 HTTP(S) Protokoll
Zitat:
Wobei ich jetzt aber auch dazu sagen muss, dass ich mit Indy+OpenDLL nie wirklich Probleme hatte, außer denen die ich selbst reinprogrammiert habe ;-) |
AW: Indy 10 HTTP(S) Protokoll
Hallo,
zu Redirects findest Du für Indy hier was ![]() |
AW: Indy 10 HTTP(S) Protokoll
Zitat:
|
AW: Indy 10 HTTP(S) Protokoll
Hey ho,
danke für das Tutorial, es hat mir gut geholfen! An einer Stelle stolpere ich allerdings etwas und zwar bei der POST Methode. Ich hab den Code aus dem Tutorial übernommen und etwas angepasst:
Delphi-Quellcode:
An folgender Stelle:
procedure TProgWebAppFrm.HTTPPost(Username : String; Password : String; Database : String);
var Params: TStringList; Enc: TEncoding; ResponseStr: string; begin with TIdHTTP.Create(nil) do try Request.ContentType := 'application/x-www-form-urlencoded'; Params := TStringList.Create; try with Params do begin Add('username=' + Username); Add('password=' + Password); Add('database=' + Database); end; // Request.CharSet vorher setzten: z.B: ISO-8859-1 Enc := CharsetToEncoding(Request.CharSet); try // Daten senden ResponseStr := Post('https://nb1819157:5001/login?', Params, Enc); finally Enc.Free; end; finally Params.Free; end; finally Free; end; end;
Delphi-Quellcode:
Kommt nun der Fehler, dass die Typen TEncoding und IIdTextEncoding nicht miteinander kompatibel sind. Das verstehe ich soweit auch, aber wie wurde das dann im Tutorial gemacht? Es schien ja so mal funktioniert zu haben. Wurden mit der Zeit Libraries angepasst so das die Inkompabilität jetzt zustande kommt?
Enc := CharsetToEncoding(Request.CharSet);
|
AW: Indy 10 HTTP(S) Protokoll
Hallo,
du hast den Kommentar überlesen? // Request.CharSet vorher setzten: z.B: ISO-8859-1 |
AW: Indy 10 HTTP(S) Protokoll
Zitat:
Wird der ganz einfach mit
Delphi-Quellcode:
gesetzt oder muss ich da noch was beachten?
Request.CharSet := 'UTF-8';
*Edit: Auch wenn das Charset gesetzt wäre, also nur mal angenommen, so wäre es vom Typ immer noch IIdTextEncoding und damit noch inkompatibel zu TEncoding. Eine Idee, wie ich das beheben kann? |
AW: Indy 10 HTTP(S) Protokoll
Hallo,
da bin ich raus ;) Müsste mal auf Arbeit nachsehen, was ich da so gesetzt hatte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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 by Thomas Breitkreuz