从 https 站点检索 json 结果

retrieve a json result from a https site

如何从 HTTPS 站点检索 JSON 结果?

比起不需要任何 DLL,我更喜欢方法。

显示此错误:

Error connecting with SSL.error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version.

我正在使用 Delphi 东京 10.2。

function GetUrlContent(s: string): string;
var
  IdHTTP1: TIdHTTP;
begin
  IdHTTP1 := TIdHTTP.Create;
  try
    Result := IdHTTP1.Get(s);
  finally
    IdHTTP1.Free;
  end;
end;

procedure GetData;
var
  mydata, ordername: string;
begin
  ordername := 'https://www.bitstamp.net/api/ticker/';
  mydata := GetUrlContent(ordername);
  DBMemo7.Text := mydata;
end;

我也试过了,但它仍然会出现令人讨厌的 SSL 错误:

function GetURLAsStrin1(const aurl:  string): string;
var
  res, req: String;
  sList: TStringList;
  IdHttp: TIdHttp;
begin
  IdHttp := TIdHttp.Create (nil);
  try
    IdHttp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHttp);

    req := aurl;
    res := IdHttp.Get (req);

    result := res;
  finally
    idHttp.Free;
  end;

默认情况下,TIdSSLIOHandlerSocketOpenSSL enables only TLS 1.0。最有可能的是,相关站点不再支持 TLS 1.0。尝试启用 TLS 1.1 和 1.2,例如:

function GetUrlContent(url: string): string;
var
  IdHTTP1: TIdHTTP;
begin
  IdHTTP1 := TIdHTTP.Create;
  try
    IO := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
    IO.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2] // <-- add this!
    IdHttp.IOHandler := IO;
    Result := IdHTTP1.Get(url);
  finally
    IdHTTP1.Free;
  end;
end;

对于较新的 delphi 版本,我建议使用内置的 HttpClient class。它不需要任何外部 DLL,开箱即用地适用于 http 或 https。

uses
  System.Net.HttpClient;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text := GetUrlContent('https://www.bitstamp.net/api/ticker/');
end;

function TForm1.GetUrlContent(Url: string): string;
var
  HttpClient: THttpClient;
  Response: IHttpResponse;
begin
  HttpClient := THTTPClient.Create;
  try
    Response := HttpClient.Get(URL);
    Result := Response.ContentAsString();
  finally
    HttpClient.Free;
  end;
end;