Конференция "Сети" » Можно ли заставить работать NMHTTP1.Post ? [D6]
 
  • kaif © (05.03.08 21:03) [0]
    При отсылке параметров методом Post до сервера они не доходят.
    NMHTTP1.Post(url, 'param1=value1¶m2=value2');
    С проблемой многие сталкивались, судя по тому, что я вижу в google и yandex-е. Но решения ни у кого не нашел. Отсылку параметров файлом не предлагать. Она работает, но я хочу разобраться с отсылкой, которая приведена в каноническом демонстрационном примере для метода Post.
    Url-кодирование параметров тоже не помогает, впрочем, даже один простейший параметр вида 'station_id=1' не отправляется.
    Исходного кода TNMHTTP у меня нет, что он там делает, я не знаю. В чем затык? Кто-нибудь знает?
  • kaif © (06.03.08 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.
  • Сергей М. © (06.03.08 12:49) [2]

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


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


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


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

    Засады в FastNet-компонентах могут поджидать в самых неожиданных местах, и было бы лучше не ждать их и не надеяться на авось, а взять на вооружение любой другой компонент, пусть и плохенький с т.з. функциональности, но с исх.текстами.
  • kaif © (06.03.08 17:14) [3]
    2 Сергей М. ©   (06.03.08 12:49) [2]
    Да в общем-то я все, что нужно было реализовал.
    Еще я ftp-компонент с этой палитры забраковал.
    Но HTTP вроде работает (кроме метода Post).
    :)
 
Конференция "Сети" » Можно ли заставить работать NMHTTP1.Post ? [D6]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]