Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправить POST-запрос в Windows-1251 в Indy


Виктор М. ©   (2011-12-27 14:52:00) 

Как с помощью 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 16:56:00) [1]


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

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

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


sniknik   (2011-12-27 16:32:00) [2]

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

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

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


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

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

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


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


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

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


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

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


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


> Медвежонок Пятачок ©   (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:20:00) [7]

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


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

Сделал так:

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:18:00) [9]

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

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


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

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


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


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

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


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

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


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

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


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


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

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


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

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


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

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

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


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

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

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 14:55:00) [18]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо