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

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

Можно ли заставить работать NMHTTP1.Post ? [D6]


kaif ©   (2008-03-05 21:03:00) 

При отсылке параметров методом Post до сервера они не доходят.
NMHTTP1.Post(url, 'param1=value1¶m2=value2');
С проблемой многие сталкивались, судя по тому, что я вижу в google и yandex-е. Но решения ни у кого не нашел. Отсылку параметров файлом не предлагать. Она работает, но я хочу разобраться с отсылкой, которая приведена в каноническом демонстрационном примере для метода Post.
Url-кодирование параметров тоже не помогает, впрочем, даже один простейший параметр вида 'station_id=1' не отправляется.
Исходного кода TNMHTTP у меня нет, что он там делает, я не знаю. В чем затык? Кто-нибудь знает?


kaif   (2008-03-06 17:14:00) [1]

2 Сергей М. ©   (06.03.08 12:49) [2]
Да в общем-то я все, что нужно было реализовал.
Еще я ftp-компонент с этой палитры забраковал.
Но HTTP вроде работает (кроме метода Post).
:)


Сергей М.   (2008-03-06 12:49:00) [2]


> Исходного кода TNMHTTP у меня нет


Его ни у кого нет, не только у тебя.


> Похоже, что метод Post этого компонента содержит существенный
> баг


И если бы он был единственным !

Засады в FastNet-компонентах могут поджидать в самых неожиданных местах, и было бы лучше не ждать их и не надеяться на авось, а взять на вооружение любой другой компонент, пусть и плохенький с т.з. функциональности, но с исх.текстами.


kaif   (2008-03-06 12:35:00) [3]

Похоже, что метод Post этого компонента содержит существенный баг.
Я написал на ASP.NET тестовый сайт и решил отладить на нем. Посмотреть, что же посылает NMHTTP на самом деле. Так вот, выяснилось, что он посылает такую хрень:

POST /ErrorTest/Default.aspx HTTP/1.0
Content-Length: 57
Content-Type: application/x-www-form-urlencoded
Accept: image/x-rgb, image/x-xbm, image/gif, */*, application/postscript
Host: localhost

station%5Fid%3D1%26text%3D%E2%E0%F1%FF+%EF%F3%EF%EA%E8%ED


В данном случае я в качестве "параметров" пытался передать в метод компонента Post(url, s) такую строку:

s = 'station_id=1&text=вася пупкин.';

Из распечатки тела запроса видно, что компонент закодировал и знаки = и &, что, скорее всего, недопустимо. В результате сервер не смог распознать имен параметров. В результате в коллекции Request.Params оказался только один элемент, да еще и с пустым именем, содержащий весь посланный текст 'station_id=1&text=вася пупкин.'.

В результате экспериментов с компонентом отсылку методом POST пришлось сделать вручную вот так:

var
 sServer, s: string;
 iPort: integer;
begin
 sServer := 'localhost';
 iPort := 1195;

 NMHTTP1.Host:=sServer;
 NMHTTP1.Port:=iPort;
 NMHTTP1.Connect;
 NMHTTP1.Write('POST /ErrorTest/Default.aspx HTTP/1.1'+#13#10);
 NMHTTP1.Write('Content-Type: application/x-www-form-urlencoded'+#13#10);
 NMHTTP1.Write('Content-Length: '+inttostr(length(s))+#13#10);
 NMHTTP1.Write('Connection: close'+#13#10+#13#10);

 //строка параметров
 s := 'station_id=1&text='+UTF8Encode('вася пупкин');

 NMHTTP1.Write(s);
 NMHTTP1.Disconnect;


Фактически это ручная запись всего HTTP-запроса в выходной поток. И в ней символы = и & не закодированы никаким url-кодированием. Так - заработало. Сервер различил параметры и корректно сформировал коллекцию Request.Params.


Наверх

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