SDK

API सादा HTTPS और JSON है, इसलिए यह पहले से किसी भी भाषा से काम करता है। हम नीचे दी गई हर भाषा के लिए एक आधिकारिक लाइब्रेरी भी बना रहे हैं। हर लाइब्रेरी जानबूझकर छोटी है: आठ एंडपॉइंट के लिए एक typed क्लाइंट, टाइमआउट, 429 और 503 पर दोबारा कोशिश, और ऑटोकम्प्लीट के लिए डिबाउंसिंग। न कोई फ़्रेमवर्क, न प्लगइन।

भाषा के अनुसार स्थिति

JavaScript और TypeScript काम जारी

npm install @mygeocode/sdk

Node 18+, Deno, Bun और ब्राउज़र में काम करती है। टाइप के साथ आती है।

Python काम जारी

pip install mygeocode

Python 3.9+। sync और async क्लाइंट, httpx के अलावा कोई निर्भरता नहीं।

PHP योजना में

composer require mygeocode/sdk

PHP 8.1+। PSR-18 क्लाइंट, अपनी पसंद की HTTP लाइब्रेरी इस्तेमाल करें।

Go योजना में

go get github.com/mygeocode/mygeocode-go

केवल स्टैंडर्ड लाइब्रेरी। Context का समर्थन।

Java योजना में

com.mygeocode:sdk

Java 11+। java.net.http पर बनी, Kotlin से भी इस्तेमाल की जा सकती है।

C# योजना में

dotnet add package MyGeocode

.NET 6+। पूरी तरह async, System.Text.Json।

Ruby योजना में

gem install mygeocode

Ruby 3.0+। Net::HTTP, कोई रनटाइम निर्भरता नहीं।

Rust योजना में

cargo add mygeocode

reqwest और serde, डिफ़ॉल्ट रूप से async।

ऊपर दिए गए इंस्टॉल कमांड आरक्षित हैं और हर लाइब्रेरी के रिलीज़ होने के दिन से काम करेंगे। जानना चाहते हैं कब? support@mygeocode.com पर एक खाली ईमेल भेजें और जब इंस्टॉल करने को कुछ होगा, तब हम एक बार जवाब देंगे।

हर SDK क्या करेगी

हर एंडपॉइंट के लिए एक मेथड

client.forward("..."), client.reverse(lat, lon), client.ipv4("8.8.8.8"), और इसी तरह आगे। लौटाए गए मान typed रिकॉर्ड हैं जो JSON को उन्हीं फ़ील्ड नामों के साथ हूबहू दर्शाते हैं।

हेडर का सम्मान करने वाली दोबारा कोशिशें

रीसेट समय वाले 429 को उस समय के बाद दोबारा आज़माया जाता है, आपकी तय की गई सीमा तक। 503 को बैकऑफ़ के साथ दोबारा आज़माया जाता है। बाकी सब कुछ API के code और message के साथ त्रुटि के रूप में दिया जाता है।

कुंजी का प्रबंधन

कंस्ट्रक्टर को कुंजी दें या एनवायरनमेंट में MYGEOCODE_KEY सेट करें। डिस्क पर कुछ भी नहीं लिखा जाता। कुंजी न होने पर तुरंत डैशबोर्ड की ओर संकेत के साथ त्रुटि आती है।

आज ही HTTP API का उपयोग करें

यहाँ त्रुटि हैंडलिंग और 429 पर दोबारा कोशिश के साथ एक रिवर्स जियोकोड है, उन भाषाओं में जिन्हें पहली SDK कवर करेंगी। लाइब्रेरी अंदर से लगभग यही करेंगी।

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)
}

किसी दूसरे प्रदाता की SDK इस्तेमाल कर रहे हैं?

हो सकता है आपको हमारी ज़रूरत न हो। Google Maps, Bing, HERE, Mapbox और ipinfo की आधिकारिक क्लाइंट लाइब्रेरी ज़्यादातर कस्टम बेस URL स्वीकार करती हैं, और हमारे ड्रॉप-इन होस्ट उन प्रदाताओं के फ़ॉर्मैट में जवाब देते हैं। लाइब्रेरी को मेल खाते www.mygeocode.com होस्ट की ओर मोड़ें और अपना मौजूदा कोड रखें।