Các phương pháp hay nhất khi sử dụng Dịch vụ web API Thẻ thông tin bản đồ

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 cho các dịch vụ của Google 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 hữu ích cho việc thiết lập các yêu cầu dịch vụ web và xử lý phản hồi của dịch vụ. Hãy tham khảo hướng dẫn dành cho nhà phát triển để xem tài liệu đầy đủ về Map Tiles API.

Dịch vụ web là gì?

Dịch vụ web của Google Maps Platform 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 Các quy định hạn chế về giấy phép trong Điều khoản dịch vụ của Google Maps Platform.

Các dịch vụ web của API Maps sử dụng yêu cầu HTTP(S) đến các URL cụ thể, truyền tham số URL và/hoặc dữ liệu POST ở định dạng JSON dưới dạng đối số cho các dịch vụ. Nhìn 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 để ứng dụng của bạn phân tích cú pháp và/hoặc xử lý.

Ví dụ về yêu cầu dịch vụ web là yêu cầu siêu dữ liệu của Chế độ xem đường phố, có dạng như sau:

https://tile.googleapis.com/v1/streetview/metadata?session=YOUR_SESSION_TOKEN&key=YOUR_API_KEY&panoId=panoId

Lưu ý: Tất cả ứng dụng Map Tiles API đều yêu cầu xác thực. Tìm hiểu thêm thông tin về thông tin xác thực.

Quyền truy cập SSL/TLS

Bạn phải sử dụng HTTPS cho tất cả các yêu cầu của Google Maps Platform có sử dụng khoá API hoặc chứa dữ liệu người dùng. Yêu cầu được thực hiện qua HTTP có chứa dữ liệu nhạy cảm có thể bị từ chối.

Sử dụng API của Google một cách hợp lý

Các ứng dụng API được thiết kế kém có thể gây ra tải nặng hơn mức cần thiết cho cả Internet và máy chủ của Google. Phần này trình bày một số phương pháp hay nhất dành cho ứng dụng khách của API. Việc làm theo các phương pháp hay nhất này có thể giúp bạn tránh được việc ứng dụng bị chặn do vô tình sử dụng sai 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 lỗi khi phân phát yêu cầu của bạn; bạn có thể nhận được mã phản hồi HTTP 4XX hoặc 5XX hoặc kết nối TCP có thể không thành công ở đâu đó giữa ứng dụng của bạn và máy chủ của Google. Thông thường, bạn nên thử lại yêu cầu vì yêu cầu tiếp theo có thể thành công khi yêu cầu ban đầu không thành công. Tuy nhiên, bạn không nên chỉ lặp lại nhiều lần việc 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 ứng dụ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 theo hệ số nhân sau mỗi lần thử, đây là phương pháp được gọi là Thuật toán đợi luỹ thừa.

Ví dụ: hãy xem xét một ứng dụng muốn gửi yêu cầu này đến Time Zone API:

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

Ví dụ về Python sau đây cho thấy cách thực hiện 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 cẩn thận để không có mã thử lại cao hơn trong chuỗi lệnh gọi ứng dụng dẫn đến các yêu cầu lặp lại liên tiếp nhanh chóng.

Yêu cầu đồng bộ

Một số lượng lớn yêu cầu đồng bộ hoá đến API của Google có thể trông giống như một cuộc tấn công từ chối dịch vụ phân tán (DDoS) vào cơ sở hạ tầng của Google và sẽ được xử lý tương ứng. Để tránh điều 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 của ứng dụng khách để đánh thức ứng dụng khách vào đầu phút, nhờ đó thời gian hiển thị có thể được cập nhật. Ứng dụng không được 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 cố định là không tốt vì điều này khiến các lệnh gọi API được đồng bộ hoá với thời điểm bắt đầu của phút, ngay cả giữa các thiết bị khác nhau, thay vì được phân phối đồng đều theo thời gian. Một ứng dụng được thiết kế kém khi làm việc này sẽ tạo ra lưu lượng truy cập tăng đột biến gấp 60 lần mức bình thường vào đầu mỗi phút.

Thay vào đó, một thiết kế phù hợp có thể là đặt chuông báo thứ hai vào một thời điểm đượ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 mọi API cần thiết 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ả đã lưu trữ trước đó thay vì gọi lại API. Với phương pháp này, các lệnh gọi API được phân bổ đều theo thời gian. Hơn nữa, các lệnh gọi API không làm chậm quá trình kết xuất khi màn hình đang được cập nhật.

Ngoài thời điểm bắt đầu phút, bạn cũng nên lưu ý không nhắm đến các thời điểm đồng bộ hoá phổ biến khác như thời điểm bắt đầu giờ và thời điểm 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 về 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.

Các dịch vụ web của Google Maps cung cấp các phản hồi dễ 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ì hiển thị một tập dữ liệu, bạn có thể muốn trích xuất một vài giá trị cụ thể. Nhìn chung, bạn sẽ muốn phân tích cú pháp phản hồi từ dịch vụ web và chỉ trích xuất những giá trị mà bạn quan tâm.

Lược đồ phân tích cú pháp bạn sử dụng phụ thuộc vào việc bạn có trả về kết quả ở định dạng JSON hay không. Phản hồi JSON, vốn đã ở dạng đối tượng Javascript, có thể được xử lý trong chính Javascript trên máy khách.