For the complete documentation index, see llms.txt. This page is also available as Markdown.

Примеры на PHP

Обзор

Все примеры кода в этом разделе используют следующие классы.

Класс Request использует cURL для выполнения запросов к API.

Класс Response содержит ответ API и информацию о возвращенном коде состояния.

Классы Request и Response
class Request {

        /**
         * @var resource
         */
        protected $_request;

        /**
         * @var integer
         */
        protected $_method;

        /**
         * @var string
         */
        protected $_url;

        /**
         * @var array
         */
        protected $_headers = array(
            'Content-type: application/json'
        );

        /**
         * @var string|array
         */
        protected $_params;

        /**
         * @var object Response
         */
        protected $_reponse;

        /**
         * Конструктор
         *
         * @param   string      $url
         * @param   string      $method
         * @param   array       $params
         */
        public function __construct($url, $method, $params = array()) {

            $this->_url = $url;

            // Установить метод
            $this->_method = $method;

            // Установить параметры
            $this->_params = $params;
        }

        /**
         * Определить метод Request
         *
         * @param   string  $method
         */
        private function setMethod() {

            switch($this->_method) {
                case 'GET':
                    break;
                case 'POST':
                    curl_setopt($this->_request, CURLOPT_POST, 1);
                    break;
                case 'PUT':
                    curl_setopt($this->_request, CURLOPT_CUSTOMREQUEST, 'PUT');
                    break;
                case 'DELETE':
                    curl_setopt($this->_request, CURLOPT_CUSTOMREQUEST, 'DELETE');
                    break;
            }
        }

        /**
         * Добавить заголовок авторизации
         *
         * @param   string  $type
         * @param   string  $token
         */
        public function setAuthorizationHeader($type, $token) {

            $authorization = $type . ' ' . $token;

            $this->_headers[] = 'Authorization: ' . $authorization;
        }

        /**
         * Добавить тело запроса
         */
        private function addBody() {

            if($this->_method != 'GET' && empty($this->_params) == false) {

                if(is_array($this->_params)) {
                    // Закодировать массив в JSON
                    $this->_params = json_encode($this->_params);
                }

                curl_setopt($this->_request, CURLOPT_POSTFIELDS, $this->_params);

                // Добавить заголовок Content-Length
                $this->_headers[] = 'Content-length: ' . strlen($this->_params);
            }
        }

        /**
         * Добавить строку запроса к запросу
         */
        private function addQueryString() {

            if($this->_method == 'GET' && is_array($this->_params) && count($this->_params) > 0) {

                $query_string = '?';

                foreach($this->_params as $param => $value) {

                    $query_string = $query_string . $param . '=' . $value . '&';
                }

                trim($query_string, '&');

                $this->_url = $this->_url . $query_string;
            }
            else {

                if(is_array($this->_params) && count($this->_params) > 0 && strpos($this->_url, '{') !== false) {
                    // Сопоставить параметры с URL
                    foreach($this->_params as $param => $value) {
                        $this->_url = preg_replace('/{' . $param . '}/', $value, $this->_url);
                    }
                }
            }
        }

        /**
         * Отправить запрос
         */
        public function send() {

            // Инициализировать запрос cUrl
            $this->_request = curl_init();

            // Вернуть ответ в виде строки
            curl_setopt($this->_request, CURLOPT_RETURNTRANSFER, 1);

            // Добавить строку запроса
            $this->addQueryString();

            // Установить URL
            curl_setopt($this->_request, CURLOPT_URL, $this->_url);

            // Установить метод запроса
            $this->setMethod();

            // Добавить тело
            $this->addBody();

            if(empty($this->_headers) == false) {
                // Установить заголовки
                curl_setopt($this->_request, CURLOPT_HTTPHEADER, $this->_headers);
            }

            // Отключить проверки SSL
            curl_setopt($this->_request, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($this->_request, CURLOPT_SSL_VERIFYHOST, false);

            // Отправить запрос и сохранить тело
            $this->_response = new Response(curl_exec($this->_request));

            // Установить код состояния
            $this->_response->setStatusCode(curl_getinfo($this->_request, CURLINFO_HTTP_CODE));

            // Закрыть соединение
            curl_close($this->_request);
        }

        /**
         * Получить ответ
         *
         * @return object
         */
        public function getResponse() {

            return $this->_response;
        }
    }

    class Response {

        /**
         * @var array
         */
        protected $_reason_phrases = array(
            // Информационные 1xx
            100 => "Продолжать",
            101 => "Переключение протоколов",

            // Успешные 2xx
            200 => "ОК",
            201 => "Создано",
            202 => "Принято",
            203 => "Информация не является авторитетной",
            204 => "Нет содержимого",
            205 => "Сбросить содержимое",
            206 => "Частичное содержимое",

            // Перенаправление 3xx
            300 => "Множественный выбор",
            301 => "Перемещено навсегда",
            302 => "Найдено",
            303 => "См. другое",
            304 => "Не изменено",
            305 => "Использовать прокси",
            306 => "(Не используется)",
            307 => "Временное перенаправление",

            // Ошибка клиента 4xx
            400 => "Неверный запрос",
            401 => "Не авторизован",
            402 => "Требуется оплата",
            403 => "Запрещено",
            404 => "Не найдено",
            405 => "Метод не разрешен",
            406 => "Неприемлемо",
            407 => "Требуется аутентификация прокси",
            408 => "Время ожидания запроса истекло",
            409 => "Конфликт",
            410 => "Удалено",
            411 => "Требуется длина",
            412 => "Предварительное условие не выполнено",
            413 => "Слишком большой размер запроса",
            414 => "Слишком длинный URI запроса",
            415 => "Неподдерживаемый тип медиа",
            416 => "Запрошенный диапазон не может быть удовлетворен",
            417 => "Ожидание не выполнено",

            // Ошибка сервера 5xx
            500 => "Внутренняя ошибка сервера",
            501 => "Не реализовано",
            502 => "Плохой шлюз",
            503 => "Сервис недоступен",
            504 => "Время ожидания шлюза истекло",
            505 => "Версия HTTP не поддерживается"
        );

        /**
         * @var integer
         */
        protected $_status_code;

        /**
         * @var string
         */
        protected $_body;

        /**
         * Конструктор
         *
         * @param   string      $body
         */
        public function __construct($body) {

            $this->_body = $body;
        }

        /**
         * Конструктор
         *
         * @param   string      $status_code
         */
        public function setStatusCode($status_code) {

            $this->_status_code = $status_code;
        }

        /**
         * Получить код состояния
         *
         * @return  integer
         */
        public function getStatusCode() {

            return $this->_status_code;
        }

        /**
         * Получить тело
         *
         * @return  string
         */
        public function getBody() {

            return $this->_body;
        }

        /**
         * Получить тело, декодированное из JSON
         *
         * @return  object|null
         */
        public function getBodyDecoded() {

            return json_decode($this->_body);
        }

        /**
         * Получить фразу причины
         *
         * @return string|boolean
         */
        public function getReasonPhrase() {

            if(array_key_exists($this->_status_code, $this->_reason_phrases)) {

                return $this->_reason_phrases[$this->_status_code];
            }
            else {

                return false;
            }
        }
    }

Вход

Есть два варианта запросить вход маршрут:

  • с именем пользователя и паролем

  • с API-токеном (токеном доступа)

Пример входа с параметрами имени пользователя и пароля.

<?php

    // Подключить классы Request и Response

    $url = 'https://api.example.com/v2/login';

    $params = array(
        'username'  => 'sample_username',
        'password'  => 'sample_password'
    );

    // Создать новый объект Request
    $request = new Request($url, 'POST', $params);

    // Отправить запрос
    $request->send();

    // Получить объект Response
    $response = $request->getResponse();

    if($response->getStatusCode() == 200) {

        // Получить данные сессионного токена
        $token = $response->getBodyDecoded();

        print_r($token);
    }
    else {

        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody() . PHP_EOL;
    }
?>

Пример входа с API-токеном (токеном доступа)

Аутентификация

Каждый запрос к контенту, связанному с пользователем, требует Авторизация установки заголовка, значение которого содержит тип токена и сессионный токен, полученный из запроса входа в API.

Действительный /login запрос к API вернет следующую JSON-нагрузку.

Этот Сессионный токен должен быть включен во все последующие запросы к API, связанные с пользовательским контентом.

Этот type должен быть добавлен перед токеном, отделяясь одним пробелом.

Этот expires_in — это время в секундах, в течение которого токен будет действителен. Когда это время истечет, потребуется получить новый токен через запрос /login.

Пример получения и установки заголовка авторизации с именем пользователя и паролем

Пример получения и установки заголовка авторизации с API-токеном

Коллекции

Ниже приведен пример запроса для получения Браузеры коллекции.

Статистика

Ниже приведен пример запроса рекламодателя к statistics/a/date.

В случае additional_group_by если значение задано, запрос будет сгруппирован по основному полю маршрута и дополнительному(-ым).

Пример статистики по датам, отфильтрованной по ID кампании 1234.

Пример статистики по датам с дополнительной группировкой по кампании.

post /statistics/a/global

Получить глобальную статистику рекламодателя

Пример 1 глобальной статистики

Пример запроса глобальной статистики.

Только group_by параметр обязателен. Значения по умолчанию для остальных параметров можно найти здесь.

Обратите внимание, что маршруты глобальной статистики (statistics/a/global, statistics/p/global) имеют другой формат параметров.

Пример 2 глобальной статистики

Получить статистику по датам, включая суммарные итоги.

Пример 3 глобальной статистики

Получить статистику по кампаниям и странам, отфильтрованную по конкретной дате и отсортированную по показам.

Пример 4 глобальной статистики

Получить статистику издателя по зонам и странам, отфильтрованную по конкретной операционной системе.

Последнее обновление

Это было полезно?