如何通过 INDY 在 Delphi 10.3 中使用 HTTPS
How to use HTTPS in Delphi 10.3 with INDY
大家好,所有的程序员,
目前我想弄清楚如何将 HTTPS 请求 (POST) 与 Delphi 一起使用。
我有这段代码:
uses ..., IdHTTP, IdSSLOpenSSL;
....
procedure TForm2.Button4Click(Sender: TObject);
var
PostStrings :TStringList;
ResponseStream :TStringStream;
ausgabe :String;
zeile :String;
i :Integer;
s :array of string;
Strings :TStringList;
Stream :TStringStream;
begin
Stream := TStringStream.Create('');
Strings := TStringList.Create;
try
Strings.Add('Noone='+Edit1.Text);
Strings.Add('Foo='+Edit2.Text);
IdHTTP1 := TIdHTTP.Create(nil);
try
IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
IdHTTP1.HandleRedirects := True;
idHTTP1.Post('https://api.mysitefortest.de/postit.php', Strings,stream);
ausgabe := Stream.DataString;
zeile := '';
for i:=1 to Length(ausgabe) do begin
if (ausgabe[i]=#13) and (ausgabe[i+1]=#10) then begin
ResponseMemo.Lines.Add(zeile);
zeile:='';
end else if s[i]<>#10 Then zeile:=zeile+ausgabe[i];
end;
ResponseMemo.Lines.Add(zeile);
except
on E: Exception do
showmessage('Error encountered during POST: ' + E.Message);
end;
finally
Strings.Free;
Stream.Free;
end;
end;
php 文件:
<?php
echo 'Noone: '.$zitatArray["Noone"];
echo Chr(13).Chr(10);
echo 'Foo: '.$zitatArray["Foo"];
?>
如果我按下发送按钮,就会出现错误。它说,无法加载 ssl.-library。
MMhhh - 如何在 indy 中使用 ssl 似乎是个秘密。我搜索了 google 但没有找到明确的示例。
我想我需要一个 ssl 库。但是哪一个?如何在我的 Delphi 中使用它?从哪里获取?
希望有人能帮忙解释一下——也希望其他程序员能解决这个问题??
谢谢
(抱歉,如果我的代码不清楚 - 我还在学习 ;))
我怀疑您可能没有安装 SSL 库。
使用 OpenSSL(在此处安装 https://slproweb.com/products/Win32OpenSSL.html)
这里是使用 Indy 10 到 POST a body with headers using SSL/TLS 1.2
的例子
建立连接
uses
SysUtils, Classes, uTAuthToken, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
IdSSL,IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdIntercept, IdHTTP, IdCoder, IdCoder3to4, IdCoderMIME;
var
fIdHTTP: TIdHTTP;
fIdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
fIdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
with fIdSSLIOHandlerSocketOpenSSL.SSLOptions do begin
Method := sslvTLSv1_2;
Mode := sslmClient;
SSLVersions := [sslvTLSv1_2];
end;
fIdHTTP := TIdHTTP.Create(nil);
if aConnectTimeout>100 then
fIdHTTP.ConnectTimeout := aConnectTimeout;
if aReadTimeout>100 then
fIdHTTP.ReadTimeout := aReadTimeout;
fIdHTTP.IOHandler := fIdSSLIOHandlerSocketOpenSSL;
if aProxyServer<>'' then begin
with fIdHTTP.ProxyParams do begin
ProxyServer := aProxyServer;
ProxyPort := aProxyPort;
end;
end;
给 post 一个 body 授权 header
aResponse := '';
aError := '';
aParams := TStringStream.create(aMessage);
try
with fIdHTTP do begin
Request.Clear;
Request.CustomHeaders.Clear;
Request.CustomHeaders.Add(Format('Authorization: Bearer %s',[access_token]));
Request.ContentType := 'application/json';
Response.KeepAlive := False;
aResponse := Post(aUri, aParams);
aResponse := aResp;
end;
finally
aParams.Free;
end;
HTH
大家好,所有的程序员,
目前我想弄清楚如何将 HTTPS 请求 (POST) 与 Delphi 一起使用。 我有这段代码:
uses ..., IdHTTP, IdSSLOpenSSL;
....
procedure TForm2.Button4Click(Sender: TObject);
var
PostStrings :TStringList;
ResponseStream :TStringStream;
ausgabe :String;
zeile :String;
i :Integer;
s :array of string;
Strings :TStringList;
Stream :TStringStream;
begin
Stream := TStringStream.Create('');
Strings := TStringList.Create;
try
Strings.Add('Noone='+Edit1.Text);
Strings.Add('Foo='+Edit2.Text);
IdHTTP1 := TIdHTTP.Create(nil);
try
IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
IdHTTP1.HandleRedirects := True;
idHTTP1.Post('https://api.mysitefortest.de/postit.php', Strings,stream);
ausgabe := Stream.DataString;
zeile := '';
for i:=1 to Length(ausgabe) do begin
if (ausgabe[i]=#13) and (ausgabe[i+1]=#10) then begin
ResponseMemo.Lines.Add(zeile);
zeile:='';
end else if s[i]<>#10 Then zeile:=zeile+ausgabe[i];
end;
ResponseMemo.Lines.Add(zeile);
except
on E: Exception do
showmessage('Error encountered during POST: ' + E.Message);
end;
finally
Strings.Free;
Stream.Free;
end;
end;
php 文件:
<?php
echo 'Noone: '.$zitatArray["Noone"];
echo Chr(13).Chr(10);
echo 'Foo: '.$zitatArray["Foo"];
?>
如果我按下发送按钮,就会出现错误。它说,无法加载 ssl.-library。
MMhhh - 如何在 indy 中使用 ssl 似乎是个秘密。我搜索了 google 但没有找到明确的示例。 我想我需要一个 ssl 库。但是哪一个?如何在我的 Delphi 中使用它?从哪里获取?
希望有人能帮忙解释一下——也希望其他程序员能解决这个问题??
谢谢
(抱歉,如果我的代码不清楚 - 我还在学习 ;))
我怀疑您可能没有安装 SSL 库。 使用 OpenSSL(在此处安装 https://slproweb.com/products/Win32OpenSSL.html)
这里是使用 Indy 10 到 POST a body with headers using SSL/TLS 1.2
的例子建立连接
uses
SysUtils, Classes, uTAuthToken, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
IdSSL,IdSSLOpenSSL, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdIntercept, IdHTTP, IdCoder, IdCoder3to4, IdCoderMIME;
var
fIdHTTP: TIdHTTP;
fIdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
fIdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
with fIdSSLIOHandlerSocketOpenSSL.SSLOptions do begin
Method := sslvTLSv1_2;
Mode := sslmClient;
SSLVersions := [sslvTLSv1_2];
end;
fIdHTTP := TIdHTTP.Create(nil);
if aConnectTimeout>100 then
fIdHTTP.ConnectTimeout := aConnectTimeout;
if aReadTimeout>100 then
fIdHTTP.ReadTimeout := aReadTimeout;
fIdHTTP.IOHandler := fIdSSLIOHandlerSocketOpenSSL;
if aProxyServer<>'' then begin
with fIdHTTP.ProxyParams do begin
ProxyServer := aProxyServer;
ProxyPort := aProxyPort;
end;
end;
给 post 一个 body 授权 header
aResponse := '';
aError := '';
aParams := TStringStream.create(aMessage);
try
with fIdHTTP do begin
Request.Clear;
Request.CustomHeaders.Clear;
Request.CustomHeaders.Add(Format('Authorization: Bearer %s',[access_token]));
Request.ContentType := 'application/json';
Response.KeepAlive := False;
aResponse := Post(aUri, aParams);
aResponse := aResp;
end;
finally
aParams.Free;
end;
HTH