Roads API Web Hizmetlerini Kullanmayla İlgili En İyi Uygulamalar

Google Haritalar Platformu web hizmetleri, Google'a yönelik HTTP arayüzleri koleksiyonudur. Haritalar uygulamalarınız için coğrafi veriler sağlayan hizmetlerdir.

Bu kılavuzda, web hizmeti ve işleme konularını ele alacağız. Geliştirici kılavuzuna bakın Roads API hakkındaki tüm belgeleri inceleyebilirsiniz.

Web hizmeti nedir?

Google Haritalar Platformu web hizmetleri, Google Haritalar API'si verilerini istemek için kullanılan bir arayüzdür ve Haritalar uygulamalarınızdaki verileri kullanarak harici hizmetlerden yararlanabilirsiniz. Bu hizmetler uyarınca, bir haritayla birlikte kullanılmak üzere tasarlanır. Lisans Kısıtlamaları Google Haritalar Platformu Hizmet Şartları'na tabidir.

Haritalar API'leri web hizmetleri, URL parametrelerini ileten ve/veya Hizmetlerin bağımsız değişkenleri olarak JSON biçimli POST verileri. Genellikle bu hizmetler verileri ayrıştırmak için JSON olarak yanıt gövdesi ve/veya uygulamanız tarafından işleniyor.

Tipik bir Roads API web hizmeti isteği genellikle şu formu kullanın:

https://roads.googleapis.com/v1/snapToRoads?parameters&key=YOUR_API_KEY

Burada snapToRoads, istenen belirli hizmeti belirtir. Diğer Yollar hizmetler nearestRoads ve speedLimits içeriyor.

Not: All Roads API uygulamaları için kimlik doğrulama gerekir. Kimlik doğrulama kimlik bilgileri hakkında daha fazla bilgi edinin.

SSL/TLS Erişimi

HTTPS, API anahtarları kullanan veya kullanıcı içeren tüm Google Haritalar Platformu istekleri için gereklidir dışı verilerdir. HTTP üzerinden yapılan ve hassas veriler içeren istekler reddedilebilir.

Geçerli bir URL oluşturma

Bu örneğin "geçerli" bir URL kendiliğinden ortaya çıkar, ancak durum pek öyle değil. Bir özel karakterler içerebilir (ör. "上海+中國"); tarayıcının bunu dahili olarak çevirmesi gerekir iletilmeden önce bu karakterleri farklı bir kodlamaya dönüştürmelidir. Aynı jeton, UTF-8 girişi oluşturan veya kabul eden tüm kodlar UTF-8 karakterleri içeren URL'leri "geçerli" olarak işleyebilir ancak aynı zamanda bir web sunucusuna göndermeden önce çevirmesini isteyin. Bu sürece denir URL kodlaması veya yüzde kodlama.

Özel karakterler

Özel karakterleri çevirmemiz gerekiyor. tüm URL'ler, Üniforma Kaynak Tanımlayıcı (URI) spesifikasyonu. Bu, URL'lerin ASCII karakterlerinin yalnızca özel bir alt kümesini içermelidir: tanıdık alfanümerik semboller ve kontrol olarak kullanılmak üzere ayrılmış bazı karakterler karakterleri kullanabilirsiniz. Bu tabloda şu karakterler özetlenmektedir:

Geçerli URL Karakterlerinin Özeti
AyarlakarakterlerURL kullanımı
Alfanümerik a b c d e f g h i j k l m n o p q r s t u v g x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 Metin dizeleri, şema kullanımı (http), bağlantı noktası (8080) vb.
Ayrılmamış - _ . ~ Metin dizeleri
Rezervasyon yapıldı ! * ( ) ; : @ & = + TL , / ? % # [ ] Kontrol karakterleri ve/veya Metin Dizeleri

Geçerli bir URL oluştururken, URL'nin yalnızca tablosunu oluşturalım. Bu karakter grubunu genel olarak kullanmak için bir URL oluşturma biri ihmal, biri ikame olmak üzere iki soruna yol açar:

  • Kullanmak istediğiniz karakterler ayarlandı. Örneğin, yabancı dillerdeki karakterler gibi 上海+中國 etiketleri, tablodaki karakteri ekleyin. Genel kurala göre alanlar (yani alanlar izin verilmeyen içerikler) genellikle artı işaretiyle gösterilir '+' karakter de mevcut.
  • Yukarıdaki karakterler arasında ayrılmış karakterler olarak yer almaktadır. anahtar kelimenin olduğu gibi kullanılması gerekir. Örneğin, ?, şunu belirtmek için URL'lerde kullanılır: sorgu dizesinin başlangıcı; öğesini kullanmak istiyorsanız dizesi "? ve Gizemler'e hoş geldiniz." bu URL'yi kodlamanız gerekir '?' karakter.

URL olarak kodlanacak tüm karakterler kodlanmıştır '%' karakteri ve iki karakterden oluşan bir onaltılık karakter kullanılarak değerine karşılık gelir. Örneğin, UTF-8'deki 上海+中國 parametresi şu şekilde URL olarak kodlanır: %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B. İlgili içeriği oluşturmak için kullanılan ? and the Mysterians dizesinin URL'si şöyle olur: %3F+and+the+Mysterians veya %3F%20and%20the%20Mysterians.

Yaygın olarak kodlama gerektiren karakterler

Kodlanması gereken bazı yaygın karakterler şunlardır:

Güvenli olmayan karakter Kodlanmış değer
Boşluk %20
" %22
< %3C
> %3E
# %23
% %25
| %7C

Kullanıcı girişinden aldığınız bir URL'yi dönüştürmek bazen zor olabilir. Örneğin, bir kullanıcı "5th&Main Street" olarak bir adres girebilir. Genel olarak, URL'nizi kendi parçalarından oluşturmanız gerekir: herhangi bir kullanıcı girişi değişmez karakter olarak kabul edilir.

Ayrıca, URL'ler tüm Google Haritalar Platformu web hizmetleri için 16.384 karakterle sınırlıdır ve statik web API'leri. Çoğu hizmette bu karakter sınırına nadiren yaklaşılır. Ancak, belirli hizmetlerde uzun URL'lere neden olabilecek bazı parametreler bulunduğunu unutmayın.

Google API'lerinin Sonradan Kullanımı

Kötü tasarlanmış API istemcileri hem internette hem de internette Google sunucuları. Bu bölümde, API istemcileri için bazı en iyi uygulamalar yer almaktadır. Takip edilenler Bu en iyi uygulamalar, uygulamanızın yanlışlıkla kötüye kullanımı nedeniyle engellenmesini önlemenize yardımcı olabilir. API'lar.

Üstel Geri Alma

Nadiren isteğiniz yerine getirilirken bir şeyler ters gidebilir. 4XX veya 5XX HTTP olabilir veya TCP bağlantısı istemciniz ile Google'ın web sunucusu arasında bir yerde, sunucu. Çoğunlukla isteği yeniden denemek daha iyidir, takip isteği de başarılı olabilir. Ancak, bütçe oluşturmak için Google sunucularına istek gönderen sürekli bir döngü vardır. Bu döngü davranışı, birçok taraf için soruna neden olan bir iletişim ağı örneğidir.

Daha iyi bir yaklaşım, denemeler arasındaki gecikmeleri artırarak tekrar denemektir. Genellikle gecikme, her denemede çarpımsal bir faktörle artırılır. Bu yaklaşıma Üstel Geri Alma.

Örneğin, Time Zone API:

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=1331161200&key=YOUR_API_KEY

Aşağıdaki Python örneğinde, isteğin eksponansiyel geri yüklemeyle nasıl gönderileceği gösterilmektedir:

import json
import time
import urllib.error
import urllib.parse
import urllib.request

# The maps_key defined below isn't a valid Google Maps API key.
# You need to get your own API key.
# See https://developers.google.com/maps/documentation/timezone/get-api-key
API_KEY = "YOUR_KEY_HERE"
TIMEZONE_BASE_URL = "https://maps.googleapis.com/maps/api/timezone/json"


def timezone(lat, lng, timestamp):

    # Join the parts of the URL together into one string.
    params = urllib.parse.urlencode(
        {"location": f"{lat},{lng}", "timestamp": timestamp, "key": API_KEY,}
    )
    url = f"{TIMEZONE_BASE_URL}?{params}"

    current_delay = 0.1  # Set the initial retry delay to 100ms.
    max_delay = 5  # Set the maximum retry delay to 5 seconds.

    while True:
        try:
            # Get the API response.
            response = urllib.request.urlopen(url)
        except urllib.error.URLError:
            pass  # Fall through to the retry loop.
        else:
            # If we didn't get an IOError then parse the result.
            result = json.load(response)

            if result["status"] == "OK":
                return result["timeZoneId"]
            elif result["status"] != "UNKNOWN_ERROR":
                # Many API errors cannot be fixed by a retry, e.g. INVALID_REQUEST or
                # ZERO_RESULTS. There is no point retrying these requests.
                raise Exception(result["error_message"])

        if current_delay > max_delay:
            raise Exception("Too many retry attempts.")

        print("Waiting", current_delay, "seconds before retrying.")

        time.sleep(current_delay)
        current_delay *= 2  # Increase the delay each time we retry.


if __name__ == "__main__":
    tz = timezone(39.6034810, -119.6822510, 1331161200)
    print(f"Timezone: {tz}")

Ayrıca, uygulama çağrısında daha üst düzey bir yeniden deneme kodu olmadığından da kısa sürede tekrarlanan isteklere yol açan bir zincirle ilgilidir.

Senkronize İstekler

Google'ın API'lerine yapılan senkronize edilmiş çok sayıda istek, Dağıtılmış Hizmet Reddi (DDoS) saldırısı ve buna göre işlem yapılması. Alıcı: API isteklerinin senkronize edilmediğinden emin olun. müzakere tekniği de eklediniz.

Örneğin, saati geçerli saat diliminde gösteren bir uygulamayı ele alalım. Bu uygulama muhtemelen istemci işletim sisteminde alarm çalacak ve cihazı şu saatte uyandıracak: gösterilen zamanın güncellenebilmesi için dakikanın başlangıcını. Başvuru, Söz konusu alarmla ilişkili işlemlerin bir parçası olarak API çağrısı yapmamalıdır.

Sabit bir alarma karşılık olarak API çağrıları yapmak, API çağrılarının senkronize etmek yerine dakikanın başında senkronize edilir. eşit olarak dağıtılır. Bunu yapan kötü tasarlanmış bir uygulama, her dakikanın başında normal düzeylerde altmış kadar trafik alabilir.

Bunun yerine, rastgele seçilen bir zamana ayarlanmış ikinci bir alarm olması olası iyi bir tasarımdır. Bu ikinci alarm etkinleştiğinde uygulama ihtiyaç duyduğu API'leri çağırır ve sonuç. Uygulama dakika başında ekranını güncellemek istediğinde önceden saklanan sonuçları çağırır. Bu yaklaşımla, API çağrıları eşit olarak yayılır. Ayrıca, ekran etkinken API çağrılarının güncelleniyor.

Dakikanın başlangıcı dışında, diğer yaygın senkronizasyon zamanları için de hedeflenecekler seçeneği bir saatin başında, her günün başlangıcında ise gece yarısı olacak.

Yanıtlar İşleniyor

Bu bölümde, bu değerlerin web hizmeti yanıtlarından dinamik olarak nasıl ayıklanacağı anlatılmaktadır.

Google Haritalar web hizmetleri, Google Haritalar'da kullanıcı dostu olmadığını söyleyebiliriz. Sorgu gerçekleştirirken yerine bir veri kümesi görüntülemek yerine, muhtemelen birkaç değerler. Genellikle, yanıtları web'den ayrıştırmak yalnızca sizi ilgilendiren değerleri ayıklayabilir.

Kullandığınız ayrıştırma şeması, dönüşüm modellemeden önce çıktı. JSON yanıtları, zaten şu biçimindedir: JavaScript nesneleri, JavaScript'in kendi içinde işlenebilir gerekir.