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 đến 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 để thiết lập các yêu cầu dịch vụ web và xử lý phản hồi dịch vụ. Hãy tham khảo hướng dẫn dành cho nhà phát triển để biết tài liệu đầy đủ về API Đường.
Dịch vụ web là gì?
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 Các 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 các yêu cầu HTTP(S) đến các URL cụ thể, truyề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ụ. Nhìn chung, các dịch vụ này trả về dữ liệu trong phần 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ý.
Yêu cầu dịch vụ web API Đường thường có dạng sau:
https://roads.googleapis.com/v1/snapToRoads?parameters&key=YOUR_API_KEY
trong đó snapToRoads
cho biết dịch vụ cụ thể được yêu cầu. Các dịch vụ Đường khác bao gồm nearestRoads
và speedLimits
.
Lưu ý: Tất cả ứng dụng API Đường đều yêu cầu xác thực. Xem thêm thông tin về thông tin xác thực.
Quyền truy cập SSL/TLS
Tất cả các yêu cầu gửi tới Nền tảng Google Maps sử dụng khoá API hoặc chứa dữ liệu người dùng đều phải sử dụng giao thức HTTPS. Các yêu cầu được thực hiện qua HTTP và chứa dữ liệu nhạy cảm có thể bị từ chối.
Tạo URL hợp lệ
Bạn có thể nghĩ rằng một URL "hợp lệ" là điều hiển nhiên, nhưng
đây không phải là trường hợp hoàn toàn đúng. Ví dụ: URL được nhập trong thanh địa chỉ của trình duyệt có thể chứa các ký tự đặc biệt (ví dụ: "上海+中國"
); trình duyệt cần dịch nội bộ các ký tự đó thành một cách mã hoá khác trước khi truyền.
Tương tự, mọi mã tạo hoặc chấp nhận dữ liệu đầu vào UTF-8 đều có thể coi URL có ký tự UTF-8 là "hợp lệ", nhưng cũng cần dịch các ký tự đó trước khi gửi đến máy chủ web.
Quá trình này được gọi là
mã hoá URL hoặc mã hoá phần trăm.
Các ký tự đặc biệt
Chúng ta cần dịch các ký tự đặc biệt vì tất cả URL cần tuân thủ cú pháp do quy cách Uniform Resource Identifier (URI) (Giá trị nhận dạng tài nguyên đồng nhất) chỉ định. Về cơ bản, điều này có nghĩa là URL chỉ được chứa một tập hợp con đặc biệt của ký tự ASCII: các ký hiệu chữ và số quen thuộc và một số ký tự được đặt trước để dùng làm ký tự điều khiển trong URL. Bảng này tóm tắt các ký tự này:
Chuẩn bị | ký tự | Mức sử dụng URL |
---|---|---|
Chữ và số | 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 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 | Chuỗi văn bản, cách sử dụng giao thức (http ), cổng (8080 ), v.v. |
Không dành riêng | – _ . ~ | Chuỗi văn bản |
Đã đặt trước | ! * ' ( ) ; : @ & = + $ , / ? % # [ ] | Điều khiển ký tự và/hoặc Chuỗi văn bản |
Khi tạo một URL hợp lệ, bạn phải đảm bảo rằng URL đó chỉ chứa các ký tự xuất hiện trong bảng. Việc tuân thủ một URL để sử dụng bộ ký tự này thường dẫn đến hai vấn đề, một vấn đề về việc bỏ qua và một vấn đề về việc thay thế:
- Các ký tự mà bạn muốn xử lý nằm ngoài tập hợp trên. Ví dụ: các ký tự bằng ngôn ngữ nước ngoài như
上海+中國
cần được mã hoá bằng các ký tự ở trên. Theo quy ước phổ biến, dấu cách (không được phép trong URL) cũng thường được biểu thị bằng ký tự dấu cộng'+'
. - Các ký tự tồn tại trong tập hợp trên dưới dạng ký tự được đặt trước, nhưng cần được sử dụng theo nghĩa đen.
Ví dụ:
?
được dùng trong URL để chỉ báo đầu chuỗi truy vấn; nếu muốn sử dụng chuỗi "? and the Mysterions", bạn cần mã hoá ký tự'?'
.
Tất cả ký tự cần được mã hoá URL đều được mã hoá bằng ký tự '%'
và giá trị thập lục phân gồm hai ký tự tương ứng với ký tự UTF-8 của chúng. Ví dụ: 上海+中國
trong UTF-8 sẽ được mã hoá URL thành %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B
. Chuỗi ? and the Mysterians
sẽ được mã hoá URL dưới dạng %3F+and+the+Mysterians
hoặc %3F%20and%20the%20Mysterians
.
Các ký tự phổ biến cần mã hoá
Một số ký tự phổ biến phải được mã hoá là:
Ký tự không an toàn | Giá trị được mã hoá |
---|---|
Không gian | %20 |
" | %22 |
< | %3C |
> | %3E |
# | %23 |
% | %25 |
| | %7C |
Đôi khi, việc chuyển đổi URL mà bạn nhận được từ dữ liệu đầu vào của người dùng khá rắc rối. Ví dụ: người dùng có thể nhập địa chỉ là "5th&Main St." Nhìn chung, bạn nên tạo URL từ các phần của URL, coi mọi dữ liệu đầu vào của người dùng là ký tự cố định.
Ngoài ra, URL bị giới hạn ở 16384 ký tự đối với tất cả dịch vụ web và API web tĩnh của Google Maps Platform. Đối với hầu hết các dịch vụ, giới hạn ký tự này hiếm khi được áp dụng. Tuy nhiên, hãy lưu ý rằng một số dịch vụ có một số tham số có thể dẫn đến URL dài.
Sử dụng API của Google một cách lịch sự
Ứng dụng API được thiết kế không tốt có thể gây ra tải nhiều hơn mức cần thiết trên 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 cho ứng dụng của các 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 bị chặn ứng dụng do vô tình sử dụng sai API.
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 ở một điểm nào đó giữa ứng dụng và máy chủ của Google. Thường thì 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, điều quan trọng là bạn không nên chỉ lặp lại việc gửi yêu cầu đến các 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.
Một phương pháp 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 theo hệ số nhân với mỗi lần thử, một phương pháp được gọi là Khoảng thời gian đợi tăng theo cấp số nhân.
Ví dụ: hãy xem xét một ứng dụng 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×tamp=1331161200&key=YOUR_API_KEY
Ví dụ sau đây về Python cho thấy cách thực hiện yêu cầu bằng 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.
Yêu cầu đồng bộ hoá
Một lượng lớn yêu cầu đồng bộ hoá đến các 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à đượ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 khách.
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ể đặt chuông báo trong hệ điều hành của ứng dụng khách để đánh thức ứng dụng đó vào đầu phút để có thể cập nhật thời gian hiển thị. Ứ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 chuông báo cố định là không tốt vì điều này sẽ dẫn đến việc các lệnh gọi API được đồng bộ hoá với thời điểm bắt đầu phút, ngay cả giữa các thiết bị, thay vì được phân phối đều đặn theo thời gian. Một ứng dụng được thiết kế không tốt sẽ tạo ra sự gia tăng đột biến về lưu lượng truy cập gấp 60 lần mức bình thường vào đầu mỗi phút.
Thay vào đó, bạn có thể thiết kế một chuông báo thứ hai được đặt 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ướ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 đặn theo thời gian. Ngoài ra, 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 nên cẩn thận không nhắm đến các thời điểm đồng bộ hoá phổ biến khác là thời điểm bắt đầu giờ và thời điểm bắt đầu mỗi ngày lúc nửa đêm.
Xử lý phản hồi
Phần này thảo luận cách trích xuất linh động các giá trị này 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âu trả lời dễ hiểu nhưng không thực sự 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 các 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 mà bạn sử dụng phụ thuộc vào việc bạn có trả về đầu ra ở đị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.