Các phương pháp hay nhất khi sử dụng Dịch vụ web API vị trí địa lý

Các dịch vụ web của Nền tảng Google Maps là một tập hợp các giao diện HTTP đối với Google các dịch vụ cung cấp dữ liệu địa lý cho các ứng dụng bản đồ của bạn.

Hướng dẫn này mô tả một số phương pháp phổ biến giúp bạn thiết lập dịch vụ web và xử lý phản hồi của dịch vụ. Tham khảo hướng dẫn dành cho nhà phát triển để xem tài liệu đầy đủ về API vị trí địa lý.

Dịch vụ web là gì?

Các dịch vụ web của Nền tảng Google Maps là một giao diện để yêu cầu dữ liệu API Maps từ các dịch vụ bên ngoài và sử dụng dữ liệu trong các ứng dụng Maps của bạn. Các dịch vụ này được thiết kế để sử dụng cùng với bản đồ, theo Quy định hạn chế về giấy phép trong Điều khoản dịch vụ của Nền tảng Google Maps.

Các dịch vụ web của API Maps sử dụng yêu cầu HTTP(S) cho các URL cụ thể, chuyển các tham số URL và/hoặc Dữ liệu POST ở định dạng JSON làm đối số cho các dịch vụ. Nói chung, các dịch vụ này trả về dữ liệu trong nội dung phản hồi dưới dạng JSON để phân tích cú pháp và/hoặc đang xử lý.

Yêu cầu vị trí địa lý được gửi bằng cách sử dụng POST đến URL sau:

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

Lưu ý: Tất cả ứng dụng API vị trí địa lý đều yêu cầu xác thực. Xem thêm thông tin về thông tin xác thực.

Truy cập SSL/TLS

HTTPS là bắt buộc cho tất cả các yêu cầu trên Nền tảng Google Maps sử dụng khoá API hoặc chứa người dùng . Những yêu cầu được thực hiện qua HTTP chứa dữ liệu nhạy cảm có thể bị từ chối.

Sử dụng lịch sự các API của Google

Các ứng dụng API được thiết kế kém có thể đặt tải nhiều hơn mức cần thiết trên cả Internet và của Google. Phần này trình bày một số phương pháp hay nhất dành cho các ứng dụng khách sử dụng API. Đang theo dõi Các phương pháp hay nhất này có thể giúp bạn tránh việc ứng dụng của mình bị chặn do vô tình sử dụng sai mục đích các API.

Thuật toán thời gian đợi luỹ thừa

Trong một số ít trường hợp, có thể xảy ra sự cố khi thực hiện yêu cầu của bạn; bạn có thể nhận được HTTP 4XX hoặc 5XX mã phản hồi hoặc kết nối TCP có thể chỉ bị lỗi ở đâu đó giữa ứng dụng của bạn và máy chủ. Thông thường, bạn nên thử yêu cầu lại yêu cầu theo dõi có thể thành công khi yêu cầu ban đầu không thành công. Tuy nhiên, điều quan trọng không chỉ là lặp lại nhiều lần để gửi yêu cầu đến máy chủ của Google. Hành vi lặp lại này có thể làm quá tải mạng giữa khách hàng của bạn và Google gây ra sự cố cho nhiều bên.

Cách tốt hơn là thử lại với độ trễ tăng dần giữa các lần thử. Thông thường, độ trễ sẽ tăng lên bằng một hệ số nhân với mỗi lần thử, một phương pháp được gọi là Thuật toán thời gian đợi luỹ thừa.

Ví dụ: hãy xem xét một đơn đăng ký muốn gửi yêu cầu này đến API Múi giờ:

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

Ví dụ sau đây trong Python cho thấy cách tạo yêu cầu bằng thuật toán thời gian đợi luỹ thừa:

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

Bạn cũng nên lưu ý rằng sẽ không có mã thử lại cao hơn trong lệnh gọi ứng dụng dẫn đến các yêu cầu lặp lại liên tiếp nhau.

Yêu cầu đã đồng bộ hoá

Một số lượng lớn các yêu cầu được đồng bộ hóa với các API của Google có thể trông giống như Cuộc tấn công Từ chối dịch vụ (DDoS) nhắm vào cơ sở hạ tầng của Google và được xử lý tương ứng. Người nhận để tránh tình trạng này, bạn nên đảm bảo rằng các yêu cầu API không được đồng bộ hoá giữa các ứng dụng.

Ví dụ: hãy xem xét một ứng dụng hiển thị thời gian theo múi giờ hiện tại. Ứng dụng này có thể sẽ đặt chuông báo trong hệ điều hành ứng dụng đánh thức thiết bị lúc thời gian bắt đầu của phút để có thể cập nhật thời gian hiển thị. Ứng dụng nên không thực hiện bất kỳ lệnh gọi API nào trong quá trình xử lý liên quan đến chuông báo đó.

Việc thực hiện lệnh gọi API để phản hồi một chuông báo đã khắc phục sẽ không tốt vì điều này dẫn đến việc các lệnh gọi API bị được đồng bộ hoá với thời điểm bắt đầu phút, ngay cả giữa các thiết bị khác nhau, thay vì được phân bổ đồng đều theo thời gian. Một ứng dụng được thiết kế không tốt làm việc này sẽ tạo ra ở mức 60 lần mức bình thường vào đầu mỗi phút.

Thay vào đó, bạn nên đặt chuông báo thứ hai theo thời gian được chọn ngẫu nhiên. Khi chuông báo thứ hai này kích hoạt, ứng dụng sẽ gọi bất kỳ API nào mà ứng dụng cần và lưu trữ kết quả. Khi muốn cập nhật màn hình vào đầu phút, ứng dụng sẽ sử dụng kết quả được lưu trữ trước đó thay vì gọi lại API. Với phương pháp này, lệnh gọi API được trải đều theo thời gian. Ngoài ra, các lệnh gọi API không trì hoãn việc kết xuất khi màn hình đang đang được cập nhật.

Ngoài phút bắt đầu, các thời gian đồng bộ hoá thông thường khác mà bạn nên cẩn thận không cần nhắm mục tiêu là thời điểm bắt đầu một giờ và bắt đầu mỗi ngày vào lúc nửa đêm.

Đang xử lý câu trả lời

Phần này thảo luận cách trích xuất các giá trị này một cách linh động từ phản hồi của dịch vụ web.

Dịch vụ web của Google Maps cung cấp câu trả lời dễ dàng hiểu, nhưng không hoàn toàn thân thiện với người dùng. Khi thực hiện truy vấn, thay vì ngoài việc hiển thị một tập dữ liệu cụ thể, bạn có thể muốn trích xuất một vài thông tin giá trị. Thông thường, bạn nên phân tích cú pháp phản hồi từ trang web và chỉ trích xuất những giá trị bạn quan tâm.

Giao thức phân tích cú pháp mà bạn sử dụng phụ thuộc vào việc bạn có quay lại hay không đầu ra trong JSON. Phản hồi JSON đang ở dạng Đối tượng JavaScript có thể được xử lý trong chính JavaScript trên máy khách.