Если на сервере есть Content-Encoding: gzip
в заголовках, вы должны распаковать данные.
Вот полный и рабочий пример (проверка содержимого gzipped опущена):
program SO51126032;
{$APPTYPE CONSOLE}
{$R *.res}
uses
IdHttp,
IdZLib,
Classes,
System.SysUtils;
function GetServerData(Url : String) : String;
var
Http : TIdHttp;
Strm : TMemoryStream;
OutStrm : TStringStream;
begin
Http := TIdHttp.Create(nil);
try
Http.HandleRedirects := True;
Http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
Http.Request.AcceptEncoding := 'gzip';
Strm := TMemoryStream.Create;
try
OutStrm := TStringStream.Create(TEncoding.UTF8);
try
Http.Get(URL, Strm);
Strm.Position := 0;
if TextIsSame(Http.Response.ContentEncoding, 'gzip') then
DecompressStream(Strm, OutStrm)
else
OutStrm.CopyFrom(Strm, 0);
end;
Result := OutStrm.DataString;
finally
OutStrm.Free;
end;
finally
Strm.Free;
end;
finally
Http.Free;
end;
end;
begin
try
Writeln(GetServerData('http://129.232.180.125:28019/deaths.json'));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
* РЕКОМЕНДУЕМЫЙ ПУТЬ *
Indy может выполнить тяжелую работу за вас, если вы назначите TIdCompressorZlib
для TIdHTTP
, она автоматически обнаружит сжатый контент и распакует на лету:
uses
IdHttp,
IdCompressorZLib,
System.SysUtils;
function GetServerData(const URL : String) : String;
var
Http : TIdHttp;
begin
Http := TIdHttp.Create(nil);
try
Http.HandleRedirects := True;
Http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
Http.Compressor := TIdCompressorZLib.Create(Http);
Result := Http.Get(URL);
finally
Http.Free;
end;
end;