Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.04.27;
Скачать: CL | DM;

Вниз

Отправить POST-запрос в Windows-1251 в Indy   Найти похожие ветки 

 
Виктор М.   (2011-12-27 14:52) [0]

Как с помощью Indy отправить HTTP POST-запрос на сервер в кодировке Windows-1251?
У меня Delphi XE, здесь все юникодное, и запросы отправляются в UTF-8. А сервер принимает только cp1251.

Отправляю так:

Http := TIdHttp.Create;
try
 PostList := TStringList.Create;
 try
PostList.Values["login"] := Login;
PostList.Values["password"] := Password;

Stream := TStringStream.Create;
try
  Http.Post(Url, PostList, Stream);
finally
  Stream.Free;
end;
 finally
PostList.Free;
 end;
finally
 Http.Free;
end;


 
Медвежонок Пятачок ©   (2011-12-27 14:55) [1]

сделать буфер из ansistring


 
Виктор М.   (2011-12-27 15:08) [2]

Не получается. Сделал так:

type
 CyrillicString = type AnsiString(1251);

PostList.Values["login"] := Login;
PostList.Values["password"] := Password;

SendStream := TStringStream.Create;
try
 CyrillicText := CyrillicString(PostList.Text);

 if Length(CyrillicText) > 0 then
SendStream.WriteBuffer(CyrillicText[1], Length(CyrillicText));

 Http.Post(Url, SendStream, Stream);
finally
 SendStream.Free;
end;



Не работает, проверил на локальном сервере -- приходит пустой $_POST. Что не правильно?


 
Виктор М.   (2011-12-27 15:09) [3]

Да, также указал
Http.Request.ContentEncoding := "Windows-1251";
Http.Request.CharSet := "Windows-1251";

Но эффекта ноль.


 
Медвежонок Пятачок ©   (2011-12-27 15:11) [4]

неправилен твой стрингстрим который работает со string.


 
Виктор М.   (2011-12-27 15:12) [5]


> Медвежонок Пятачок ©   (27.12.11 15:11) [4]
> неправилен твой стрингстрим который работает со string.

А как надо? Подскажи, поажлуйста.


 
Медвежонок Пятачок ©   (2011-12-27 15:13) [6]

ансистринг нужен.


 
Ega23 ©   (2011-12-27 15:14) [7]

with TMemoryStream.Create do
 WriteBuffer(PAnsiChar(s)^, Length(s));


 
Виктор М.   (2011-12-27 15:15) [8]


> Медвежонок Пятачок ©   (27.12.11 15:13) [6]
> ансистринг нужен.

Заменил на TMemoryStream -- эффекта ноль (


 
Медвежонок Пятачок ©   (2011-12-27 15:17) [9]

замени тип строки


 
Медвежонок Пятачок ©   (2011-12-27 15:18) [10]

Не работает, проверил на локальном сервере -- приходит пустой $_POST. Что не правильно?

Стоп.
А при чем здесь вообще 1251/utf?


 
Виктор М.   (2011-12-27 15:19) [11]

Сделал так:

var
CyrillicText: AnsiString;
...
PostList := TStringList.Create;
try
PostList.Values["login"] := Login;
PostList.Values["psw"] := Password;

Http.Request.ContentEncoding := "Windows-1251";
Http.Request.CharSet := "Windows-1251";

SendStream := TMemoryStream.Create;
try
  CyrillicText := AnsiString(PostList.Text);

  SendStream.WriteBuffer(PAnsiChar(CyrillicText)^, Length(CyrillicText));

  Http.Post(Url, SendStream, Stream);
finally
  SendStream.Free;
end;
finally
PostList.Free;
end;


На сервере все равно оказывается пустой $_POST :(


 
Медвежонок Пятачок ©   (2011-12-27 15:20) [12]

шикарно.
у него сервер вообще не ловит пост, а чувак бьется с кодировкой.


 
Виктор М.   (2011-12-27 15:21) [13]


> Медвежонок Пятачок ©   (27.12.11 15:18) [10]
> Не работает, проверил на локальном сервере -- приходит пустой
> $_POST. Что не правильно?Стоп.А при чем здесь вообще 1251/utf?
>

Если вот эту строчку
Http.Post(Url, SendStream, Stream);
меняю на эту:
Http.Post(Url, PostList, Stream);

то приходит все правильно, в $_POST -- логин и пароль. Но в UTF-8


 
Медвежонок Пятачок ©   (2011-12-27 15:29) [14]

ну так и какой вывод?
в одном случае пост-блок сформировался верно и распознан в твоем похапе.
в другом пост блок инвалидный и не парсится сервером


 
Виктор М.   (2011-12-27 15:31) [15]


> Медвежонок Пятачок ©   (27.12.11 15:29) [14]
> ну так и какой вывод?в одном случае пост-блок сформировался
> верно и распознан в твоем похапе.в другом пост блок инвалидный
> и не парсится сервером

Да, но почему он инвалидный? Все же правильно вроде.


 
Медвежонок Пятачок ©   (2011-12-27 15:40) [16]

он невалидный потому что php так решило.
и этого достаточно.

сравнивай оба случая анализируя не $_POST, а php://input


 
sniknik ©   (2011-12-27 16:32) [17]

поставь
Http.Request.ContentType:= "application/x-www-form-urlencoded";
перед постом

не помню точно но где то в индях встречал прямую зависимость... заполнение только если установлено (версию после откатил, проверить не могу).

> Http.Post(Url, PostList, Stream);
вот кстати посмотри перекрытый метод, там должно быть(было) что-то вроде установки этого параметра, а после вызов того что со стримом...


 
Виктор М.   (2011-12-27 16:56) [18]


> поставь Http.Request.ContentType:= "application/x-www-form-
> urlencoded";перед постомне помню точно но где то в индях
> встречал прямую зависимость... заполнение только если установлено
> (версию после откатил, проверить не могу).

Да, сделал это и помогло, только пришлось еще писать функцию URLEncode для ANSIString. Но все заработало.

Всем большое спасибо за помощь.



Страницы: 1 вся ветка

Текущий архив: 2014.04.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.005 c
1-1314088912
malphunction
2011-08-23 12:41
2014.04.27
[Delphi XE] Дочерняя форма НЕ активизировала родительское окно


2-1374061475
Vasa777
2013-07-17 15:44
2014.04.27
процедура по имени


4-1268990516
Delphi User
2010-03-19 12:21
2014.04.27
NtQuerySystemInformation


2-1374245465
loser
2013-07-19 18:51
2014.04.27
Вызов функции из DLL в методе объекта


3-1297252094
Гость
2011-02-09 14:48
2014.04.27
Подскажите как получить таблицу-матрицу запросом в MSSQL