SDKs
Die API ist einfaches HTTPS und JSON und funktioniert daher bereits mit jeder Sprache. Zusätzlich entwickeln wir für jede der folgenden Sprachen eine offizielle Bibliothek. Jede ist bewusst klein gehalten: ein typisierter Client für die acht Endpunkte, Timeouts, Wiederholungen bei 429 und 503 sowie Debouncing für die Autovervollständigung. Kein Framework, keine Plugins.
Status nach Sprache
JavaScript und TypeScript In Arbeit
npm install @mygeocode/sdkFunktioniert in Node 18+, Deno, Bun und Browsern. Mit Typdefinitionen.
Python In Arbeit
pip install mygeocodePython 3.9+. Synchrone und asynchrone Clients, keine Abhängigkeiten außer httpx.
PHP Geplant
composer require mygeocode/sdkPHP 8.1+. PSR-18-Client, verwenden Sie Ihre eigene HTTP-Bibliothek.
Go Geplant
go get github.com/mygeocode/mygeocode-goNur Standardbibliothek. Unterstützt Context.
Java Geplant
com.mygeocode:sdkJava 11+. Basiert auf java.net.http, auch aus Kotlin nutzbar.
C# Geplant
dotnet add package MyGeocode.NET 6+. Durchgehend asynchron, System.Text.Json.
Ruby Geplant
gem install mygeocodeRuby 3.0+. Net::HTTP, keine Laufzeitabhängigkeiten.
Rust Geplant
cargo add mygeocodereqwest und serde, standardmäßig asynchron.
Die obigen Installationsbefehle sind reserviert und funktionieren ab dem Tag, an dem die jeweilige Bibliothek erscheint. Sie möchten wissen, wann? Senden Sie eine leere E-Mail an support@mygeocode.com, und wir antworten einmal, sobald es etwas zu installieren gibt.
Was jedes SDK können wird
Eine Methode pro Endpunkt
client.forward("..."), client.reverse(lat, lon), client.ipv4("8.8.8.8") und so weiter. Rückgabewerte sind typisierte Datensätze, die das JSON exakt abbilden, mit denselben Feldnamen.
Wiederholungen, die die Header beachten
Ein 429 mit Rücksetzzeit wird nach dieser Zeit wiederholt, bis zu einem von Ihnen festgelegten Limit. Ein 503 wird mit Backoff wiederholt. Alles andere wird als Fehler mit code und message der API ausgelöst.
Umgang mit dem Schlüssel
Übergeben Sie einen Schlüssel an den Konstruktor oder setzen Sie MYGEOCODE_KEY in der Umgebung. Es wird nichts auf die Festplatte geschrieben. Ein fehlender Schlüssel löst sofort einen Fehler mit einem Hinweis auf das Dashboard aus.
Nutzen Sie die HTTP-API schon heute
Hier ist eine Reverse-Geokodierung mit Fehlerbehandlung und einer Wiederholung bei 429, in den Sprachen, die die ersten SDKs abdecken werden. Ungefähr das werden die Bibliotheken intern tun.
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)
}Sie nutzen das SDK eines anderen Anbieters?
Dann brauchen Sie unseres vielleicht nicht. Die offiziellen Client-Bibliotheken von Google Maps, Bing, HERE, Mapbox und ipinfo akzeptieren meist eine eigene Basis-URL, und unsere Drop-in-Hosts antworten in den Formaten dieser Anbieter. Richten Sie die Bibliothek auf den passenden www.mygeocode.com Host aus und behalten Sie Ihren bestehenden Code.