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/sdk

Funktioniert in Node 18+, Deno, Bun und Browsern. Mit Typdefinitionen.

Python In Arbeit

pip install mygeocode

Python 3.9+. Synchrone und asynchrone Clients, keine Abhängigkeiten außer httpx.

PHP Geplant

composer require mygeocode/sdk

PHP 8.1+. PSR-18-Client, verwenden Sie Ihre eigene HTTP-Bibliothek.

Go Geplant

go get github.com/mygeocode/mygeocode-go

Nur Standardbibliothek. Unterstützt Context.

Java Geplant

com.mygeocode:sdk

Java 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 mygeocode

Ruby 3.0+. Net::HTTP, keine Laufzeitabhängigkeiten.

Rust Geplant

cargo add mygeocode

reqwest 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.