سرویسهای وب «پلاتفرم Google Maps» مجموعهای از میاناهای HTTP به سرویسهای Google است که دادههای جغرافیایی را برای برنامههای نقشه شما ارائه میدهد.
این راهنما برخیاز روالهای رایج را که برای راهاندازی درخواستهای سرویس وب و پردازش پاسخهای سرویس مفید هستند شرح میدهد. برای دریافت مستندات کامل Aerial View API، به راهنمای توسعهدهنده مراجعه کنید.
سرویس وب چیست؟
سرویسهای وب «پلاتفرم Google Maps» میانایی برای درخواست دادههای Maps API از سرویسهای خارجی و استفاده از دادهها در برنامههای Maps شما است. این سرویسها طراحی شدهاند تا مطابق با محدودیتهای پروانه در «شرایط خدمات پلاتفرم Google Maps»، همراه با نقشه استفاده شوند.
سرویسهای وب Maps APIs از درخواستهای HTTP(S) به نشانیهای وب خاص استفاده میکنند و پارامترهای نشانی وب و/یا دادههای POST با قالب JSON را بهعنوان آرگومان به سرویسها ارسال میکنند. بهطور کلی، این سرویسها دادهها را در بدنه پاسخ بهصورت JSON برای تجزیه و/یا پردازش توسط برنامه شما برمیگردانند.
با ارسال درخواست اچتیتیپیGET به روش lookupVideo، ویدیو هوایی موجود را برگردانید:
https://aerialview.googleapis.com/v1/videos:lookupVideo
پارامترهای پُرسمان را به درخواست ارسال کنید تا نشانی یا شناسه ویدیو را مشخص کنید.
توجه: همه برنامههای Aerial View API به اصالتسنجی نیاز دارند. اطلاعات بیشتری درباره اعتبارنامههای اصالتسنجی دریافت کنید.
دسترسی SSL/TLS
HTTPS برای همه درخواستهای «پلاتفرم Google Maps» که از کلیدهای API استفاده میکنند یا حاوی دادههای کاربر هستند الزامی است. درخواستهای ارائهشده ازطریق HTTP که حاوی دادههای حساس باشند ممکن است رد شوند.
درحال ساختن نشانی وب معتبر
ممکن است فکر کنید که نشانی وب «معتبر» بدیهی است، اما
کاملاً اینطور نیست. برای مثال، نشانی وبی که در نوار نشانی مرورگر وارد میشود ممکن است حاوی نویسههای خاص (مثل "上海+中國") باشد؛ مرورگر باید قبلاز انتقال، این نویسهها را بهطور داخلی به کدبندی دیگری ترجمه کند.
به همین ترتیب، هر کدی که ورودی UTF-8 را تولید یا قبول میکند
ممکن است نشانیهای وب با نویسههای UTF-8 را بهعنوان «معتبر» درنظر بگیرد، اما همچنین باید
آن نویسهها را قبلاز ارسال به سرور وب ترجمه کند.
به این فرایند
کدبندی نشانی وب یا کدبندی درصدی میگویند.
نویسههای خاص
باید نویسههای خاص را ترجمه کنیم زیرا همه نشانیهای وب باید با نحو مشخصشده در مشخصات شناسه منبع یکسان (URI) مطابقت داشته باشند. درواقع، این یعنی نشانیهای وب باید فقط شامل زیرمجموعه خاصی از نویسههای ASCII باشند: نمادهای آلفانومریک آشنا، و برخی نویسههای رزروشده برای استفاده بهعنوان نویسههای کنترل در نشانیهای وب. این جدول این نویسهها را خلاصه میکند:
| بهصف | نویسهها | استفاده از نشانی وب |
|---|---|---|
| الفباعددی | 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 | رشتههای نوشتاری، استفاده از طرح (http)، درگاه (8080)، و غیره. |
| رزرو نشده است | - _ . ~ | رشتههای نوشتاری |
| رزروشده | ! * ' ( ) ; : @ & = + $ , / ? % # [ ] | نویسههای کنترلی و/یا رشتههای نوشتاری |
هنگام ساختن نشانی وب معتبر، باید مطمئن شوید که فقط حاوی نویسههای نشاندادهشده در جدول باشد. منطبق کردن نشانی وب برای استفاده از این مجموعه نویسهها معمولاً به دو مشکل منجر میشود، یکی حذف و دیگری جایگزینی:
- نویسههایی که میخواهید مدیریت کنید خارج از مجموعه بالا قرار دارند. برای مثال، نویسههای زبانهای خارجی
مانند
上海+中國باید بااستفاده از نویسههای بالا کدگذاری شوند. طبق قراردادهای رایج، فاصلهها (که در نشانیهای وب مجاز نیستند) اغلب بااستفاده از نویسه بهعلاوه'+'نیز نشان داده میشوند. - نویسههایی در مجموعه بالا بهعنوان نویسههای رزروشده وجود دارند،
اما باید بهصورت تحتاللفظی استفاده شوند.
برای مثال،
?در نشانیهای وب برای نشان دادن شروع رشته پُرسمان استفاده میشود؛ اگر بخواهید از رشته «? and the Mysterions» استفاده کنید، باید نویسه'?'را کدبندی کنید.
همه نویسههایی که باید کدبندی URL شوند، بااستفاده از نویسه '%' و مقدار هگز دو نویسهای مربوط به نویسه UTF-8 آنها کدبندی میشوند. برای مثال،
上海+中國 در UTF-8 بهصورت
%E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B کدبندی نشانی وب میشود. رشته
? and the Mysterians بهصورت
%3F+and+the+Mysterians یا %3F%20and%20the%20Mysterians کدبندی نشانی وب میشود.
نویسههای رایجی که نیاز به کدبندی دارند
برخیاز نویسههای رایجی که باید کدگذاری شوند عبارتاند از:
| شخصیت ناامن | مقدار کدبندیشده |
|---|---|
| فاصله | %20 |
| » | %22 |
| < | %3C |
| > | %3E |
| # | %23 |
| ٪ | %25 |
| | | %7C |
تبدیل نشانی وبی که از ورودی کاربر دریافت میکنید گاهی اوقات دشوار است. برای مثال، ممکن است کاربر نشانی را بهصورت «خیابان پنجم و اصلی» وارد کند. بهطور کلی، باید نشانی وب را از بخشهای آن بسازید و هر ورودی کاربر را بهعنوان نویسههای تحتاللفظی درنظر بگیرید.
علاوهبراین، نشانیهای وب برای همه سرویسهای وب Google Maps Platform و میاناهای برنامهسازی کاربردی وب ایستا به ۱۶۳۸۴ نویسه محدود است. برای اکثر سرویسها، این حد نویسه بهندرت نزدیک میشود. بااینحال، توجه داشته باشید که برخیاز سرویسها چندین پارامتر دارند که ممکن است منجر به نشانیهای وب طولانی شود.
استفاده مؤدبانه از Google APIs
کارخواههای میانای برنامهسازی کاربردی که طراحی ضعیفی دارند میتوانند بار بیشتری از حد لازم بر اینترنت و سرورهای Google تحمیل کنند. این بخش حاوی برخیاز روالهای مطلوب برای مشتریان میاناهای برنامهسازی کاربردی است. دنبال کردن این روالهای مطلوب میتواند به شما کمک کند تا از مسدود شدن برنامهتان بهدلیل سوءاستفاده ناخواسته از APIها جلوگیری کنید.
عقبنشینی نمایی
در موارد نادر، ممکن است مشکلی در ارائه درخواست شما پیش بیاید؛ ممکن است کد پاسخ HTTP 4XX یا 5XX دریافت کنید، یا اتصال TCP ممکن است بهسادگی در جایی بین کلاینت شما و سرور Google قطع شود. اغلب ارزش دارد که درخواست را دوباره امتحان کنید زیرا درخواست پیگیری ممکن است موفق شود درحالیکه درخواست اصلی ناموفق بوده است. بااینحال، مهم است که بهطور مکرر درخواستهای تکراری به سرورهای Google ارسال نکنید. این رفتار حلقهای میتواند شبکه بین کارخواه شما و Google را بیشازحد بارگذاری کند و برای بسیاری از طرفین مشکل ایجاد کند.
رویکرد بهتر این است که با افزایش تأخیر بین تلاشها، دوباره امتحان کنید. معمولاً تأخیر با هر تلاش با ضریب ضرب افزایش مییابد، رویکردی که بهعنوان عقبگرد نمایی شناخته میشود.
برای مثال، برنامهای را درنظر بگیرید که میخواهد این درخواست را به Time Zone API ارسال کند:
https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=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 میتواند مانند حمله «جلوگیری از سرویس توزیعشده» (DDoS) به زیرساخت Google بهنظر برسد و به همین ترتیب با آن برخورد شود. برای اجتناب از این امر، باید مطمئن شوید که درخواستهای API بین کارخواهها همگامسازی نمیشوند.
برای مثال، برنامهای را درنظر بگیرید که زمان را در منطقه زمانی فعلی نمایش میدهد. این برنامه احتمالاً زنگ هشداری در سیستمعامل کارخواه تنظیم میکند که آن را در ابتدای دقیقه بیدار میکند تا زمان نمایشدادهشده بهروز شود. برنامه نباید هیچگونه فراخوانی میانای برنامهسازی کاربردی را بهعنوان بخشی از پردازش مرتبط با آن هشدار انجام دهد.
برقراری تماسهای API در پاسخ به زنگ هشدار ثابت خوب نیست زیرا باعث میشود تماسهای API با شروع دقیقه همگامسازی شوند، حتی بین دستگاههای مختلف، بهجای اینکه بهطور یکنواخت درطول زمان توزیع شوند. برنامهای که طراحی ضعیفی دارد و این کار را انجام میدهد، در ابتدای هر دقیقه، ترافیکی ۶۰ برابر سطح عادی ایجاد میکند.
درعوض، یک طراحی خوب احتمالی این است که زنگ هشدار دومی برای زمانی که بهطور تصادفی انتخاب شده است تنظیم شود. وقتی این زنگ دوم بهصدا درمیآید، برنامه هر میانای برنامهسازی کاربردی را که نیاز دارد فراخوانی میکند و نتایج را ذخیره میکند. وقتی برنامه میخواهد نمایشگرش را در ابتدای دقیقه بهروز کند، از نتایج قبلاً ذخیرهشده استفاده میکند و دوباره با API تماس نمیگیرد. با این رویکرد، تماسهای میانای برنامهسازی کاربردی بهطور یکنواخت درطول زمان توزیع میشوند. علاوهبراین، فراخوانهای میانای برنامهسازی کاربردی هنگام بهروزرسانی نمایشگر، پردازش را بهتأخیر نمیاندازند.
علاوهبر شروع دقیقه، زمانهای همگامسازی رایج دیگری که باید مراقب باشید هدف قرار ندهید عبارتاند از شروع ساعت و شروع هر روز در نیمهشب.
درحال پردازش پاسخها
این بخش نحوه استخراج پویای این مقادیر از پاسخهای سرویس وب را توضیح میدهد.
سرویسهای وب Google Maps پاسخهایی ارائه میدهند که درک آنها آسان است، اما دقیقاً کاربرپسند نیستند. هنگام اجرای پُرسمان، بهجای نمایش مجموعهای از دادهها، احتمالاً میخواهید چند مقدار خاص را استخراج کنید. بهطور کلی، شما میخواهید پاسخهای سرویس وب را تجزیه کنید و فقط مقادیری را که به آنها علاقه دارید استخراج کنید.
طرح تجزیهای که استفاده میکنید به این بستگی دارد که آیا خروجی را در JSON برمیگردانید یا نه. پاسخهای JSON، که درحالحاضر بهشکل اشیاء جاوا اسکریپت هستند، ممکن است در خود جاوا اسکریپت در سمت کارخواه پردازش شوند.