Utilisation de l'API de géolocalisation Abstract avec le client HTTP Symfony
Publié le 01/02/2022 • Actualisé le 01/02/2022
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 Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use function Symfony\Component\String\u;
/**
* 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