perl - 无法使用 perl 模块 HTTP::Request::Generator 传递自定义 header

标签 perl

我正在使用 atom 并测试 HTTP::Request::Generator PERL 模块。下面的代码在大部分情况下都可以工作,但我无法发送 cookie 或 header ,即使我在代码中设置了它,它也只显示默认 header 。

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 => \&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;
    }
}

输出 用户代理:libwww-perl/6.31 登录

title 页面表明我没有登录此 cookie 很好,我已经使用 curl 对其进行了测试,我可以手动登录并检索所需的资源。为什么 perl 失败,如何访问上面代码中的 header 选项。谢谢。

解决方案

body_params => {
       comment => ['Some comment', 'Another comment, A++'],
   },

添加上面的代码就解决了。

最佳答案

您不能两次提供相同的选项 (wrap):

    wrap    => sub {
        my ( $req ) = @_;
        # Fix up some values
        $req->{'headers'}{'Content-Length'} = 666;
    },
    wrap => \&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 选项似乎采用 hashrefs 的 arrayref,如下所示:

    headers => [
        {
            "User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
            "Cookie" => '_abc',
        },
    ],

我想这样做的原因是你可以提供替代的 header 集:

    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为每个页面生成两个请求code> header 或其他内容。

关于perl - 无法使用 perl 模块 HTTP::Request::Generator 传递自定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64246115/

相关文章:

regex - perl -pe 正则表达式问题

perl - 在 Perl 的 numeric lt (<) line 25 中使用未初始化值 $guess

bash - 如果这些 Perl 命令在粘贴到 shell 中时被解释为 Bash 命令,是否有害?

perl - 为什么通常在没有线程支持的情况下安装Perl?

perl - 是否有类似引号的内插单词列表运算符?

Perl HTML::Tokeparser 获取标签之间的原始 html

mysql - 用于登录数据库并进行简单查询的 Perl 模块?

perl - Perl 打开中的语法错误

perl - 在 Perl 应用程序中检测编译失败、丢失包等的最简单方法是什么?

perl - DBIx::Class::ResultSet 在多个唯一约束上更新或创建