Geolocation API ウェブサービスを使用する際のベスト プラクティス

Google Maps Platform ウェブサービスは、Google 地図アプリケーションに地理データを提供するサービス。

このガイドでは、リソースの設定に役立つ一般的な手順について説明します。 ウェブサービス サービスレスポンスの処理に 使用されますデベロッパー ガイドをご覧ください。 をご覧ください。

ウェブサービスとは

Google Maps Platform ウェブサービスは、Maps API のデータをリクエストするためのインターフェースです。 マップ アプリケーション内でデータを使用する方法について説明します。これらのサービスは、 使用できるように設計されているため、 ライセンスの制限 をご覧ください。

Maps API ウェブサービスは、特定の URL に HTTP(S) リクエストを使用して、URL パラメータや サービスの引数としての JSON 形式の POST データ。通常、これらのサービスは、 解析および変換用の JSON 形式のレスポンス本文 アプリケーションによる処理です。

Geolocation リクエストは、次の URL に POST で送信します。

https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY

: すべての Geolocation API アプリケーションには認証が必要です。 認証情報の詳細を確認する。

SSL/TLS アクセス

API キーを使用する、またはユーザーを含む Google Maps Platform リクエストには、すべて HTTPS が必須です。 できます。機密データを含む HTTP 経由で送信されたリクエストは拒否される場合があります。

Google API の適切な使用

API クライアントの設計に問題があると、インターネットと Google のサーバー。このセクションでは、API のクライアントのベスト プラクティスについて説明します。フォロー中 ベスト プラクティスを 1 つにまとめれば、誤って 説明します。

指数関数的バックオフ

まれに、リクエストの処理中になんらかの問題が生じることがあります。4XX または 5XX HTTP エラーが返されることがあります レスポンス コードを返さなかった場合、クライアントと Google のネットワークの間で単に TCP 接続が あります。多くの場合、次のようにリクエストを再試行する価値はあります。 元のリクエストが失敗した場合でも、フォローアップ リクエストが成功する可能性があります。ただし、単に Google Cloud の Google のサーバーにリクエストを繰り返し行うループが発生します。このループ動作により、パイプラインに クライアントと Google の間のネットワークが原因で、多くの関係者に問題が生じることがあります。

よりよいアプローチは、試行間の遅延を増加させながら再試行することです。通常、 試行のたびに乗法係数で増加します。この手法は 指数バックオフ

たとえば、アプリケーションでこのリクエストを Time Zone API:

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

次の Python の例では、指数関数的バックオフを使用してリクエストを実行する方法を示しています。

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

また、アプリケーション呼び出しの上位に再試行コードを置かないように注意する必要があります。 連続してリクエストが繰り返されるチェーンです。

同期されたリクエスト

Google の API への大量の同期リクエストは、分散リクエストのように Google のインフラストラクチャに対するサービス拒否(DDoS)攻撃を受けたため、適切に対処する宛先 API リクエストが同期されていないことを確かめるために、 通信できます。

たとえば、現在のタイムゾーンで時刻を表示するアプリケーションについて考えてみましょう。 このアプリケーションはおそらく、クライアント オペレーティング システムでアラームをセットし、 表示されている時刻を更新できるようにします。アプリケーションは、 しないでください。

固定されたアラームに応答して API 呼び出しを行うと、API 呼び出しが 異なるデバイス間でも同期されずに、 均等に分散されます。アプリケーションの設計が不適切だと、このような処理を行うと、 通常の 60 倍のレベルでトラフィックが 下がります

その代わりに、ランダムに選択された時間に 2 つ目のアラームを設定するのが良い設計の 1 つです。 この 2 番目のアラームを起動すると、アプリケーションは必要な API を呼び出し、 表示されます。アプリケーションで 0 分の開始時に表示を更新する場合は、 API を再度呼び出す必要はありません。この方法では 時系列で均等に分散されます。さらに、API 呼び出しによってレンダリングが遅延することはありません。 更新されます。

時刻の初め以外の一般的な同期時刻については、 ターゲットにしない時間を指定できます。

レスポンスの処理

このセクションでは、これらの値をウェブサービス レスポンスから動的に抽出する方法について説明します。

Google マップ ウェブサービスが提供するレスポンスは、 理解していても、まったくユーザー フレンドリーではありません。クエリを実行するときは 単に特定のデータセットだけを 使用できます。通常は、ウェブからのレスポンスを解析し、 関心のある値のみを抽出できます

使用する解析スキームは、レスポンスを返すかどうかによって JSON での出力です。JSON レスポンスは、すでに次の形式になっています。 JavaScript オブジェクト(JavaScript 自体で処理可能) 必要ありません。