получить json результат с сайта https - PullRequest
1 голос
/ 18 апреля 2020

Как я могу получить JSON результат с сайта HTTPS?

Я предпочитаю метод, который не требует никакой DLL.

Он показывает эту ошибку:

Ошибка соединения с SSL.error: 1409442E: Подпрограммы SSL: ssl3_read_bytes: версия протокола оповещения tlsv1.

Я использую 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;

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

По умолчанию TIdSSLIOHandlerSocketOpenSSL включает только 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;
0 голосов
/ 19 апреля 2020

Для более новых 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;
...