> For the complete documentation index, see [llms.txt](https://docs.exoclick.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.exoclick.com/api/fr/api-publique-exoclick/api-manual-php-examples.md).

# Exemples PHP

## Vue d'ensemble

Tous les exemples de code de cette section utilisent les classes suivantes.

La classe Request utilise **cURL** pour effectuer les requêtes à l'API.

La classe Response contient la réponse de l'API et les informations sur le code d'état renvoyé.

<details>

<summary>Classes Request et Response</summary>

```php
class Request {

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

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

        /**
         * @var chaîne
         */
        protected $_url;

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

        /**
         * @var chaîne|tableau
         */
        protected $_params;

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

        /**
         * Constructeur
         *
         * @param   chaîne      $url
         * @param   chaîne      $method
         * @param   tableau      $params
         */
        public function __construct($url, $method, $params = array()) {

            $this->_url = $url;

            // Définir la méthode
            $this->_method = $method;

            // Définir les paramètres
            $this->_params = $params;
        }

        /**
         * Déterminer la méthode de la requête
         *
         * @param   chaîne  $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;
            }
        }

        /**
         * Ajouter l'en-tête d'autorisation
         *
         * @param   chaîne  $type
         * @param   chaîne  $token
         */
        public function setAuthorizationHeader($type, $token) {

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

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

        /**
         * Ajouter un corps à la requête
         */
        private function addBody() {

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

                if(is_array($this->_params)) {
                    // Encoder le tableau en JSON
                    $this->_params = json_encode($this->_params);
                }

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

                // Ajouter un en-tête Content-Length
                $this->_headers[] = 'Content-length: ' . strlen($this->_params);
            }
        }

        /**
         * Ajouter une chaîne de requête à la requête
         */
        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) {
                    // Faire correspondre les paramètres avec l'URL
                    foreach($this->_params as $param => $value) {
                        $this->_url = preg_replace('/{' . $param . '}/', $value, $this->_url);
                    }
                }
            }
        }

        /**
         * Envoyer la requête
         */
        public function send() {

            // Initialiser la requête cURL
            $this->_request = curl_init();

            // Retourner la réponse sous forme de chaîne
            curl_setopt($this->_request, CURLOPT_RETURNTRANSFER, 1);

            // Ajouter une chaîne de requête
            $this->addQueryString();

            // Définir l'URL
            curl_setopt($this->_request, CURLOPT_URL, $this->_url);

            // Définir la méthode de requête
            $this->setMethod();

            // Ajouter un corps
            $this->addBody();

            if(empty($this->_headers) == false) {
                // Définir les en-têtes
                curl_setopt($this->_request, CURLOPT_HTTPHEADER, $this->_headers);
            }

            // Désactiver les vérifications SSL
            curl_setopt($this->_request, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($this->_request, CURLOPT_SSL_VERIFYHOST, false);

            // Envoyer la requête et stocker le corps
            $this->_response = new Response(curl_exec($this->_request));

            // Définir le code d'état
            $this->_response->setStatusCode(curl_getinfo($this->_request, CURLINFO_HTTP_CODE));

            // Fermer la connexion
            curl_close($this->_request);
        }

        /**
         * Obtenir la réponse
         *
         * @return objet
         */
        public function getResponse() {

            return $this->_response;
        }
    }

    class Response {

        /**
         * @var tableau
         */
        protected $_reason_phrases = array(
            // Informatif 1xx
            100 => "Continuer",
            101 => "Changement de protocole",

            // Succès 2xx
            200 => "OK",
            201 => "Créé",
            202 => "Accepté",
            203 => "Information non autoritative",
            204 => "Aucun contenu",
            205 => "Réinitialiser le contenu",
            206 => "Contenu partiel",

            // Redirection 3xx
            300 => "Choix multiples",
            301 => "Déplacé définitivement",
            302 => "Trouvé",
            303 => "Voir ailleurs",
            304 => "Non modifié",
            305 => "Utiliser un proxy",
            306 => "(Inutilisé)",
            307 => "Redirection temporaire",

            // Erreur client 4xx
            400 => "Requête incorrecte",
            401 => "Non autorisé",
            402 => "Paiement requis",
            403 => "Accès interdit",
            404 => "Introuvable",
            405 => "Méthode non autorisée",
            406 => "Non acceptable",
            407 => "Authentification proxy requise",
            408 => "Délai d'attente de la requête",
            409 => "Conflit",
            410 => "Disparu",
            411 => "Longueur requise",
            412 => "Précondition échouée",
            413 => "Entité de requête trop grande",
            414 => "URI de requête trop longue",
            415 => "Type de média non pris en charge",
            416 => "Plage demandée non satisfaisable",
            417 => "Échec de l'attente",

            // Erreur serveur 5xx
            500 => "Erreur interne du serveur",
            501 => "Non implémenté",
            502 => "Passerelle incorrecte",
            503 => "Service indisponible",
            504 => "Délai d'attente de la passerelle",
            505 => "Version HTTP non prise en charge"
        );

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

        /**
         * @var chaîne
         */
        protected $_body;

        /**
         * Constructeur
         *
         * @param   chaîne      $body
         */
        public function __construct($body) {

            $this->_body = $body;
        }

        /**
         * Constructeur
         *
         * @param   chaîne      $status_code
         */
        public function setStatusCode($status_code) {

            $this->_status_code = $status_code;
        }

        /**
         * Obtenir le code d'état
         *
         * @return  entier
         */
        public function getStatusCode() {

            return $this->_status_code;
        }

        /**
         * Obtenir le corps
         *
         * @return  chaîne
         */
        public function getBody() {

            return $this->_body;
        }

        /**
         * Obtenir le corps décodé en JSON
         *
         * @return  objet|null
         */
        public function getBodyDecoded() {

            return json_decode($this->_body);
        }

        /**
         * Obtenir la phrase de raison
         *
         * @return chaîne|booléen
         */
        public function getReasonPhrase() {

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

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

                return false;
            }
        }
    }
```

</details>

## Connexion

Il existe deux options pour demander la **connexion** route :

* avec un nom d'utilisateur et un mot de passe
* avec un jeton API (jeton d'accès)

Exemple de connexion avec les paramètres nom d'utilisateur et mot de passe.

```php
<?php

    // Inclure les classes Request et Response

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

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

    // Créer un nouvel objet Request
    $request = new Request($url, 'POST', $params);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet Response
    $response = $request->getResponse();

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

        // Récupérer les détails du jeton de session
        $token = $response->getBodyDecoded();

        print_r($token);
    }
    else {

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

### Exemple de connexion avec un jeton API (jeton d'accès)

```php
<?php

    // Inclure les classes Request et Response

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

    $params = array(
            'api_token'  => 'sample_token_2bb447abb71b69368901a....'
        );

    // Créer un nouvel objet Request
    $request = new Request($url, 'POST', $params);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet Response
    $response = $request->getResponse();

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

        // Récupérer les détails du jeton de session
        $token = $response->getBodyDecoded();

        print_r($token);
    }
    else {

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

## Authentification

Chaque requête liée au contenu utilisateur nécessite un **Autorisation** en-tête à définir, avec une valeur contenant le type de jeton et le jeton de session reçu de la requête de connexion à l'API.

Une requête valide **/login** requête à l'API renverra la charge utile JSON suivante.

```json
{
  "token": "",
  "type": "",
  "expires_in": 0
}
```

Le **Jeton de session** doit être inclus dans toutes les requêtes ultérieures liées au contenu utilisateur vers l'API.

Le **type** doit être ajouté au début du jeton, séparé par un seul espace.

```
Bearer 4e63518d383d8fcaefb516fe708b893727463031
```

Le **expires\_in** est la durée en secondes pendant laquelle le jeton sera valide. Une fois ce délai expiré, un nouveau jeton devra être obtenu via la requête /login.

### Exemple d'obtention et de définition de l'en-tête d'autorisation avec nom d'utilisateur et mot de passe

```php
<?php

    // Inclure les classes Request et Response

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

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

    // Créer un nouvel objet Request
    $request = new Request($url, 'POST', $params);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet Response
    $response = $request->getResponse();

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

        // Récupérer les détails du jeton de session
        $token = $response->getBodyDecoded();

        // Obtenir les campagnes
        $url = 'https://api.example.com/v2/campaigns';

        // Créer un nouvel objet Request
        $request = new Request($url, 'GET');

        // Définir l'en-tête d'autorisation
        $request->setAuthorizationHeader($token->type, $token->token);

        // Envoyer la requête
        $request->send();

        // Obtenir l'objet Response
        $response = $request->getResponse();

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

            // Récupérer les campagnes
            $campaigns = $response->getBodyDecoded();

            foreach($campaigns->result as $campaign) {
                // Afficher les noms des campagnes
                echo $campaign->name . PHP_EOL;
            }
        }
        else {
            // Erreur de requête des campagnes
            echo $response->getStatusCode() . PHP_EOL;
            echo $response->getReasonPhrase() . PHP_EOL;
            echo $response->getBody();
        }
    }
    else {
        // Connexion invalide
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

### Exemple d'obtention et de définition de l'en-tête d'autorisation avec un jeton API

```php
<?php

    // Inclure les classes Request et Response

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

    $params = array(
        'api_token'  => 'sample_token_2bb447abb71b69368901a....'
    );

    ...

?>
```

## Collections

Voici un exemple de requête pour obtenir la **Navigateurs** collection.

```php
<?php

    // Inclure les classes Request et Response

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

    // Créer un nouvel objet Request
    $request = new Request($url, 'GET');

    // Définir l'en-tête d'autorisation récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet Response
    $response = $request->getResponse();

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

        $browsers = $response->getBodyDecoded();

        foreach($browsers as $browser) {

            echo $browser->id . ': ' . $browser->name . PHP_EOL;
        }
    }
    else {
        // Collection introuvable
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

## Statistiques

Voici un exemple de requête d'annonceur pour **statistics/a/date**.

Dans le cas où **additional\_group\_by** la valeur est définie, la requête sera regroupée par le champ principal de la route et le ou les champs supplémentaires.

### Exemple de statistiques par date filtrées par l'ID de campagne 1234.

```php
<?php

    // Inclure les classes Request et Response

    $url = 'https://api.example.com/v2/statistics/a/date';

    // Spécifier l'ID de la campagne
    $params = array(
       'campaignid'  => 1234
    );

    $request = new Request($url, 'GET', $params);

    // Définir l'en-tête d'autorisation, récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet de réponse
    $response = $request->getResponse();

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

        $statistics = $response->getBodyDecoded();

        foreach($statistics->result as $statistic) {

            echo $statistic->ddate . ': ' . $statistic->value . PHP_EOL;
        }
    }
    else {
        // Statistiques de campagne introuvables
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

### Exemple de statistiques par date avec regroupement supplémentaire par campagne.

```php
<?php

    // Inclure les classes Request et Response

    $url = 'https://api.example.com/v2/statistics/a/date';

    // Spécifier l'ID de la campagne
    $params = array(
       'additional_group_by'  => 'campaign'
    );

    $request = new Request($url, 'GET', $params);

    // Définir l'en-tête d'autorisation, récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet de réponse
    $response = $request->getResponse();

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

        $statistics = $response->getBodyDecoded();

        foreach($statistics->result as $statistic) {
            echo $statistic->ddate . ' - ' . $statistic->idcampaign . ': ' . $statistic->value . PHP_EOL;
        }
    }
    else {
        // Statistiques de campagne introuvables
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

post /statistics/a/global

Obtenir les statistiques globales de l'annonceur

### Exemple 1 de statistiques globales

Exemple de requête pour les statistiques globales.

Seul le `group_by` paramètre est obligatoire. Les valeurs par défaut des autres paramètres se trouvent [Ici](https://api.exoclick.com/v2/docs/#!/47statistics/post_statistics_a_global).

Veuillez noter que les routes de statistiques globales (`statistics/a/global`, `statistics/p/global`) ont un format de paramètres différent.

```php
<?php

    // Inclure les classes Request et Response

    $url = 'https://api.example.com/v2/statistics/a/global';

    // Spécifier le group_by
    $params = [
        "group_by" => ["date"]
    ];

    $request = new Request($url, 'POST', $params);

    // Définir l'en-tête d'autorisation, récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet de réponse
    $response = $request->getResponse();

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

        $statistics = $response->getBodyDecoded();

        foreach($statistics->result as $statistic) {
            echo 'Date: ' . $statistic->group_by->date->date . ' -  Impressions: ' . $statistic->impressions .' - Coût: ' .  $statistic->cost . PHP_EOL;
        }
    }
    else {
        // Statistiques de campagne introuvables
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

### Exemple 2 de statistiques globales

Obtenir les statistiques par date, y compris les totaux cumulés.

```php
<?php

    // Inclure les classes Request et Response

    $url = 'https://api.example.com/v2/statistics/a/global';

    // Spécifier l'ID de la campagne
    $params = [
        "filter" => [
            "date_from" => "2019-01-10",
            "date_to" => "2019-01-31",
        ],
        "totals" => 1,
        "group_by" => ["date"]
    ];

    $request = new Request($url, 'POST', $params);

    // Définir l'en-tête d'autorisation, récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet de réponse
    $response = $request->getResponse();

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

        $statistics = $response->getBodyDecoded();

        foreach($statistics->result as $statistic) {
            echo 'Date: ' . $statistic->group_by->date->date . ' -  Impressions: ' . $statistic->impressions .' - Coût: ' .  $statistic->cost . PHP_EOL;
        }

        echo 'Coût total :' . $statistics->result_total->cost . PHP_EOL;
    }
    else {
        // Statistiques de campagne introuvables
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

### Exemple 3 de statistiques globales

Obtenir les statistiques par campagne et par pays filtrées par une date spécifique, triées par impressions.

```php
<?php

    // Inclure les classes Request et Response

    $url = 'https://api.example.com/v2/statistics/a/global';

    $params = [
        "filter" => [
            "date_from" => "2019-01-30",
            "date_to" => "2019-01-30",
        ],
        "group_by" => ["country_iso", "campaign_id"],
        "order_by" => [
            ["field" => "impressions", "order" => "desc"]
        ]
    ];


    $request = new Request($url, 'POST', $params);

    // Définir l'en-tête d'autorisation, récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet de réponse
    $response = $request->getResponse();

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

        $statistics = $response->getBodyDecoded();

        foreach($statistics->result as $statistic) {
            echo 'Pays: ' . $statistic->group_by->country_iso->country_iso . ' -  ID de campagne: ' . $statistic->group_by->campaign_id->id .' - Coût: ' .  $statistic->cost . PHP_EOL;
        }
    }
    else {
        // Statistiques de campagne introuvables
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```

### Exemple 4 de statistiques globales

Obtenir les statistiques des éditeurs par zone et par pays filtrées par un système d'exploitation spécifique.

```php
<?php

    // Inclure les classes Request et Response

    $url = 'https://api.example.com/v2/statistics/p/global';

    $params = [
        "filter" => [
            "date_from" => "2019-01-30",
            "date_to" => "2019-01-30",
            "operating_system_id" => [11, 12]
        ],
        "group_by" => ["zone_id", "country_iso"]
    ];


    $request = new Request($url, 'POST', $params);

    // Définir l'en-tête d'autorisation, récupéré lors de la requête de connexion précédente
    $request->setAuthorizationHeader($token->type, $token->token);

    // Envoyer la requête
    $request->send();

    // Obtenir l'objet de réponse
    $response = $request->getResponse();

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

        $statistics = $response->getBodyDecoded();

        foreach($statistics->result as $statistic) {
            echo ' ID de zone:' . $statistic->group_by->zone_id->id . ' - Pays: ' . $statistic->group_by->country_iso->country_iso .' - Revenu: ' .  $statistic->revenue . PHP_EOL;
        }
    }
    else {
        // Statistiques de campagne introuvables
        echo $response->getStatusCode() . PHP_EOL;
        echo $response->getReasonPhrase() . PHP_EOL;
        echo $response->getBody();
    }
?>
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.exoclick.com/api/fr/api-publique-exoclick/api-manual-php-examples.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
