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

Вниз

Можно ли заставить работать NMHTTP1.Post ?   Найти похожие ветки 

 
kaif ©   (2008-03-05 21:03) [0]

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


 
kaif ©   (2008-03-06 12:35) [1]

Похоже, что метод 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.


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


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


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


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


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

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


 
kaif ©   (2008-03-06 17:14) [3]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.011 c
15-1242315887
Dimka Maslov
2009-05-14 19:44
2009.07.12
Программа выполнила недопустимую операцию и будет закрыта.


2-1242827993
evgenij
2009-05-20 17:59
2009.07.12
Даные изменились с последнего времени


6-1204586032
Квэнди
2008-03-04 02:13
2009.07.12
Indy 9 и ограничение скорости


10-1132239448
George_Debug
2005-11-17 17:57
2009.07.12
Как убить объект из TaskManager a ?


15-1241688579
ford
2009-05-07 13:29
2009.07.12
что быстрее