Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > HTTP::Lite


Автор: Bulat 11.7.2008, 13:49
Код

use HTTP::Lite;
my $http = new HTTP::Lite;

my $XMLRequest = '<myxml>...</myxml>';

my %vars = (
  $XMLRequest
);

$http -> prepare_post(\%vars);

my $req = $http -> request("http://myURL");
....


При отправке запроса с помощью данного модуля, если крепить в контент(в форму) XML, до сервера XML доходит не в самом хорошем состоянии. Т.е. сам http - 200.

Пробовал отправлять с помощью LWp::UserAgent - все гуд.

Мож, кто сталкивался?? Мож проблема стандартная, и я чего-то недоделываю??

Автор: KSURi 11.7.2008, 13:55
При использовании
Код

use strict;
use warnings;

по идее должна выскочить ошибка об odd number elements in hash assigment. Примерно так:
Код

my %vars = (post_parameter_name => $xml)

Автор: tolkien 12.7.2008, 07:03
Конечно стандартная. Не понимание работы c http протоколом. И тут не важно какой модуль вы используете и что отправляете.

Автор: Bulat 14.7.2008, 09:27
tolkien, Давай не будем громко кричать. Мне приходилось не только сайты и порталы, но и ботов писать. Так что что такое http-протокол я знаю не по наслышке. А от модуля многое зависит. То, что писал KSURi, проблему не решило, я уже и до так пытался. 

tolkien, А для особо умных, ошибка не http, а в том, что контент на том конце приходит не верный.

Немогу выложить полностью все, но вот часть

Код

<myxml.request>
  <hash>myhash</hash>
  ...
</myxml.request>


И вот в ответе приходит, что параметр внутри тега hash не верен, само содержание, текст, а не форма. smile 

Или если еще проще, я могу расписать как 
Код

my %vars = (post_parameter_name => $xml)


или

Код

my %vars = (content => $xml)


или еще как, но это не решает проблему smile

Автор: KSURi 14.7.2008, 12:34
Т.е. на стороне сервера есть проверка формата входных данных? Может тогда стоит на нее обратить внимание?

Цитата(Bulat @  14.7.2008,  09:27 Найти цитируемый пост)
То, что писал KSURi, проблему не решило, я уже и до так пытался. 

Ну во всяком случае, возможно это является частью проблемы.
Посмотрите сами: вы присваиваете хэшу одну переменную, хотя хэш должен иметь вид ключ=>значение. Т.е. получается, что ваш XML будет использоваться в кач-ве ключа, а в кач-ве его значения скорее всего будет undef. Из этого вытекает, что вы посылаете неверный POST запрос (я лично не работал с HTTP::Lite, но предполагаю, что метод prepare_post ждет на вход ссылку на хэш вида POST_param_name=>POST_param_value).

Автор: tolkien 14.7.2008, 12:47
Bulat
Ну раз вы такой умный. Может сами додумаетесь через проксю послать запрос первый который у вас работает с помощью LWP и второй с помощью HTTP::Lite. И посмотреть в чем различие.

Автор: Bulat 14.7.2008, 19:04
Цитата(KSURi @  14.7.2008,  12:34 Найти цитируемый пост)
Ну во всяком случае, возможно это является частью проблемы.
Посмотрите сами: вы присваиваете хэшу одну переменную, хотя хэш должен иметь вид ключ=>значение. Т.е. получается, что ваш XML будет использоваться в кач-ве ключа, а в кач-ве его значения скорее всего будет undef. Из этого вытекает, что вы посылаете неверный POST запрос (я лично не работал с HTTP::Lite, но предполагаю, что метод prepare_post ждет на вход ссылку на хэш вида POST_param_name=>POST_param_value).


В том же пакете есть дополнительные методы, можно отловить все что отправляется, записать в файл(или на крайняк в STDOUT) и смотреть.

Контент, так как я его крепил, тоже крепится куда надо. 

Вот я тоже с HTTP::Lite никогда не работал, а приходится smile

Цитата(KSURi @  14.7.2008,  12:34 Найти цитируемый пост)
Т.е. на стороне сервера есть проверка формата входных данных? Может тогда стоит на нее обратить внимание?


Не доступно. Все что у меня есть и все что могу просмотреть, это лишь моя сторона smile

Цитата(tolkien @  14.7.2008,  12:47 Найти цитируемый пост)
Ну раз вы такой умный. Может сами додумаетесь через проксю послать запрос первый который у вас работает с помощью LWP и второй с помощью HTTP::Lite. И посмотреть в чем различие. 

Млин..... Я не знаю где ты работаешь, может быть у вас там каждому всюду и везде есть доступ, у нас такого нет. И чтобы что-то проделать выходящее за рамки твоих полномочий(проще говоря на что есть права), нужно напрячь пару-тройку людей, и потратить не только свое но и их драгоценное время, а работы у всех хватает. А учитывая что результат есть, но иным методом, этим вообще никто заниматься не будет. Тем более я сомневаюсь, что это что-то даст. Если уж и смотреть, то на стороне сервера, в момент того, когда xml парсится, а это вообще не доступно smile

Автор: KSURi 15.7.2008, 00:45
Bulat, не хочу показаться настырным, но все-таки в 3й раз обращу ваше внимание, на ИМХО неправильное составление запроса)
Пример из документации HTTP::Lite:
Код

    $http = new HTTP::Lite;
    %vars = (
             "QRY" => "perl",
             "ST" => "MS",
             "svcclass" => "dncurrent",
             "DBS" => "2"
            );
    $http->prepare_post(\%vars);

Обратите внимание, как задаются данные в хэше %vars и как они задаются у вас. Я все-таки не понимаю, как можно посылать значение вместо ключа и ожидать корректной обработки такой ситуации со стороны сервера...
Для пущей убедительности поставил себе HTTP::Lite:
Код

C:\>perl -MData::Dumper -MHTTP::Lite -e"$_=new HTTP::Lite;$_->prepare_post({xml_
here});print Dumper $_"
$VAR1 = bless( {
                 'headers' => {
                                'user-agent' => 'HTTP::Lite/2.1.6',
                                'Content-Type' => 'application/x-www-form-urlenc
oded'
                              },
                 'error-message' => undef,
                 'HTTP11' => 0,
                 'status' => undef,
                 'content' => 'xml_here=',
                 'resp-protocol' => undef,
                 'body' => undef,
                 'timeout' => 120,
                 'HTTPReadBuffer' => '',
                 'callback_params' => undef,
                 'callback_function' => undef,
                 'method' => 'POST',
                 'DEBUG' => 0,
                 'request' => undef,
                 'resp-headers' => undef,
                 'header_at_once' => 0,
                 'CBARGS' => undef,
                 'headermap' => {
                                  'user-agent' => 'User-Agent'
                                },
                 'holdback' => 0,
                 'proxyport' => undef,
                 'proxy' => undef
               }, 'HTTP::Lite' );

C:\>

обратите внимание на ключ content и его значение

Автор: tolkien 15.7.2008, 04:11
Bulat
Вы так и не поняли. Дальше вашей машины смотреть ничего не надо. Может у вас нет полных прав на машине на которой вы прогамите? 

Автор: Bulat 15.7.2008, 10:12
Цитата(KSURi @  15.7.2008,  00:45 Найти цитируемый пост)
Обратите внимание, как задаются данные в хэше %vars и как они задаются у вас. Я все-таки не понимаю, как можно посылать значение вместо ключа и ожидать корректной обработки такой ситуации со стороны сервера...
Для пущей убедительности поставил себе HTTP::Lite:


Проблема заключается не в этом. smile Вообще насколько я успел заметить, есть большое подозрение в том как данный модуль эскейпит контент составленный из xml. smile

Автор: KSURi 15.7.2008, 12:26
Bulat, приведите код с LWP::UA, который успешно отрабатывает

Автор: Itsys 15.7.2008, 12:32
 smile 

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

Автор: Bulat 15.7.2008, 15:14
KSURi, 

Откапал я лог, пару дней давности. Тогда еще не очень обратил внимание, очень интересно эскейпится сам xml, мои подозрения оправдываются smile (По понятным причинам, некоторые данные пришлось изменить на 'my' smile)

Вот что делает с xml модуль HTTP::Lite, после того как крепишь его в контент

Код

...
$VAR1 = [
          'content-done',
          undef,
          bless( {
                   'headers' => {
                                  'user-agent' => 'HTTP::Lite/2.1.6',
                                  'connection' => 'close',
                                  'accept' => '*/*',
                                  'Content-Type' => 'application/x-www-form-urlencoded',
                                  'host' => 'my.ru'
                                },
                   'error-message' => undef,
                   'HTTP11' => 0,
                   'status' => undef,
                   'content' => '%3Cmyxml%3E%3Chash%3Ea06efeb7584466917bf31b37269%3C%2Fhash%3E%3Cdate_begin%3E20080501%3C%2Fdate_begin%3E%3Cdate_end%3E20080731%3C%2Fdate_end%3E%3C%2Fmyxml%3E=',
                   'resp-protocol' => undef,
                   'body' => undef,
                   'timeout' => 120,
                   'HTTPReadBuffer' => '',
                   'callback_params' => [
                                          \*{'::$handle'}
                                        ],
                   'callback_function' => sub { "DUMMY" },
                   'method' => 'POST',
                   'DEBUG' => 0,
                   'request' => undef,
                   'resp-headers' => undef,
                   'header_at_once' => 0,
                   'CBARGS' => undef,
                   'headermap' => {
                                    'user-agent' => 'User-Agent',
                                    'connection' => 'Connection',
                                    'accept' => 'Accept',
                                    'host' => 'Host'
                                  },
                   'holdback' => 0,
                   'proxyport' => undef,
                   'proxy' => undef
                 }, 'HTTP::Lite' )
        ];

$VAR1 = [
          'data',
          \'<?xml version="1.0" encoding="windows-1251"?><myxml>
<retval>-1</retval>
<retdesc>отсутствует или неверно задан параметр hash</retdesc>
</myxml>',
          bless( {
                   'headers' => {
                                  'user-agent' => 'HTTP::Lite/2.1.6',
                                  'connection' => 'close',
                                  'accept' => '*/*',
                                  'Content-Type' => 'application/x-www-form-urlencoded',
                                  'host' => 'my.ru'
                                },
                   'error-message' => 'OK
',
                   'HTTP11' => 0,
                   'status' => '200',
                   'content' => '%3Cmyxml%3E%3Chash%3Ea06efeb7584466917bf31b37269%3C%2Fhash%3E%3Cdate_begin%3E20080501%3C%2Fdate_begin%3E%3Cdate_end%3E20080731%3C%2Fdate_end%3E%3C%2Fmyxml%3E=',
                   'resp-protocol' => 'HTTP/1.0',
                   'body' => undef,
                   'timeout' => 120,
                   'HTTPReadBuffer' => '',
                   'callback_params' => [
                                          \*{'::$handle'}
                                        ],
                   'callback_function' => sub { "DUMMY" },
                   'method' => 'POST',
                   'DEBUG' => 0,
                   'request' => undef,
                   'resp-headers' => {
                                       'Server' => [
                                                     'Microsoft-IIS/6.0'
                                                   ],
                                       'Proxy-Connection' => [
                                                               'close'
                                                             ],
                                       'Via' => [
                                                  '1.0 litr.internal.gate (squid/3.0.STABLE4)'
                                                ],
                                       'X-Powered-By' => [
                                                           'ASP.NET'
                                                         ],
                                       'Date' => [
                                                   'Wed, 09 Jul 2008 11:10:54 GMT'
                                                 ],
                                       'Content-Length' => [
                                                             '175'
                                                           ],
                                       'Cache-Control' => [
                                                            'private'
                                                          ],
                                       'Content-Type' => [
                                                           'text/xml; charset=windows-1251'
                                                         ],
                                       'Set-Cookie' => [
                                                         'ASPSESSIONIDCQQBSBCS=MNHAJKPBHAHPCJJLHCMOKHEG; path=/'
                                                       ],
                                       'X-Cache' => [
                                                      'MISS from my.internal.gate'
                                                    ],
                                       'Expires' => [
                                                      'Wed, 09 Jul 2008 11:10:54 GMT'
                                                    ]
                                     },
                   'header_at_once' => 0,
                   'CBARGS' => undef,
                   'headermap' => {
                                    'user-agent' => 'User-Agent',
                                    'connection' => 'Connection',
                                    'accept' => 'Accept',
                                    'host' => 'Host'
                                  },
                   'holdback' => 0,
                   'proxyport' => undef,
                   'proxy' => undef
                 }, 'HTTP::Lite' )
        ];

$VAR1 = [
          'done',
          undef,
          bless( {
                   'headers' => {
                                  'user-agent' => 'HTTP::Lite/2.1.6',
                                  'connection' => 'close',
                                  'accept' => '*/*',
                                  'Content-Type' => 'application/x-www-form-urlencoded',
                                  'host' => 'my.ru'
                                },
                   'error-message' => 'OK
',
                   'HTTP11' => 0,
                   'status' => '200',
                   'content' => '%3Cmyxml%3E%3Chash%3Ea06efeb7584466917bf31b37269%3C%2Fhash%3E%3Cdate_begin%3E20080501%3C%2Fdate_begin%3E%3Cdate_end%3E20080731%3C%2Fdate_end%3E%3C%2Fmyxml%3E=',
                   'resp-protocol' => 'HTTP/1.0',
                   'body' => undef,
                   'timeout' => 120,
                   'HTTPReadBuffer' => '',
                   'callback_params' => [
                                          \*{'::$handle'}
                                        ],
                   'callback_function' => sub { "DUMMY" },
                   'method' => 'POST',
                   'DEBUG' => 0,
                   'request' => undef,
                   'resp-headers' => {
                                       'Server' => [
                                                     'Microsoft-IIS/6.0'
                                                   ],
                                       'Proxy-Connection' => [
                                                               'close'
                                                             ],
                                       'Via' => [
                                                  '1.0 my.internal.gate (squid/3.0.STABLE4)'
                                                ],
                                       'X-Powered-By' => [
                                                           'ASP.NET'
                                                         ],
                                       'Date' => [
                                                   'Wed, 09 Jul 2008 11:10:54 GMT'
                                                 ],
                                       'Content-Length' => [
                                                             '175'
                                                           ],
                                       'Cache-Control' => [
                                                            'private'
                                                          ],
                                       'Content-Type' => [
                                                           'text/xml; charset=windows-1251'
                                                         ],
                                       'Set-Cookie' => [
                                                         'ASPSESSIONIDCQQBSBCS=MNHAJKPBHAHPCJJLHCMOKHEG; path=/'
                                                       ],
                                       'X-Cache' => [
                                                      'MISS from my.internal.gate'
                                                    ],
                                       'Expires' => [
                                                      'Wed, 09 Jul 2008 11:10:54 GMT'
                                                    ]
                                     },
                   'header_at_once' => 0,
                   'CBARGS' => undef,
                   'headermap' => {
                                    'user-agent' => 'User-Agent',
                                    'connection' => 'Connection',
                                    'accept' => 'Accept',
                                    'host' => 'Host'
                                  },
                   'holdback' => 0,
                   'proxyport' => undef,
                   'proxy' => undef
                 }, 'HTTP::Lite' )
        ];



С LWP::UA XML остается в том же виде:

Код

<myxml>
  <hash>myhash</hash>
  <date_begin>DateBegin</date_begin>
  <date_end>DateEnd</date_end>
</myxml>


Автор: tolkien 16.7.2008, 07:32
Проблема скорее всего в том что в одном случаи у вас параметр запроса кодируются, в другом нет. Соотвественно на стороне сервера обрабатывается только один случай. Если LWP ничего не кодирует значит этот случаи и обрабатывает сервак. И тут как выше я писал дело не модулях, а в знании протокола http.

Автор: Bulat 16.7.2008, 09:16
tolkien, мне надоело твое ничем не подкрепленное хваствоство. Если бы ты действительно знал о протоколе http, то ты должен был бы знать, что эскейпится должно в любом случае. Так как изначально, неизвестно что будет передаваться по протоколу. Возможно, это символы из кириллицы, возможно еще что-то. Нет такого - эскейпится, не эскейпится, есть только правильно эскейпится и не правильно эскейпится.

Ты бы побольше писал, а н е пустословил. smile

Автор: tolkien 16.7.2008, 09:27
Удачи! Мучайтесь дальше.

Автор: Bulat 16.7.2008, 09:53
Цитата(tolkien @  16.7.2008,  09:27 Найти цитируемый пост)
Удачи! Мучайтесь дальше.

 smile 

ТЗ давно сделано, и я не мучаюсь. У меня уже куча новой срочной работы. Но я не забываю про вопросы которые появляются в ходе работы вообще и люблю выяснять причины, а они гораздо глубже и интереснее, чем голословные посты. 

Автор: ginnie 28.7.2008, 19:26
Уважаемый Bulat, Ваши данные модифицируются из-за того, что в Content-Type указано application/x-www-form-urlencoded. Возможно серверу на другой стороне необходимо multipart/form-data, которое не реализовано в HTTP::Lite?

Автор: Bulat 29.7.2008, 09:30
ginnie очень может быть, будет время, просмотрю этот момент отдельно smile

Автор: KSURi 29.7.2008, 12:18
Bulat, если вы отправляли такой запрос с помощью LWP::UA не изменяя там Content-Type, то врядли это является проблемой.

Автор: Bulat 30.7.2008, 10:01
Цитата(KSURi @  29.7.2008,  12:18 Найти цитируемый пост)
Bulat, если вы отправляли такой запрос с помощью LWP::UA не изменяя там Content-Type, то врядли это является проблемой.


В том-то и дело, что в LWP::UA  я вообще ничего дополнительного не делал. Задал ссылку, прописал user-agent и прикрепил контент, и все заработало smile

Автор: KSURi 30.7.2008, 16:53
Ну значит LWP::UA научился определять какой enctype нужен удаленному серверу гыгы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)