Как установить пользовательские заголовки для 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' };

Оказывается, проблема была во многом связана с тем, что я был глуп и не обращал внимания на детали. В принципе,

  1. Я использовал реальные деньги API, а не поддельные
  2. Я не использовал хеш-реф должным образом
  3. Я устанавливал 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};

`

Другие вопросы по тегам