Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2013, 21:00   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
Восклицание Не удается отправить русские символы в POST запросе через IdHttp

Второй день мучаюсь.
Формирую список параметров TStringList и отправляю его.
Код:
  ...
  Request:=TStringList.Create;
  BufS:='Ололо';
  Request.Add('counter_1_name='+UTF8ToAnsi(BufS));
  IdHTTP.Post('http://mysite.ru/page.php', Request, ResponseB);
  ...
UTF8ToAnsi менял на все подобные функции, так же на AnsiToUTF8.

На сервер вместо русских букв приходят знаки вопроса. В БД, так же записываются "?".

Для отладки на сервер добавил такую строку
Код:
echo "\n".$_REQUEST['counter_1_name'];
А так же на клиенте вывожу ответ сервера (ответ выводится с кириллицей, проверено).
Код:
ShowMessage(ResponseB.DataString);
И получаю все те же знаки вопроса вместо кириллицы.

Пробовал это дело сделать через TStringStream, но проблема не исчезла.

Последняя часть в программе осталась =(
alextrof94$gmail.com

Последний раз редактировалось alextrof94; 29.12.2013 в 21:03.
alextrof94 вне форума Ответить с цитированием
Старый 29.12.2013, 21:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

попробуй добавь
Request.Add('Content-Type: text/plain; charset=windows-1251');
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2013, 21:13   #3
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
попробуй добавь
Request.Add('Content-Type: text/plain; charset=windows-1251');
не сработало =(
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 30.12.2013, 07:22   #4
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Попробуй использовать StringStream и функцию перекодирования в юникод.
Код:
function StrAnsiToUtf(aStr: string): string;
var
 Encoding, aEncoding: TEncoding;
 Buffer: TBytes;
begin
 Encoding := TEncoding.UTF8;
 aEncoding := TEncoding.Default;
 Buffer := Encoding.GetBytes(aStr);
 TEncoding.Convert(aEncoding, Encoding, Buffer);
 Result := aEncoding.GetString(Buffer);
end;
doktor255 вне форума Ответить с цитированием
Старый 30.12.2013, 19:23   #5
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Как в StringStream параметры забивать? Через пробел?
Код:
StringStr.write('param1=value1 ');
StringStr.write('param2=value2 ');
Так? Или через амперсанду (&)? Или через другой знак?
И надо ли в начале ставить знак вопроса?
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 30.12.2013, 19:26   #6
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

StringStr.write('param1=value1&para m2=value2');
Поток передаётся "как есть", в отличие от StringList;

Последний раз редактировалось doktor255; 30.12.2013 в 19:31.
doktor255 вне форума Ответить с цитированием
Старый 31.12.2013, 21:05   #7
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Делаю
Код:
      Request:=TStringList.Create;
      RequestB:=TStringStream.Create;
      RequestB.WriteString('login='+Settings.Login);
      RequestB.WriteString('&password='+Settings.Password);
      Request.Text:=RequestB.DataString; //тут присваиваю в лист все, что есть в потоке.
      IdHTTP.Post('http://site.ru/getinfo.php', RequestB, ResponseB);//Request
Если передаю поток - возвращается "Bad Authorisation", если лист - все проходит нормально.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 31.12.2013, 22:02   #8
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Снифер в помощь.
doktor255 вне форума Ответить с цитированием
Старый 01.01.2014, 00:01   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я тут про одну функцию вспомнил... URLEncode() кажись называется.
Пример из хелпа инди:
Код:
 AURLString := TIdURI.URLEncode(AString);
Я иногда ей пользуюсь. Попробуй, может исчезнет проблема с юникодом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.01.2014, 00:55   #10
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Если не ошибаюсь UrlEncode используется в адресе запроса, но ни как не в теле, и инди сама применяет эту функцию.
doktor255 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не удается отправить пост Gefo JavaScript, Ajax 2 24.02.2013 16:17
Idhttp.get и русские символы в запросе Pter Работа с сетью в Delphi 7 28.08.2012 16:37
отправить idhttp.post s1s1s1 Работа с сетью в Delphi 4 26.01.2012 17:57
Русские символы Akord Общие вопросы C/C++ 0 26.09.2010 11:17
Как в ProgressBar отобразить процесс выполнения Post запроса через Idhttp Joe_Tribbiani Работа с сетью в Delphi 8 15.06.2009 10:39