SDK

L'API repose simplement sur HTTPS et JSON, elle fonctionne donc déjà depuis n'importe quel langage. Nous développons aussi une bibliothèque officielle pour chacun des langages ci-dessous. Chacune est volontairement légère : un client typé pour les huit endpoints, des délais d'expiration, des nouvelles tentatives sur 429 et 503, et un anti-rebond pour la saisie semi-automatique. Aucun framework, aucun plugin.

État par langage

JavaScript et TypeScript En cours

npm install @mygeocode/sdk

Fonctionne avec Node 18+, Deno, Bun et les navigateurs. Livré avec les types.

Python En cours

pip install mygeocode

Python 3.9+. Clients synchrone et asynchrone, aucune dépendance en dehors de httpx.

PHP Prévu

composer require mygeocode/sdk

PHP 8.1+. Client PSR-18, utilisez la bibliothèque HTTP de votre choix.

Go Prévu

go get github.com/mygeocode/mygeocode-go

Bibliothèque standard uniquement. Compatible avec context.

Java Prévu

com.mygeocode:sdk

Java 11+. Basé sur java.net.http, utilisable aussi depuis Kotlin.

C# Prévu

dotnet add package MyGeocode

.NET 6+. Entièrement asynchrone, System.Text.Json.

Ruby Prévu

gem install mygeocode

Ruby 3.0+. Net::HTTP, aucune dépendance à l'exécution.

Rust Prévu

cargo add mygeocode

reqwest et serde, asynchrone par défaut.

Les commandes d'installation ci-dessus sont réservées et fonctionneront le jour de la sortie de chaque bibliothèque. Vous voulez savoir quand ? Envoyez un e-mail vide à support@mygeocode.com et nous vous répondrons une seule fois, quand il y aura quelque chose à installer.

Ce que fera chaque SDK

Une méthode par endpoint

client.forward("..."), client.reverse(lat, lon), client.ipv4("8.8.8.8"), et ainsi de suite. Les valeurs renvoyées sont des enregistrements typés qui reflètent exactement le JSON, avec les mêmes noms de champs.

Des nouvelles tentatives qui respectent les en-têtes

Un 429 accompagné d'une heure de remise à zéro est relancé après cette heure, jusqu'à une limite que vous fixez. Un 503 est relancé avec un délai croissant. Tout le reste est levé comme une erreur avec le code et le message de l'API.

Gestion des clés

Passez une clé au constructeur ou définissez MYGEOCODE_KEY dans l'environnement. Rien n'est écrit sur le disque. Une clé manquante lève immédiatement une erreur avec un renvoi vers le tableau de bord.

Utilisez l'API HTTP dès aujourd'hui

Voici un géocodage inverse avec gestion des erreurs et nouvelle tentative sur 429, dans les langages que couvriront les premiers SDK. C'est à peu près ce que les bibliothèques feront en interne.

const BASE = "https://api.mygeocode.com/v1";

async function reverse(lat, lon, { key = process.env.MYGEOCODE_KEY, retries = 2 } = {}) {
  const url = new URL(BASE + "/reverse");
  url.searchParams.set("lat", lat);
  url.searchParams.set("lon", lon);

  const headers = key ? { "X-API-Key": key } : {};
  const res = await fetch(url, { headers });

  if (res.status === 429 && retries > 0) {
    const reset = Number(res.headers.get("X-Quota-Reset")) * 1000;
    const wait = Math.min(Math.max(reset - Date.now(), 1000), 60_000);
    await new Promise((r) => setTimeout(r, wait));
    return reverse(lat, lon, { key, retries: retries - 1 });
  }

  const data = await res.json();
  if (data.status !== "ok") throw new Error(`${data.error.code}: ${data.error.message}`);
  return data.result;
}

const place = await reverse(48.8584, 2.2945);
console.log(place.formatted, place.precision);
import os
import time
import requests

BASE = "https://api.mygeocode.com/v1"


class MyGeocodeError(Exception):
    pass


def reverse(lat, lon, key=os.environ.get("MYGEOCODE_KEY"), retries=2):
    headers = {"X-API-Key": key} if key else {}
    r = requests.get(f"{BASE}/reverse", params={"lat": lat, "lon": lon}, headers=headers, timeout=10)

    if r.status_code == 429 and retries > 0:
        reset = int(r.headers.get("X-Quota-Reset", 0))
        time.sleep(min(max(reset - time.time(), 1), 60))
        return reverse(lat, lon, key=key, retries=retries - 1)

    data = r.json()
    if data["status"] != "ok":
        raise MyGeocodeError(f'{data["error"]["code"]}: {data["error"]["message"]}')
    return data["result"]


place = reverse(48.8584, 2.2945)
print(place["formatted"], place["precision"])
<?php
const BASE = "https://api.mygeocode.com/v1";

function reverse(float $lat, float $lon, ?string $key = null, int $retries = 2): array
{
    $key ??= getenv("MYGEOCODE_KEY") ?: null;
    $ch = curl_init(BASE . "/reverse?" . http_build_query(["lat" => $lat, "lon" => $lon]));
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_HTTPHEADER => $key ? ["X-API-Key: $key"] : [],
    ]);
    $body = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    if ($status === 429 && $retries > 0) {
        sleep(5);
        return reverse($lat, $lon, $key, $retries - 1);
    }

    $data = json_decode($body, true);
    if ($data["status"] !== "ok") {
        throw new RuntimeException($data["error"]["code"] . ": " . $data["error"]["message"]);
    }
    return $data["result"];
}

$place = reverse(48.8584, 2.2945);
echo $place["formatted"], " (", $place["precision"], ")\n";
package main

import (
	"encoding/json"
	"errors"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"strconv"
	"time"
)

const base = "https://api.mygeocode.com/v1"

type Result struct {
	Formatted string  `json:"formatted"`
	Lat       float64 `json:"lat"`
	Lon       float64 `json:"lon"`
	Precision string  `json:"precision"`
}

type envelope struct {
	Status string  `json:"status"`
	Result *Result `json:"result"`
	Error  *struct {
		Code    string `json:"code"`
		Message string `json:"message"`
	} `json:"error"`
}

func reverse(lat, lon float64, retries int) (*Result, error) {
	q := url.Values{"lat": {strconv.FormatFloat(lat, 'f', -1, 64)}, "lon": {strconv.FormatFloat(lon, 'f', -1, 64)}}
	req, _ := http.NewRequest("GET", base+"/reverse?"+q.Encode(), nil)
	if key := os.Getenv("MYGEOCODE_KEY"); key != "" {
		req.Header.Set("X-API-Key", key)
	}
	resp, err := (&http.Client{Timeout: 10 * time.Second}).Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	if resp.StatusCode == 429 && retries > 0 {
		time.Sleep(5 * time.Second)
		return reverse(lat, lon, retries-1)
	}

	var env envelope
	if err := json.NewDecoder(resp.Body).Decode(&env); err != nil {
		return nil, err
	}
	if env.Status != "ok" {
		return nil, errors.New(env.Error.Code + ": " + env.Error.Message)
	}
	return env.Result, nil
}

func main() {
	place, err := reverse(48.8584, 2.2945, 2)
	if err != nil {
		panic(err)
	}
	fmt.Println(place.Formatted, place.Precision)
}

Vous utilisez le SDK d'un autre fournisseur ?

Vous n'aurez peut-être pas besoin du nôtre. Les bibliothèques clientes officielles de Google Maps, Bing, HERE, Mapbox et ipinfo acceptent pour la plupart une URL de base personnalisée, et nos hôtes compatibles répondent dans les formats de ces fournisseurs. Pointez la bibliothèque vers l'hôte www.mygeocode.com correspondant et gardez le code que vous avez.