В предыдущей
статье мы привели решение для отправки параметров, содержащих русские символы, в нормальной кодировке. Это решение использует потоки в методе
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).
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.