JSON

Взаимодействие с API на Perl с использованием библиотеки JSON.

Пример демонстрирует вызов метода GetClientInfo.

#!/usr/bin/perl -w

=head1 NAME

    Пример работы с API Яндекс.Директа на языке Perl
        с использованием библиотеки JSON

=head1 DESCRIPTION

    В примере использован рекомендуемый синтаксис для работы с API Яндекс.Директа
        на языке Perl с использованием протокола JSON.

    Обращаем внимание, что все текстовые данные должны быть в кодировке UTF8.

    Подробнее про получение токена читайте в документации:
        https://tech.yandex.ru/oauth/doc/dg/

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

=cut


use strict;

use JSON qw/to_json from_json/;
use Encode qw/decode_utf8/;

use HTTP::Request::Common;
use HTTP::Response;
use LWP::UserAgent;

use Data::Dumper;

# Авторизационный токен, полученный в сервисе oauth.yandex.ru
my $token = 'YANDEX-OAUTH-LOGIN-TOKEN';

# Логин учетной записи, данные о которой требуется получить
my $login = 'YANDEX-LOGIN';

my $url = "https://api.direct.yandex.ru/v4/json/";

# Подготовка данных для запроса
my $data = {};
$data->{param} = [$login];
$data->{method} = 'GetClientInfo';

$data->{token} = $token;

my $json_data = to_json($data);

my $ua = new LWP::UserAgent( timeout => 600 );

my $request = HTTP::Request->new('POST', $url, undef, $json_data);

# Запрос на сервер
my $response = $ua->request($request);

# for debug
# warn $request->as_string, "\n";
# warn $response->as_string, "\n";

if ($response->is_success) {

    my $result = from_json(Encode::decode_utf8($response->decoded_content())) || {};

    if (defined $result->{error_code}) {

        # Если ошибку вернул сервер API Яндекс.Директа
        die join "\n"
                    , "API error:"
                    , "Code: ".$result->{error_code}
                    , "Describe: ".$result->{error_str}
                    , "Detail:".($result->{error_detail} || '');

    } elsif (defined $result->{data}) {

        print Dumper {result => $result};

    }

} else {

    # Если ошибка произошла при отправке запроса
    die "HTTP error: ".$response->status_line;

}