Как установить пользовательские заголовки для HTTP::Tiny в Perl?
У меня возникли проблемы с пониманием правильного способа установки заголовков для HTTP::Tiny
в Perl 5. До сих пор я видел примеры хэшей, ссылок на хеш и множество других, казалось бы, неразрешимых способов.
Как правильно установить заголовки для запроса? Какой простой способ просмотреть запрос перед его отправкой?
Вот пример кода:
#!/usr/bin/env perl
use 5.12.1;
use HTTP::Tiny;
my $api_key = "::";
my %headers = (Authorization => sprintf 'Bearer %s', $api_key);
my $url = "https://api-fxpractice.oanda.com/v3/accounts";
my $response = HTTP::Tiny->new($url,
default_headers => {'Content-Type' => 'application/json'});
my $response = HTTP::Tiny->new->get($url, { default_headers => \%headers } );
print "$response->{status} $response->{reason}\n";
while ( my ( $k, $v ) = each %{ $response->{headers} } ) {
print "$k: $_\n";
}
}
print $response->{content} if length $response->{content};
И это дает мне 401.
Спасибо!
2 ответа
Хеш означает просто %hash=(key=>value)
ссылки на хеш означает просто $hashref={key=>value}
и это равно $hashref=\%hash;
Так
$http = HTTP::Tiny->new( %attributes )
просто
$http = HTTP::Tiny->new( attr1=>value1, ... )
А также
$response = $http->get($url, \%options)
является
$response = $http->get($url, {attr1=>value1, ...} )
иллюстративные примеры:
use HTTP::Tiny;
HTTP::Tiny->new->get($url);
HTTP::Tiny->new->get($url, { headers => { header1=>value1, header2=>value2 } };
# with headers set in one place
$handle=HTTP::Tiny->new( default_headers=>{h1=>3, h2=>4} );
$handle->get($url);
$handle->get($url, headers=>{ h2=>'overwrite' });
# without shorthand
HTTP::Tiny->new->request('get', $url);
HTTP::Tiny->new->request('get',$url, { headers => { header1=>value1, header2=>value2 } };
# post
HTTP::Tiny->new->request('post',$url, { headers => { header1=>value1, header2=>value2 }, content=>'body to post' };
Оказывается, проблема была во многом связана с тем, что я был глуп и не обращал внимания на детали. В принципе,
- Я использовал реальные деньги API, а не поддельные
- Я не использовал хеш-реф должным образом
- Я устанавливал default_headers вместо headers
`
my $api_key = "::"
my %headers = (
"Content-Type" => "application/json",
"Authorization" => sprintf 'Bearer %s', $api_key);
my $url = "https://api-fxpractice.oanda.com/v1/accounts";
my $response = HTTP::Tiny->new->get($url, { headers => \%headers } );
print "$response->{status} $response->{reason}\n";
while ( my ( $k, $v ) = each %{ $response->{headers} } ) {
for ( ref $v eq 'ARRAY' ? @$v : $v ) {
print "$k: $_\n";
}
}
print $response->{content} if length $response->{content};
`