httpS-Request
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
httpS-Request
Hallo,
Ich habe in der Vergangenheit schon öfter mal versucht, HTTP-Request mit HTTPS zu machen, aber geschafft habe ich es nicht. Aber vielleicht hat sich ja inzwischen etwas getan. Für einige anstehende Projekte wäre das echt gut.
Einfach die Klasse httpsend einbinden und https://... als Adresse übergeben, funktioniert ja bekanntlich nicht. Man muss irgendwie openssl benutzen, aber mehr habe ich noch nicht 'rausgefunden.
Hat jemand ein Beispiel-Code, der ein Paar HTTPS-Requests (Get und Post) durchführen kann?
Vielen Dank.
Ich habe in der Vergangenheit schon öfter mal versucht, HTTP-Request mit HTTPS zu machen, aber geschafft habe ich es nicht. Aber vielleicht hat sich ja inzwischen etwas getan. Für einige anstehende Projekte wäre das echt gut.
Einfach die Klasse httpsend einbinden und https://... als Adresse übergeben, funktioniert ja bekanntlich nicht. Man muss irgendwie openssl benutzen, aber mehr habe ich noch nicht 'rausgefunden.
Hat jemand ein Beispiel-Code, der ein Paar HTTPS-Requests (Get und Post) durchführen kann?
Vielen Dank.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: httpS-Request
Du meinst Synapse nehme ich mal an.
Das geht wirklich recht einfach. Du bindest die Unit Ssl_OpenSsl mit ein (und natürlich HttpSend) und änderst die URL von http:// auf https://.
Und dann musst du sicherstellen, dass die OpenSSL-Bibliotheken auf dem System verfügbar sind. Zum Beispiel indem du (unter Windows) die libeay32.dll und die ssleay32.dll in das gleiche Verzeichnis wie deine EXE packst. Wichtige ist, dass die Version von OpenSSL stimmt (im aktuellen Release von Synapse müsste es 0.9.7 sein). Infos dazu stehen im Header der Ssl_OpenSsl-Unit.
Das geht wirklich recht einfach. Du bindest die Unit Ssl_OpenSsl mit ein (und natürlich HttpSend) und änderst die URL von http:// auf https://.
Und dann musst du sicherstellen, dass die OpenSSL-Bibliotheken auf dem System verfügbar sind. Zum Beispiel indem du (unter Windows) die libeay32.dll und die ssleay32.dll in das gleiche Verzeichnis wie deine EXE packst. Wichtige ist, dass die Version von OpenSSL stimmt (im aktuellen Release von Synapse müsste es 0.9.7 sein). Infos dazu stehen im Header der Ssl_OpenSsl-Unit.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Hmm, das habe ich versucht, aber es ändert nichts. Sobald ich https:// schreibe, gibt HttpGetText false zurück...
Mun muss doch noch irgendwas mit ssl_openssl machen - oder soll httpsend automatisch erkennen, dass man das eingebunden hat?
Mun muss doch noch irgendwas mit ssl_openssl machen - oder soll httpsend automatisch erkennen, dass man das eingebunden hat?
Re: httpS-Request
Wie heisst denn die URL? Ich habe hier keine Probleme z.B. mit
https://alice.sni.velox.ch/
https://www.ssllabs.com/ssltest/
Mit ssl_openssl musst du nichts machen.
https://alice.sni.velox.ch/
https://www.ssllabs.com/ssltest/
Mit ssl_openssl musst du nichts machen.
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Aktuell geht es um hems-renewables.de - dort muss man das Zertifikat im Browser extra annehmen, aber ich habe eben https://www.ssllabs.com/ssltest/ getestet und es ging auch nicht.
Was ich auch merkwürdig finde ist, dass gar kein Fehler kommt, wenn ich die DLLs nicht im Programmordner habe. Darauf wird anscheinend gar nicht zugegriffen - jedenfalls sind die bei mir auch nicht in system32 oder so. Vielleicht habe ich die falschen DLLs und die können nicht geladen werden. Aber wie gesagt: Es kommt kein Fehler. Nur HTTPGetText gibt false zurück.
Vielleicht verwendet ihr etwas mit POST?
Was ich auch merkwürdig finde ist, dass gar kein Fehler kommt, wenn ich die DLLs nicht im Programmordner habe. Darauf wird anscheinend gar nicht zugegriffen - jedenfalls sind die bei mir auch nicht in system32 oder so. Vielleicht habe ich die falschen DLLs und die können nicht geladen werden. Aber wie gesagt: Es kommt kein Fehler. Nur HTTPGetText gibt false zurück.
Vielleicht verwendet ihr etwas mit POST?
Re: httpS-Request
Wahrsch. hast du Windows 64bit Lazarus. Das geht afaik nicht mit den 32bit DLLs von hier http://synapse.ararat.cz/files/crypt/
Auf Linux geht's auch mit 64bit.
Versuche es mit der 32bit Version und den DLLs aus dem Link oder suche passende 64bit Varianten.
Auf Linux geht's auch mit 64bit.
Versuche es mit der 32bit Version und den DLLs aus dem Link oder suche passende 64bit Varianten.
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Ahaa, es lag wirklich an falschen DLLs. Ich habe jetzt das Zip "Openssl-0.9.8d-Win32.zip" runtergeladen. Als ich die DLLs davon im Programmordner abgelegt habe, zeigte sich eine erste Reaktion: Es kam die Meldung "Programm kann nicht gestartet werden, da msvcr71.dll fehlt". Gestartet ist es dann trotzdem, aber es ging noch nicht... Ich also auf C nach dieser DLL gesucht und auch noch in den Programmordner kopiert und es lief 
Meine msvcr71.dll war bei Sweet Home 3D dabei, kompiliert habe ich mit Lazarus für Win32.
Also vielen Dank euch allen.

Meine msvcr71.dll war bei Sweet Home 3D dabei, kompiliert habe ich mit Lazarus für Win32.
Also vielen Dank euch allen.
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Hmm, es gibt noch ein Problem: Das Programm hängt sich bei mir etwa alle 25.000 Requests auf. Die Funktion HTTPGetText bleibt dann hängen, auf unbestimmte Zeit. Ich kann das Programm dann nur noch per Taskmanager beenden. Für mein automatisches System, dass dauerhaft läuft und alle 10 Sekunden ein Request absetzt, ist das ziemlich hinderlich.
Da der Fehler so selten auftritt, konnte ich bislang nicht mehr dazu rausfinden.
Gibt es eine Möglicheit, den Thread, der die Uploads macht, programmintern neuzustarten? Hatte von euch schon jemand dieses Problem?
Ich teste gerade, ob das Problem mit anderen DLLs auch auftritt... Auf dem Zielsystem waren andere Versionen der benötigten DLLs schon vorhanden. Jetzt versuche ich die, die hier auch verlinkt sind. Wenn ich bis in 4 Wochen nicht geantwortet habe, ist das Problem zu 99,99%iger Wahrscheinlichkeit damit gelöst
Da der Fehler so selten auftritt, konnte ich bislang nicht mehr dazu rausfinden.
Gibt es eine Möglicheit, den Thread, der die Uploads macht, programmintern neuzustarten? Hatte von euch schon jemand dieses Problem?
Ich teste gerade, ob das Problem mit anderen DLLs auch auftritt... Auf dem Zielsystem waren andere Versionen der benötigten DLLs schon vorhanden. Jetzt versuche ich die, die hier auch verlinkt sind. Wenn ich bis in 4 Wochen nicht geantwortet habe, ist das Problem zu 99,99%iger Wahrscheinlichkeit damit gelöst

-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: httpS-Request
Ich hatte mit Synapse (ohne httpget ohne ssl) mal das Problem, dass mir nicht klar war, dass man vor dem Request den Buffer löschen muss, weil ansonsten der - dadurch immer größer werdende - empfangene Inhalt wieder mit dem Request zum Server geschickt wird, wodurch dieser dann irgendwann blockierte. Synapse geht davon aus, dass das Objekt immer neu Instanziiert wird, wenn man es mehrfach verwendet muss man den Buffer löschen, was in der Doku nicht klar erwähnt wird.
Unabhängig davon muss ein "embedded" (automatisches) System immer so programmiert werden, dass ein Aufhängen (das ein Watchdog erkennen muss) durch eine möglichst brutale Maßnahme (Neustart) korrigiert wird.
-Michael
Unabhängig davon muss ein "embedded" (automatisches) System immer so programmiert werden, dass ein Aufhängen (das ein Watchdog erkennen muss) durch eine möglichst brutale Maßnahme (Neustart) korrigiert wird.
-Michael
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Nunja, das System wird ja jeden Tag neugestartet. Den Befehl dafür gibt aber auch mein Programm - ich weiß, ich sollte dafür einen separaten Prozess laufen lassen. Aber bisher lief es ja ohne Probleme.
Wie lösche ich denn den Buffer? (Die anderen DLLs haben das Problem nicht gelöst
)
Wie lösche ich denn den Buffer? (Die anderen DLLs haben das Problem nicht gelöst

Re: httpS-Request
Clear könnte helfen.
Noch sicherer: THTTPSend vor jedem Gebrauch neu createn und danach freen.
Noch sicherer: THTTPSend vor jedem Gebrauch neu createn und danach freen.
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Ok, danke.
Und falls es sich trotzdem aufhängt - gibt es eine elegantere Methode, den hängenden Thread zu beenden, als Taskkill?
Und falls es sich trotzdem aufhängt - gibt es eine elegantere Methode, den hängenden Thread zu beenden, als Taskkill?
-
- Lazarusforum e. V.
- Beiträge: 395
- Registriert: Sa 15. Mai 2010, 13:46
- CPU-Target: 64 bit
- Kontaktdaten:
Re: httpS-Request
Hallo,
ich hatte bis gestern Klausuren und konnte mich erst jetzt an eine Lösung machen... Also dass ich die THTTP-Send-Klasse nicht freigebe, ist nicht die Ursache. Ich habe ja bislang direkt die Funktion HTTPGetText verwendet, welche folgender Maßen implementiert ist:
Ich werde das mal zu einem HTTPPostText umfunktionieren, aber das Bug muss irgendwo anders liegen...
ich hatte bis gestern Klausuren und konnte mich erst jetzt an eine Lösung machen... Also dass ich die THTTP-Send-Klasse nicht freigebe, ist nicht die Ursache. Ich habe ja bislang direkt die Funktion HTTPGetText verwendet, welche folgender Maßen implementiert ist:
Code: Alles auswählen
function HttpGetText(const URL: string; const Response: TStrings): Boolean;
var
HTTP: THTTPSend;
begin
HTTP := THTTPSend.Create;
try
Result := HTTP.HTTPMethod('GET', URL);
if Result then
Response.LoadFromStream(HTTP.Document);
finally
HTTP.Free;
end;
end;