แนวทางปฏิบัติที่ดีที่สุดในการใช้บริการบนเว็บสำหรับ API การตรวจสอบที่อยู่

บริการบนเว็บของ Google Maps Platform คือชุดของอินเทอร์เฟซ HTTP ที่เชื่อมโยงไปยังบริการของ Google ซึ่งให้ข้อมูลทางภูมิศาสตร์สำหรับแอปพลิเคชันแผนที่

คู่มือนี้จะอธิบายแนวทางปฏิบัติทั่วไปที่เป็นประโยชน์ต่อการตั้งค่าคำขอบริการบนเว็บและการประมวลผลการตอบสนองของบริการ โปรดอ่านคู่มือสำหรับนักพัฒนาซอฟต์แวร์เพื่อดูเอกสารฉบับเต็มเกี่ยวกับ Address Validation API

บริการผ่านเว็บคืออะไร

บริการบนเว็บของ Google Maps Platform เป็นอินเทอร์เฟซสำหรับขอข้อมูล Maps API จากบริการภายนอก และใช้ข้อมูลภายในแอปพลิเคชันแผนที่ของคุณ บริการเหล่านี้ออกแบบมาให้ใช้ร่วมกับแผนที่ตามข้อจำกัดของใบอนุญาตในข้อกำหนดในการให้บริการของ Google Maps Platform

บริการบนเว็บของ Maps API ใช้คำขอ HTTP(S) ไปยัง URL ที่เจาะจงโดยการส่งพารามิเตอร์ของ URL และ/หรือข้อมูล POST รูปแบบ JSON เป็นอาร์กิวเมนต์ไปยังบริการ โดยทั่วไป บริการเหล่านี้จะแสดงข้อมูลในเนื้อความการตอบกลับเป็น JSON สำหรับการแยกวิเคราะห์และ/หรือประมวลผลโดยแอปพลิเคชันของคุณ

ยืนยันที่อยู่โดยส่งคำขอ HTTP POST ไปยังเมธอด validAddress

https://addressvalidation.googleapis.com/v1:validateAddress

ส่งเนื้อหา JSON ไปยังคำขอระบุที่อยู่เพื่อตรวจสอบ

หมายเหตุ: แอปพลิเคชัน API การตรวจสอบที่อยู่ทั้งหมดต้องมีการตรวจสอบสิทธิ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลเข้าสู่ระบบสำหรับการตรวจสอบสิทธิ์

การเข้าถึง SSL/TLS

ต้องมี HTTPS สำหรับคำขอ Google Maps Platform ทั้งหมดที่ใช้คีย์ API หรือมีข้อมูลผู้ใช้ ระบบอาจปฏิเสธคำขอที่ส่งผ่าน HTTP ซึ่งมีข้อมูลที่ละเอียดอ่อน

การสร้าง URL ที่ถูกต้อง

คุณอาจคิดว่า URL ที่ "ถูกต้อง" นั้นแสดงออกได้อย่างชัดเจน แต่ก็ไม่เป็นเช่นนั้น ตัวอย่างเช่น URL ที่ป้อนภายในแถบที่อยู่ในเบราว์เซอร์อาจมีอักขระพิเศษ (เช่น "上海+中國") เบราว์เซอร์ต้องแปลอักขระเหล่านั้นเป็นการเข้ารหัสอื่นภายในก่อนที่จะส่ง ในทำนองเดียวกัน โค้ดที่สร้างหรือยอมรับอินพุต UTF-8 อาจถือว่า URL ที่มีอักขระ UTF-8 เป็น "ถูกต้อง" แต่ก็ต้องแปลอักขระเหล่านั้นก่อนที่จะส่งไปยังเว็บเซิร์ฟเวอร์ด้วย กระบวนการนี้เรียกว่า การเข้ารหัส URL หรือการเข้ารหัสด้วยเปอร์เซ็นต์

สัญลักษณ์พิเศษ

เราจำเป็นต้องแปลอักขระพิเศษเนื่องจาก URL ทั้งหมดต้องสอดคล้องกับไวยากรณ์ที่ระบุโดยข้อกำหนดเฉพาะ Uniform Resource Identifier (URI) ซึ่งหมายความว่า URL ต้องมีเฉพาะชุดย่อยพิเศษของอักขระ ASCII ได้แก่ สัญลักษณ์ที่เป็นตัวอักษรและตัวเลขคละกันที่คุ้นเคย และอักขระที่สงวนไว้บางตัวเพื่อใช้เป็นอักขระควบคุมภายใน URL ตารางนี้สรุปอักขระเหล่านี้

สรุปอักขระของ URL ที่ถูกต้อง
ตั้งค่าอักขระการใช้ URL
ตัวอักษรและตัวเลข a b c d e f g h i j k l m n o p q r s t u v a 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 สตริงข้อความ, การใช้รูปแบบ (http), พอร์ต (8080) ฯลฯ
ไม่ได้จอง - _ ~ สตริงข้อความ
จองแล้ว ! * ' ( ) ; : @ & = + $ , / ? % # [ ] อักขระควบคุมและ/หรือสตริงข้อความ

เมื่อสร้าง URL ที่ถูกต้อง คุณต้องตรวจสอบว่ามีเพียงอักขระที่แสดงในตารางสรุปอักขระของ URL ที่ถูกต้องเท่านั้น การกำหนด URL เพื่อใช้อักขระชุดนี้มักนำไปสู่ปัญหา 2 อย่าง คือ การละเลยอย่างใดอย่างหนึ่งและการแทนที่ 1 ข้อ

  • อักขระที่คุณต้องการจัดการอยู่นอกชุดด้านบน ตัวอย่างเช่น อักขระในภาษาต่างประเทศอย่าง 上海+中國 ต้องเข้ารหัสโดยใช้อักขระข้างต้น ตามรูปแบบยอดนิยม การเว้นวรรค (ซึ่งไม่อนุญาตให้ใช้ใน URL) มักจะแสดงโดยใช้อักขระบวก '+' ด้วยเช่นกัน
  • อักขระจะอยู่ในชุดด้านบนเป็นอักขระที่สงวนไว้ แต่ต้องใช้ตามตัวอักษร ตัวอย่างเช่น ? ใช้ภายใน URL เพื่อระบุจุดเริ่มต้นของสตริงคำค้นหา หากต้องการใช้สตริง "? และ Mysterions" คุณต้องเข้ารหัสอักขระ '?'

อักขระทั้งหมดที่จะเข้ารหัส URL จะได้รับการเข้ารหัสโดยใช้อักขระ '%' และค่าฐานสิบหก 2 อักขระที่สอดคล้องกับอักขระ UTF-8 ตัวอย่างเช่น 上海+中國 ใน UTF-8 จะเข้ารหัส URL เป็น %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B สตริง ? and the Mysterians จะมีการเข้ารหัส URL เป็น %3F+and+the+Mysterians หรือ %3F%20and%20the%20Mysterians

อักขระทั่วไปที่ต้องใช้การเข้ารหัส

อักขระทั่วไปบางตัวที่ต้องเข้ารหัส ได้แก่

อักขระที่ไม่ปลอดภัย ค่าที่เข้ารหัส
เว้นวรรค %20
" %22
< %3C
> %3E
# %23
% %25
| %7C

บางครั้งการแปลง URL ที่คุณได้รับจากอินพุตของผู้ใช้อาจเป็นเรื่องยุ่งยาก ตัวอย่างเช่น ผู้ใช้อาจป้อนที่อยู่เป็น "5th&Main St." โดยทั่วไป คุณควรสร้าง URL จากส่วนของ URL เอง โดยให้ถือว่าอินพุตของผู้ใช้เป็นอักขระตามตัวอักษร

นอกจากนี้ URL ยังมีความยาวไม่เกิน 1,6,384 อักขระ สำหรับบริการบนเว็บของ Google Maps Platform และ API เว็บแบบคงที่ทั้งหมด สำหรับบริการส่วนใหญ่ จำนวนอักขระสูงสุดนี้แทบจะไม่เคยจำกัดเลย อย่างไรก็ตาม โปรดทราบว่าบางบริการมีพารามิเตอร์หลายอย่างที่อาจส่งผลให้ URL ยาวขึ้น

การใช้ Google API อย่างสุภาพ

ไคลเอ็นต์ API ที่ออกแบบมาไม่ดีอาจวางภาระงานบนอินเทอร์เน็ตและเซิร์ฟเวอร์ของ Google ได้มากกว่าที่จำเป็น ส่วนนี้ประกอบด้วยแนวทางปฏิบัติแนะนำสำหรับลูกค้าของ API การทำตามแนวทางปฏิบัติแนะนำเหล่านี้จะช่วยให้คุณหลีกเลี่ยงไม่ให้แอปพลิเคชันถูกบล็อกเนื่องจากใช้ API ในทางที่ผิดโดยไม่ได้ตั้งใจ

Exponential Backoff

ในบางกรณีที่เกิดขึ้นไม่บ่อยนัก อาจเกิดข้อผิดพลาดขณะดำเนินการตามคำขอ คุณอาจได้รับรหัสการตอบกลับ HTTP 4XX หรือ 5XX หรือการเชื่อมต่อ TCP อาจล้มเหลวในบางส่วนของไคลเอ็นต์และเซิร์ฟเวอร์ของ Google การลองส่งคำขออีกครั้งมักจะคุ้มค่ากว่า เนื่องจากคำขอติดตามผลอาจสำเร็จเมื่อคำขอต้นฉบับไม่สำเร็จ อย่างไรก็ตาม ต้องไม่เพียงแค่ต้องวนคำขอซ้ำหลายๆ ครั้งไปยังเซิร์ฟเวอร์ของ Google พฤติกรรมการวนซ้ำนี้อาจทำให้เครือข่ายระหว่างไคลเอ็นต์ของคุณกับ Google ทำงานหนักเกินไป ซึ่งสร้างปัญหาให้กับหลายๆ ฝ่าย

วิธีที่ดีกว่าคือลองอีกครั้งโดยให้มีความล่าช้ามากขึ้นระหว่างดำเนินการ โดยปกติแล้วความล่าช้าจะเพิ่มขึ้นตามปัจจัยต่างๆ ในความพยายามแต่ละครั้ง ซึ่งเป็นวิธีการที่เรียกว่า Exponential Backoff

ลองดูตัวอย่างแอปพลิเคชันที่ต้องการส่งคำขอนี้ไปยัง Time Zone API ดังนี้

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

ตัวอย่าง Python ต่อไปนี้แสดงวิธีสร้างคำขอด้วย Exponential Backoff

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

นอกจากนี้คุณควรระมัดระวังว่าจะไม่มีการทดสอบโค้ดซ้ำในระดับที่สูงขึ้นในสายการเรียกใช้แอปพลิเคชันที่นำไปสู่คำขอซ้ำติดต่อกันอย่างรวดเร็ว

คำขอที่ซิงค์ไว้

คำขอที่ซิงค์จำนวนมากซึ่งส่งไปยัง API ของ Google อาจดูเหมือนการโจมตีแบบ Distributed Denial of Service (DDoS) บนโครงสร้างพื้นฐานของ Google ซึ่งจะได้รับการปฏิบัติดังนี้ หากไม่ต้องการให้เป็นเช่นนั้น คุณควรตรวจสอบว่าคำขอ API ไม่ได้ซิงค์กันระหว่างไคลเอ็นต์

ตัวอย่างเช่น ลองพิจารณาแอปพลิเคชันที่แสดงเวลาในเขตเวลาปัจจุบัน แอปพลิเคชันนี้อาจตั้งปลุกในระบบปฏิบัติการของไคลเอ็นต์ให้ปลุกตอนเริ่มต้นนาทีเพื่อให้อัปเดตเวลาที่แสดงได้ แอปพลิเคชันต้อง ไม่เรียก API เป็นส่วนหนึ่งของการประมวลผลที่เกี่ยวข้องกับการปลุกนั้น

การเรียก API เพื่อตอบสนองต่อการปลุกแบบคงที่นั้นไม่ดีเพราะจะทำให้การเรียก API ซิงค์กันจนถึงจุดเริ่มต้นนาที หรือแม้กระทั่งระหว่างอุปกรณ์ต่างๆ มากกว่าที่จะกระจายอย่างเท่าๆ กันเมื่อเวลาผ่านไป แอปพลิเคชันที่ออกแบบมาไม่ดีซึ่งจะทำให้มีการเข้าชมเพิ่มขึ้นถึง 60 เท่าที่ระดับปกติในช่วงเริ่มต้นแต่ละนาที

แต่วิธีที่ดีอย่างหนึ่งที่เป็นไปได้คือการปลุกครั้งที่ 2 ให้เป็นเวลาที่เลือกแบบสุ่ม เมื่อการปลุกครั้งที่ 2 นี้ทำให้แอปพลิเคชันเริ่มการทำงาน แอปพลิเคชันจะเรียกใช้ API ที่ต้องการใช้และจัดเก็บผลลัพธ์ เมื่อแอปพลิเคชันต้องการอัปเดตการแสดงผลตั้งแต่เริ่มต้นนาที แอปพลิเคชันจะใช้ผลลัพธ์ที่จัดเก็บไว้ก่อนหน้านี้แทนการเรียก API อีกครั้ง วิธีนี้จะทำให้การเรียก API กระจายอย่างเท่าๆ กันเมื่อเวลาผ่านไป นอกจากนี้ การเรียก API จะไม่ทำให้การแสดงผลล่าช้าเมื่ออัปเดตการแสดงผล

นอกจากเวลาเริ่มนาทีแล้ว เวลาซิงค์ข้อมูลทั่วไปอื่นๆ ที่คุณควรระวังคืออย่ากำหนดเป้าหมายตั้งแต่เริ่มต้นนาทีและตอนเริ่มต้นของแต่ละวันตอนเที่ยงคืน

การประมวลผลคำตอบ

ส่วนนี้จะกล่าวถึงวิธีดึงค่าเหล่านี้แบบไดนามิกจากการตอบกลับของบริการเว็บ

บริการบนเว็บของ Google Maps ให้คำตอบที่เข้าใจง่าย แต่ไม่ได้เป็นมิตรต่อผู้ใช้เสมอไป เมื่อทำการค้นหา แทนที่จะแสดงชุดข้อมูล คุณอาจต้องการดึงค่าที่เจาะจงสัก 2-3 ค่า โดยทั่วไป คุณจะต้องแยกวิเคราะห์การตอบกลับจากบริการเว็บ และดึงเฉพาะค่าที่คุณสนใจ

รูปแบบการแยกวิเคราะห์ที่คุณใช้ขึ้นอยู่กับว่าคุณส่งคืนเอาต์พุตใน JSON หรือไม่ การตอบกลับ JSON ซึ่งอยู่ในรูปแบบออบเจ็กต์ JavaScript อยู่แล้วอาจได้รับการประมวลผลภายใน JavaScript ในไคลเอ็นต์