Google Haritalar Platformu web hizmetleri, harita uygulamalarınız için coğrafi veriler sağlayan Google hizmetlerine yönelik HTTP arayüzleri koleksiyonudur.
Bu kılavuzda, web hizmeti isteklerinizi ayarlamak ve hizmet yanıtlarını işlemek için yararlı olan bazı yaygın uygulamalar açıklanmaktadır. Map Tiles API ile ilgili tüm belgeler için geliştirici kılavuzuna bakın.
Web hizmeti nedir?
Google Haritalar Platformu web hizmetleri, harici hizmetlerden Maps API verileri istemek ve bu verileri Haritalar uygulamalarınızda kullanmak için bir arayüzdür. Bu hizmetler, Google Haritalar Platformu Hizmet Şartları'ndaki Lisans Kısıtlamaları uyarınca bir haritayla birlikte kullanılacak şekilde tasarlanmıştır.
Maps API'leri web hizmetleri, belirli URL'lere HTTP(S) istekleri göndererek URL parametrelerini ve/veya JSON biçimli POST verilerini hizmetlere bağımsız değişken olarak iletir. Genellikle bu hizmetler, uygulamanız tarafından ayrıştırılmak ve/veya işlenmek üzere yanıt gövdesinde JSON olarak veri döndürür.
Web hizmeti isteğine örnek olarak aşağıdaki biçime sahip Street View meta veri isteği verilebilir:https://tile.googleapis.com/v1/streetview/metadata?session=YOUR_SESSION_TOKEN &key=YOUR_API_KEY &panoId=panoId
Not: Tüm Map Tiles API uygulamaları için kimlik doğrulama gerekir. Kimlik doğrulama bilgileri hakkında daha fazla bilgi edinin.
SSL/TLS Erişimi
API anahtarlarını kullanan veya kullanıcı verileri içeren tüm Google Haritalar Platformu istekleri için HTTPS gereklidir. HTTP üzerinden yapılan ve hassas veriler içeren istekler reddedilebilir.
Google API'lerinin Ölçülü Kullanımı
Kötü tasarlanmış API istemcileri, hem internete hem de Google'ın sunucularına gereğinden fazla yük bindirebilir. Bu bölümde, API'lerin istemcileri için bazı en iyi uygulamalar yer almaktadır. Bu en iyi uygulamaları takip etmek, API'lerin yanlışlıkla kötüye kullanılması nedeniyle uygulamanızın engellenmesini önlemenize yardımcı olabilir.
Eksponansiyel Geri Yükleme
Nadir durumlarda isteğiniz yerine getirilirken bir sorun oluşabilir. 4XX veya 5XX HTTP yanıt kodu alabilirsiniz ya da istemciniz ile Google'ın sunucusu arasındaki TCP bağlantısı başarısız olabilir. İlk istek başarısız olduğunda takip isteği başarılı olabileceğinden, isteği yeniden denemek genellikle faydalı olur. Ancak Google'ın sunucularına tekrar tekrar istek gönderen bir döngü oluşturmamak önemlidir. Bu döngü davranışı, istemciniz ile Google arasındaki ağda aşırı yüklenmeye neden olarak birçok taraf için sorunlara yol açabilir.
Daha iyi bir yaklaşım, denemeler arasındaki gecikmeleri artırarak yeniden denemektir. Genellikle gecikme, her denemede çarpımsal bir faktörle artırılır. Bu yaklaşım, eksponansiyel geri yükleme olarak bilinir.
Örneğin, Saat Dilimi API'ye şu isteği göndermek isteyen bir uygulama düşünün:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=1331161200&key=YOUR_API_KEYAşağıdaki Python örneğinde, isteğin eksponansiyel geri yükleme ile nasıl yapılacağı 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ı zincirinin üst kısımlarında, hızlı bir şekilde art arda istek gönderilmesine neden olan yeniden deneme kodu bulunmadığından emin olmanız gerekir.
Senkronize İstekler
Google'ın API'lerine gönderilen çok sayıda senkronize istek, Google'ın altyapısına yönelik Dağıtılmış Hizmet Reddi (DDoS) saldırısı olarak algılanabilir ve buna göre işlem yapılabilir. Bunu önlemek için API isteklerinin istemciler arasında senkronize edilmediğinden emin olmanız gerekir.
Örneğin, geçerli saat dilimindeki saati gösteren bir uygulama düşünün. Bu uygulama, istemci işletim sisteminde bir alarm ayarlayarak gösterilen saatin güncellenebilmesi için dakikanın başında sistemi uyandırabilir. Uygulama, bu alarm ile ilişkili işlem kapsamında API çağrısı yapmamalıdır.
Sabit bir alarma yanıt olarak API çağrıları yapmak, API çağrılarının zaman içinde eşit olarak dağıtılması yerine farklı cihazlar arasında bile dakikanın başına senkronize edilmesine neden olduğu için iyi bir yöntem değildir. Kötü tasarlanmış bir uygulama bunu yaptığında her dakikanın başında normal seviyenin altmış katı trafik artışı yaşanır.
Bunun yerine, rastgele seçilen bir zamana ayarlanmış ikinci bir alarm kullanmak iyi bir tasarım olabilir. Bu ikinci alarm tetiklendiğinde uygulama, ihtiyaç duyduğu tüm API'leri çağırır ve sonuçları depolar. Uygulama, dakikanın başında ekranını güncellemek istediğinde API'yi tekrar çağırmak yerine önceden depolanan sonuçları kullanır. Bu yaklaşımda API çağrıları zaman içinde eşit olarak dağıtılır. Ayrıca API çağrıları, ekran güncellenirken oluşturmayı geciktirmez.
Dakikanın başlangıcının yanı sıra, hedeflememeye dikkat etmeniz gereken diğer yaygın senkronizasyon zamanları, saatin başlangıcı ve her günün gece yarısı başlangıcıdır.
Yanıtlar işleniyor
Bu bölümde, bu değerlerin web hizmeti yanıtlarından dinamik olarak nasıl ayıklanacağı açıklanmaktadır.
Google Haritalar web hizmetleri, kolay anlaşılır ancak tam olarak kullanıcı dostu olmayan yanıtlar sağlar. Sorgu yaparken bir veri kümesini görüntülemek yerine birkaç belirli değeri ayıklamak isteyebilirsiniz. Genellikle web hizmetinden gelen yanıtları ayrıştırmak ve yalnızca sizi ilgilendiren değerleri ayıklamak istersiniz.
Kullanacağınız ayrıştırma şeması, çıkışı JSON biçiminde döndürüp döndürmediğinize bağlıdır. JSON yanıtları, zaten JavaScript nesneleri biçiminde olduğundan istemcide JavaScript'in kendisi içinde işlenebilir.