FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

08.10.2010 Indy TIdHTTP.POST и русские символы в HTML

Indy GET POST
В предыдущей статье мы привели решение для отправки параметров, содержащих русские символы, в нормальной кодировке. Это решение использует потоки в методе TIdHTTP.POST и умеет нормально отправлять параметры как в Unicode, так и в Ansi кодировках. Однако решив одну проблему, мы получили другую - возвращаемый нам HTML текст в таком варианте POST иногда имеет неверную кодировку в случае charset=windows-1251. 
Какую-либо закономерность автору уловить не удалось, в одних случаях с таких сайтов приходит читабельный текст, в других-нет. Эти проблемы удалось решить чтением в поток возвращаемого методом TIdHTTP.POST ответа и перекодированием его в необходимую кодировку. Для UTF перекодирование не требуется. 
Ниже приведен текст функции POST, которая использует дополнения, описанные выше, и методику предыдущей статьи, а также функцию EncodeString, которая не изменилась и здесь не приводится.  

function THTTP1.HTTP_Post(URL: string): string;
  var SStream: TStringStream;
      RStream: TStream;
      Strings: TStringList;
      Params: string;
      i: integer;
begin
  Result:='';
  WriteCookies(url);
  Params:='';
  for i := 0 to FParams.Count - 1 do
  begin
    if FCodePage=CP_UTF8 then
      Params:=Params+FParams.Names[i]+'='+EncodeString(FParams.Values[FParams.Names[i]]) else
        Params:=Params+FParams.Names[i]+'='+FParams.Values[FParams.Names[i]];
    if i<>FParams.Count - 1 then Params:=Params+'&';

  end;
  SStream:=TStringStream.Create(Params,FCodePage);
  try
    if FCodePage=CP_UTF8 then
      Result:=http.Post(URL,SStream) else
    begin
      RStream := TMemoryStream.Create;
      Strings:=TStringList.Create;
      try
        http.Post(url,SStream,RStream);
        RStream.Position := 0;
        Strings.LoadFromStream(RStream);
        Result:=Strings.Text;
      finally
        Strings.Free;
        RStream.Free;
      end;
    end;
  finally
    SStream.Free;
  end;
  ReadCookies(URL);
end;
В приведенной функции используются процедуры ReadCookies и WriteCookies, которые описаны в статье "Indy Cookie Manager своими руками". Если требуется использование стандартного TIdCookieManager, то вызов этих функций можно исключить. Список параметров FParams для TIdHTTP.POST запроса должен быть заполнен заранее, как и заранее должна быть установлена кодировка в FCodePage (кодировку можно автоматически вычислить проанализировав ответ, полученный методом GET и считав значение параметра charset). 
www.foxbase.ru


Смотрите также:



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.