Perl 在for/while循环中将LWP Useragent对象与HTTP POST查询重用

Perl 在for/while循环中将LWP Useragent对象与HTTP POST查询重用,perl,lwp-useragent,Perl,Lwp Useragent,我使用LWP Useragent通过基本授权进行多个POST调用,其中POST URL参数从CSV文件读取。这是我的密码: use strict; use warnings; use LWP::UserAgent; use JSON 'from_json'; use MIME::Base64 'encode_base64'; use Data::Dumper; my @assets; my %data; my $response; my $csvfile = 'ScrappedData_Co

我使用LWP Useragent通过基本授权进行多个POST调用,其中POST URL参数从CSV文件读取。这是我的密码:

use strict;
use warnings;

use LWP::UserAgent;
use JSON 'from_json';
use MIME::Base64 'encode_base64';
use Data::Dumper;

my @assets;
my %data;
my $response;
my $csvfile = 'ScrappedData_Coins.csv';
my $dir = "CurrencyImages";

open (my $csv, '<', "$dir/$csvfile") || die "cant open";
foreach (<$csv>) {
   chomp;
   my @currencyfields = split(/\,/);
   push(@assets, \@currencyfields);
}
close $csv;

my $url = 'https://example.org/objects?';

my %options = (         
        "username" =>  'API KEY',
        "password" => '' );  # Password field is left blank
        
my $ua = LWP::UserAgent->new(keep_alive=>1);
$ua->agent("MyApp/0.1");
$ua->default_header(
                    Authorization => 'Basic '. encode_base64( $options{username} . ':' . $options{password} )
);
my $count =0;

foreach my $row (@cryptoassets) {
          
          $response = $ua->post(
                     $url,
                     Content_Type => 'multipart/form-data',
                     Content => {
                           'name'=>${$row}[1],
                           'lang' => 'en',
                           'description' => ${$row}[6],             
                           'parents[0][Objects][id]' => 42100,
                           'Objects[imageFiles][0]' =>[${$row}[4]],
                         }
                  );
         
         if ( $response->is_success ) {
             my $json = eval { from_json( $response->decoded_content ) };
             print Dumper $json;
         }
         else {
          $response->status_line;
          print $response;
         }
}
sleep(2);
}
使用严格;
使用警告;
使用LWP::UserAgent;
使用JSON“from_JSON”;
使用MIME::Base64“encode_Base64”;
使用数据::转储程序;
我的@资产;
我的%数据;
我的回答;
my$csvfile='scrasteddata_Coins.csv';
my$dir=“CurrencyImages”;

open(my$csv),重用用户代理对象不是我的第一个怀疑

Mojo::UserAgent在您发出请求时返回一个完整的事务对象。即使在发送请求后,我也可以轻松地检查请求。这是LWP一直困扰我的巨大好处之一。您可以这样做,但您必须先分解工作以形成请求

在本例中,首先创建查询哈希,然后在发送之前查看它。它是否具有您期望的所有内容

然后,看看请求。请求是否与您刚才给出的哈希匹配

还有,什么时候出错了?第一个请求可以,但是第二个请求失败了,或者几个请求可以,但是一个请求失败了

您可以尝试httpbin.org,而不是在您的实时系统上进行测试

use Mojo::UserAgent;
use Mojo::Util qw(dumper);

my $hash = { ... };
say dumper( $hash );

my $ua = Mojo::UserAgent->new;
$ua->on( prepare => sub { ... } );  # add default headers, etc

my $tx = $ua->post( $url, form => $hash );

say "Request: " . $tx->req->to_string;

我自己找到了解决方案。我使用hashref将表单参数数据(键/值对)传递给POST方法。我将其更改为arrayref,问题就解决了。我在CPAN页面上阅读了如何将数据传递给POST方法。因此,重用LWP对象不是@brian d foy指出的问题


“一个参数值(…)似乎无法在HTTP POST调用中传递到服务器。”-如何检查哪些参数被传递?您是实际检查实际请求还是仅假设这是导致错误的原因,但实际原因可能是其他原因。我没有检查实际请求,并假设异常行为与指定的参数值相关,而其余参数rs已上载。您能告诉我如何通过POST检查已发送的HTTP请求吗?“您能告诉我如何通过POST检查已发送的HTTP请求吗?”-请参阅或了解如何执行此操作。我自己找到了解决方案。我在POST方法中以hashref传递表单数据。我将其更改为arrayref,问题得到了解决。我确实尝试了LWP控制台记录器,但问题没有得到解决,或者可能无法正确分析HTTP请求日志。此外,我收到了“[由LWP::ConsoleLogger编辑。不知道如何显示多部分/表单数据;边界=xYzZY-不知道如何生成。我自己找到了解决方案。我在POST方法中用hashref传递表单数据。我将其更改为arrayref,问题就解决了。我在CPAN页面上阅读了如何将数据传递给POST方法。因此,重用LWP对象不是问题。