【问题标题】:retrieve a json result from a https site从 https 站点检索 json 结果
【发布时间】:2020-04-18 20:06:45
【问题描述】:

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

我更喜欢不需要任何 DLL 的方法。

它显示这个错误:

与 SSL 连接时出错。error:1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本。

我使用的是 Delphi Tokyo 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;

【问题讨论】:

    标签: delphi delphi-10.2-tokyo


    【解决方案1】:

    默认情况下,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;
    

    【讨论】:

      【解决方案2】:

      对于较新的 delphi 版本,我建议使用内置的 HttpClient 类。它不需要任何外部 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;
      

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多