#perl
#perl
Вопрос:
Я использую atom
и тестирую HTTP::Request::Generator
модуль PERL. Приведенный ниже код работает по большей части, но я не могу отправлять файлы cookie или заголовки, он отображает только заголовки по умолчанию, даже если я установил их в своем коде.
use strict;
use warnings;
use HTTP::Request::Generator 'generate_requests';
use LWP::UserAgent;
my $ua = 'LWP::UserAgent'->new;
my $gen = generate_requests(
method => 'GET',
host => [ 'https://abc.ai/' ],
pattern => 'https://abc.ai',
headers => {
"User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64',
"Cookie" => '_abc',
},
wrap => sub {
my ( $req ) = @_;
# Fix up some values
$req->{'headers'}{'Content-Length'} = 666;
},
wrap => amp;HTTP::Request::Generator::as_http_request,
);
while ( my $req = $gen->() ) {
my $response = $ua->request( $req );
# print $response->protocol, ' ', $response->status_line, "n";
print $req->headers->as_string, "n";
print $req->as_string();
# Do something with $response here?
if ($response->is_success) {
# print $response->decoded_content;
print $response ->header('title');
}
else {
die $response->status_line;
}
}
Вывод
User-Agent: libwww-perl/6.31
Login
На title
странице указано, что я не зарегистрировался в этом файле cookie, и я протестировал его, используя curl
я могу вручную войти в систему и получить требуемый ресурс. Почему он не работает для perl, как получить доступ к моим параметрам заголовка в коде выше. Спасибо.
Решение
body_params => {
comment => ['Some comment', 'Another comment, A '],
},
Решил проблему, добавив приведенный выше код.
Комментарии:
1. Я привел в порядок отступ вашего кода. Пожалуйста, пожалуйста, подумайте о том, чтобы сделать это самостоятельно в следующий раз. Тщательный ввод отступов — мощный инструмент, помогающий людям понять ваш код, и если вы просите группу незнакомых людей прочитать и понять ваш код, вежливо сделать это как можно проще для них.
2. @DaveCross Я согласен, извините за неудобства, в следующий раз я буду осторожен
3. Существует ошибка
as_http_request()
: он отбросит ваши заголовки, еслиbody_params
они не были переданы, чтобыgenerate_requests()
попытаться добавить фиктивныйbody_params => {comment=>['test']},
файл, и вы, по крайней мере, получите объект HR, содержащий ваши заголовки. Я вижу больше проблем, хотя, например, content_length заканчивается как aref.
Ответ №1:
Вы не можете предоставить один и тот же параметр ( wrap
) дважды:
wrap => sub {
my ( $req ) = @_;
# Fix up some values
$req->{'headers'}{'Content-Length'} = 666;
},
wrap => amp;HTTP::Request::Generator::as_http_request,
Это может сработать, хотя:
wrap => sub {
my ( $req ) = @_;
# Fix up some values
$req->{'headers'}{'Content-Length'} = 666;
return HTTP::Request::Generator::as_http_request( $req );
},
Также headers
появляется опция для получения arrayref из hashrefs, например:
headers => [
{
"User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
"Cookie" => '_abc',
},
],
Я предполагаю, что причина этого в том, что вы можете предоставить альтернативные наборы заголовков:
headers => [
{
"User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
"Cookie" => '_abc',
},
{
"User-Agent" => 'Mozilla/1.0 (Hoover Vacuum Cleaner)',
"Cookie" => '_def',
},
],
Таким образом, ваш генератор запросов может генерировать два запроса для каждой страницы, используя разные User-Agent
строки или разные файлы cookie (поэтому они вошли в систему как разные пользователи), или разные Accept
заголовки, или что-то еще.
Комментарии:
1. я попробовал и получил тот же ответ
User-Agent: libwww-perl/6.31 User-Agent: libwww-perl/6.31 Login
, я чувствую, что он полностью игнорирует заголовки2. Ваш анкилоз на месте, да, модуль в основном является генератором шаблонов HTTP-запросов, поэтому есть веская причина использовать этот синтаксис, как вы сказали, например, два запроса на страницу. Позвольте мне попробовать этот новый код.