Search code examples
delphiencodinghttpresponseindydelphi-10-seattle

How to encode the response of an TIdHTTP call?


In a project I use TIdHTTP to call a webserver.

The webserver is an asp.net test application that returns the following json:

{
   "message":"test ÀÈÉÌÒÙàèéìòù"
}

The response I get in Delphi is a kind of not encoded string:

{"message":"test ÃÃÃÃÃÃàèéìòù"}

this is how I use TIdHTTP:

Result := '';
  IdHTTP := TIdHTTP.Create;
  IdHTTP.Request.MethodOverride := 'ForwardCommand';
  IdSSLIOHandlerSocketOpenSSL :=  TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode       := sslmClient;
  IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions:= [sslvTLSv1_2];
  IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
  IdHTTP.HandleRedirects := True;
  IdHTTP.Response.ContentEncoding := 'UTF-8'; // I tried this but it seems not enough! 
  try
    url := 'testappUrl';
    try
      IdHTTP.ConnectTimeout := 2000; 
      IdHTTP.ReadTimeout := 4000; 
      Response := IdHTTP.Get(url);
      ShowMessage(response);
    except
      on E:Exception do
      begin
        response := StringReplace(E.Message,#10,' ',[rfReplaceAll]);
        response := StringReplace(response,#13,' ',[rfReplaceAll]);
        response := '{"errormessage": "'+response+'"}';
      end;
    end;
    Result := response;
  finally
    IdHTTP.Free;
  end;

please tell me how I can see the response correctly. Is there a way to force encoding so that accented chars are read correctly?

Thanks.


Solution

  • Try to use a TStringStream forcing the encoding (UTF-8).
    Test this code to get the response:

    var
      ts:TStringStream;
    begin
    
      ...
    
      ts := TStringStream.Create(string.Empty, TEncoding.UTF8);
      IdHTTP1.Get('url', ts);
    
      ShowMessage(ts.DataString);
        or
      ShowMessage(ts.ToString);
      ...