Utilisation de l'API de géolocalisation Abstract avec le client HTTP Symfony

Publié le 01/02/2022 • Mis à jour le 01/02/2022


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment utiliser l'API de géolocalisation Abstract avec le client HTTP Symfony. J'utilise une usine pour créer le client, mais dans une application Symfony, il est préférable d'injecter HttpClientInterface ou de déclarer vos clients dans le fichier de configuration framework.yaml. RedirectionExceptionInterface attrape les réponses 3xx, ClientExceptionInterface attrape les réponses 4xx et enfin ServerExceptionInterface intercepte les réponses 5xx. Par exemple, si votre clé d'API est incorrecte vous aurez une réponse avec un code 401 (HTTP_UNAUTHORIZED). RGPD : Rien n'est consigé ni stocké.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\Request;
use function Symfony\Component\String\u;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet188Trait
{
    public function snippet188(Request $request): void
    {
        $ip = $request->getClientIp();
        if (u($ip)->isEmpty()) {
            echo 'IP not found 😞.';

            return;
        }

        try {
            $httpClient = HttpClient::createForBaseUri('https://ipgeolocation.abstractapi.com');
            $response = $httpClient->request('GET', '/v1', [
                'query' => [
                    'api_key' => $this->getParameter('abstract_api_key'), // your secret API key
                    'ip_address' => $ip, // If this parameter is not set, it uses the one of the current request
                ],
            ]);
            $data = $response->toArray();
        } catch (RedirectionExceptionInterface|ClientExceptionInterface|ServerExceptionInterface|TransportExceptionInterface $e) {
            echo 'Error when accessing the Abstract API service, sorry 😞, response code: '.$e->getCode();

            return;
        }

        /** @var array{total_time: ?string} $info */
        $info = $response->getInfo();

        echo 'Your IP is: '.($data['ip_address'] ?? 'NA').PHP_EOL;
        echo 'City: '.($data['city'] ?? 'NA').PHP_EOL;
        echo 'Flag: '.($data['flag']['emoji'] ?? 'NA').PHP_EOL;
        echo 'Total time: '.($info['total_time'] ?? 'NA').' sec'.PHP_EOL;

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Plus sur le web  Snippet aléatoire