The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Perl + HTTP + POST "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Perl + HTTP + POST "  +/
Сообщение от pxel on 04-Окт-14, 16:38 
Толь лыжи не едут, толь я на асфальте...
use LWP::UserAgent;
my $browser = LWP::UserAgent->new;
my $url = 'http://my.testtest.net/cgi-bin/index.cgi';
my @web_headers = ( );
my  @web_data = ( 'server' => 'www.mytest.com' );
...
$response = $browser->post( "$url", @web_headers, @web_data);
...
print $response->content;
В результате на своем index.cgi в $ENV вижу CONTENT_LENGTH = 0. Зато появляется HTTP_SERVER = www.mytest.com
Такая штука только при попытке выполнить скрипт с постом перлом.
Т.е. в браузере заполняя поля вручную CONTENT_LENGTH имеет значение и нет лишних енв-переменных (и также curl`ом проверял с -d)

C HTTP::Request::Common через request(POST '$url', @web_data) таже картинка.
пробовал фря/федора и мод-перл/cgi

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Perl + HTTP + POST "  +/
Сообщение от pxel on 04-Окт-14, 19:32 
http://www.perlmonks.org/?node_id=193917

очень странное решение

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Perl + HTTP + POST "  +/
Сообщение от PavelR (??) on 05-Окт-14, 11:14 
> Толь лыжи не едут, толь я на асфальте...

Конечно на асфальте, вы же не объяснили общественности форума, чего хотите добиться.
Выдохните, успокойтесь, напишите заново, перечитайте, желательно вслух, исправьте все замечания, которые возникли при прочтении, перечитайте заново, и только потом нажмите кнопку "Отправить".

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Perl + HTTP + POST "  +/
Сообщение от pxel on 06-Окт-14, 23:38 
Объясняю:
смотрим сюда http://search.cpan.org/dist/libwww-perl/lib/LWP/UserAgent.pm
ну... как бы... по гайду 1:1
А результат - переданные данные ПОСТом попадают в ЕНВ (окружение апача)
Работающее решение нашел. НО:
1. он не удобно, да и в коде костыльно идёт.
2. в ЛВП заявлено, но както нетак реализовано? или я всётаки туплю?
С лвп не сталкивался никогда, даже не возникало необходимости.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Perl + HTTP + POST "  +/
Сообщение от PavelR (ok) on 07-Окт-14, 09:39 
> Объясняю:

Не умеете вы объяснять.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Perl + HTTP + POST "  +1 +/
Сообщение от PavelR (ok) on 07-Окт-14, 10:07 
>> Объясняю:
> Не умеете вы объяснять.

Объясняю:


1) $ua->post( $url, \%form )
2) $ua->post( $url, \@form )

Отправляем форму на сервер. Форма (набор "поле-значение" _формы_) задана массивом или хешем. В вызов post() передается указатель на массив или хеш.

3) $ua->post( $url, \%form, $field_name => $value, ... )

Форма задана указателем, всё остальное - это заголовки HTTP-запроса.

4) $ua->post( $url, $field_name => $value,... Content => \%form )
5) $ua->post( $url, $field_name => $value,... Content => \@form )

Форма задана указателем, который передается в ключе Content, всё остальное - это заголовки HTTP-запроса.

6) $ua->post( $url, $field_name => $value,... Content => $content )

В ключе Content передан произвольный текстовый контент, отправляемый POST-запросом, всё остальное - это заголовки HTTP-запроса.

Вы написали:

$response = $browser->post( "$url", @web_headers, @web_data);

Два массива, переданных не как указатели, разделить нельзя.
Соответственно, содержимое @web_data будет воспринято аналогично содержимому @web_headers.

Поэтому контент пустой, а все, что вы запихнули в массивы, передалось как заголовки HTTP.

Как правильно сделать, я подсказывать не возьмусь, так-как не вполне уверен, что всё остальное правильно, например я не вижу необходимости в @web_headers, т.к. он пустой.
Я бы сделал например так:

$response = $browser->post( "$url", @web_headers, Content => \@web_data);

Но нечетное количество элементов в @web_headers всё сломает.

Если @web_headers вам не нужны, то тогда надо так:

$response = $browser->post( "$url", \@web_data);


Чтобы всё это окончательно было понято, рассмотрим структуру POST-запроса.
Пример (строки пронумерованы мной):

1)POST /path/script.cgi HTTP/1.0
2)User-Agent: HTTPTool/1.0
3)Content-Type: application/x-www-form-urlencoded
4)Content-Length: 32
5)
6)home=Cosby&favorite+flavor=flies


Строки 2-4 - заголовки запроса. 5 - разделитель. 6 - Тело запроса, в формате, соответствующем Content-Type и имеющее длину Content-Length.

Заголовки формируются из @web_headers, тело запроса формируется из @web_data.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Perl + HTTP + POST "  +/
Сообщение от pxel on 07-Окт-14, 15:13 
Спасибо!
нужно было ткнуть меня в "указатель"... из серии смотрю в книгу - вижу фигу. А сначала то работало, а потом перехимичил... чукча же - писатель!
И не ломается, если массив/хеш формировать правильно, вроде как-то так: 'Поле'  => ""
Насчёт заголовка: default_header(@web_headers)
и спасибо!
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру