|
Antwort |
.
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 Thema. Die DLLs müssen ins root-Verzeichnis eurer Applikation. Zusätzlich müssen wir die Unit IdSSLOpenSSL einbinden. 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 Plugin, welches von einer beliebigen Webseite alle Formularfelder sauber in einer strukturierten Tabelle anzeigen kann. Sprich man muss sich nicht mehr durch den Quelltext-Dschungel kämpfen. Da dies nun mein erstes Tutorial ist, hoffe ich, dass nicht allzu viel falsch gemacht wurde . Geändert von geskill (30. Okt 2015 um 00:14 Uhr) Grund: Updated to TLS 1.2 SSL. |
Delphi 7 Professional |
#2
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
Bernhard
|
Zitat |
rollstuhlfahrer |
Öffentliches Profil ansehen |
Mehr Beiträge von rollstuhlfahrer finden |
|
#3
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.
Chris
|
Zitat |
Delphi XE7 Professional |
#4
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.
|
Zitat |
Delphi 10.2 Tokyo Professional |
#5
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.
Christoph Keil
|
Zitat |
Delphi 2009 Professional |
#6
Seit XE8 gibt es System.Net.HttpClientComponent.TNetHTTPClient, der eine Windows-API verwendet. Bei einfachen GET-Requests würde ich Vcl.ExtActns.TDownloadURL benutzen, das es seit Urzeiten gibt und einfach zu verwenden ist.
Indy benötigt weiterhin OpenSSL.
Janni
|
Zitat |
Delphi 11 Alexandria |
#7
Eine ganz brauchbare Resource für OpenSSL mit anderen Libraries findest Du hier.
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. |
Zitat |
Delphi 10.2 Tokyo Professional |
#8
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.
Christoph Keil
|
Zitat |
|
#9
Seit XE8 gibt es System.Net.HttpClientComponent.TNetHTTPClient, der eine Windows-API verwendet. Bei einfachen GET-Requests würde ich Vcl.ExtActns.TDownloadURL benutzen, das es seit Urzeiten gibt und einfach zu verwenden ist.
Indy benötigt weiterhin OpenSSL. |
Zitat |
Delphi 11 Alexandria |
#10
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. |
Zitat |
Themen-Optionen | Tutorial durchsuchen |
Ansicht | |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
LinkBack |
LinkBack URL |
About LinkBacks |