如何在 Delphi 中下载一个非常简单的 HTTPS 页面?
How to download a very simple HTTPS page in Delphi?
我尝试了此处看到的代码,但它不适用于 HTTPS。我需要将此页面作为字符串下载,并在其上添加一些换行以将信息按顺序放入 TMemo。
怎么做?我尝试使用 Indy,但由于 SSL 而失败了。
我尝试了此页面的解决方案:How to download a web page into a variable?
如何下载此页面 https://api.rastrearpedidos.com.br/api/rastreio/v1?codigo=OP133496280BR 那只是纯文本并放入字符串中?并在 TMemo 的行中像这样格式化:
"Objeto em trânsito - por favor aguarde"
"cidade":"SAO JOSE DOS CAMPOS"
"uf":"SP"
"dataHora":"18/06/2021 16:53"
"descricao":"Objeto postado","cidade":"SAO JOSE DOS CAMPOS","uf":"SP"
是葡萄牙语,英语不是我的母语。谢谢你们能帮助我。我使用 Embarcadero Delphi 10.2 Tokyo.
使用 Indy 时,假设您使用 Indy 的默认 TIdSSLIOHandlerSocketOpenSSL
组件来支持 SSL/TLS,那么请确保将 2 个 OpenSSL DLL,ssleay32.dll
和 libeay32.dll
,在与您的 EXE 相同的文件夹中。您可以从这里获取它们:
https://github.com/IndySockets/OpenSSL-Binaries
请注意 TIdSSLIOHandlerSocketOpenSSL
最多只支持 OpenSSL 1.0.2。如果您需要改用 OpenSSL 1.1.x(对于 TLS 1.3+ 等),则改用 use this SSLIOHandler
。您将不得不从其他地方获取相关的 OpenSSL DLL,或者自己编译它们。
无论哪种方式,一旦您决定要使用哪个 SSLIOHandler
,代码就相当简单:
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Response: string;
begin
HTTP := TIdHTTP.Create(nil);
try
// configure HTTP as needed (version, headers, etc)...
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
// configure SSL as needed (TLS versions, certificates, etc)...
HTTP.IOHandler := SSL;
Response := HTTP.Get('https://api.rastrearpedidos.com.br/api/rastreio/v1?codigo=OP133496280BR');
finally
HTTP.Free;
end;
// use Response as needed...
end;
您还可以使用:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Request: TScHttpWebRequest;
Response: TScHttpWebResponse;
ResponseStr: String;
JSonValue: TJSonValue;
JsonArray: TJsonArray;
Name: String;
UserName: String;
Email: String;
begin
Request := TScHttpWebRequest.Create('https://jsonplaceholder.typicode.com/users');
try
Response := Request.GetResponse;
try
if Request.IsSecure then begin
ResponseStr := Response.ReadAsString;
JsonArray := TJSonObject.ParseJSONValue(ResponseStr) as TJsonArray;
try
for i:=0 to JsonArray.Count - 1 do begin
JsonValue := JsonArray.Items[i];
Name := JsonValue.GetValue('name');
UserName := JsonValue.GetValue('username');
Email := JsonValue.GetValue('email');
Memo1.Lines.Add('Name: ' + Name + ' - UserName: ' + UserName + ' - Email: ' + Email);
end;
finally
JsonArray.Free;
end;
end;
finally
Response.Free;
end;
finally
Request.Free;
end;
end;
我尝试了此处看到的代码,但它不适用于 HTTPS。我需要将此页面作为字符串下载,并在其上添加一些换行以将信息按顺序放入 TMemo。
怎么做?我尝试使用 Indy,但由于 SSL 而失败了。
我尝试了此页面的解决方案:How to download a web page into a variable?
如何下载此页面 https://api.rastrearpedidos.com.br/api/rastreio/v1?codigo=OP133496280BR 那只是纯文本并放入字符串中?并在 TMemo 的行中像这样格式化:
"Objeto em trânsito - por favor aguarde"
"cidade":"SAO JOSE DOS CAMPOS"
"uf":"SP"
"dataHora":"18/06/2021 16:53"
"descricao":"Objeto postado","cidade":"SAO JOSE DOS CAMPOS","uf":"SP"
是葡萄牙语,英语不是我的母语。谢谢你们能帮助我。我使用 Embarcadero Delphi 10.2 Tokyo.
使用 Indy 时,假设您使用 Indy 的默认 TIdSSLIOHandlerSocketOpenSSL
组件来支持 SSL/TLS,那么请确保将 2 个 OpenSSL DLL,ssleay32.dll
和 libeay32.dll
,在与您的 EXE 相同的文件夹中。您可以从这里获取它们:
https://github.com/IndySockets/OpenSSL-Binaries
请注意 TIdSSLIOHandlerSocketOpenSSL
最多只支持 OpenSSL 1.0.2。如果您需要改用 OpenSSL 1.1.x(对于 TLS 1.3+ 等),则改用 use this SSLIOHandler
。您将不得不从其他地方获取相关的 OpenSSL DLL,或者自己编译它们。
无论哪种方式,一旦您决定要使用哪个 SSLIOHandler
,代码就相当简单:
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Response: string;
begin
HTTP := TIdHTTP.Create(nil);
try
// configure HTTP as needed (version, headers, etc)...
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
// configure SSL as needed (TLS versions, certificates, etc)...
HTTP.IOHandler := SSL;
Response := HTTP.Get('https://api.rastrearpedidos.com.br/api/rastreio/v1?codigo=OP133496280BR');
finally
HTTP.Free;
end;
// use Response as needed...
end;
您还可以使用:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Request: TScHttpWebRequest;
Response: TScHttpWebResponse;
ResponseStr: String;
JSonValue: TJSonValue;
JsonArray: TJsonArray;
Name: String;
UserName: String;
Email: String;
begin
Request := TScHttpWebRequest.Create('https://jsonplaceholder.typicode.com/users');
try
Response := Request.GetResponse;
try
if Request.IsSecure then begin
ResponseStr := Response.ReadAsString;
JsonArray := TJSonObject.ParseJSONValue(ResponseStr) as TJsonArray;
try
for i:=0 to JsonArray.Count - 1 do begin
JsonValue := JsonArray.Items[i];
Name := JsonValue.GetValue('name');
UserName := JsonValue.GetValue('username');
Email := JsonValue.GetValue('email');
Memo1.Lines.Add('Name: ' + Name + ' - UserName: ' + UserName + ' - Email: ' + Email);
end;
finally
JsonArray.Free;
end;
end;
finally
Response.Free;
end;
finally
Request.Free;
end;
end;