Perl 在for/while循环中将LWP Useragent对象与HTTP POST查询重用
我使用LWP Useragent通过基本授权进行多个POST调用,其中POST URL参数从CSV文件读取。这是我的密码: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
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对象不是问题。