Geolocation API ওয়েব পরিষেবা ব্যবহার করার পেশাদার পদ্ধতি

Google Maps Platform ওয়েব পরিষেবা হল Google পরিষেবার HTTP ইন্টারফেসের একটি সংগ্রহ যা আপনার ম্যাপ অ্যাপ্লিকেশনের জন্য ভৌগোলিক ডেটা প্রদান করে।

এই নির্দেশিকায় আপনার ওয়েব পরিষেবা অনুরোধ সেট-আপ করা এবং পরিষেবার উত্তর প্রসেস করার জন্য উপযোগী কিছু সাধারণ পদ্ধতি বর্ণনা করা হয়েছে। Geolocation API-এর সম্পূর্ণ ডকুমেন্টেশনের জন্য ডেভেলপারের নির্দেশিকা দেখুন।

ওয়েব পরিষেবা কী?

Google Maps Platform ওয়েব পরিষেবা হল এক্সটার্নাল পরিষেবা থেকে Maps API ডেটার অনুরোধ করা এবং আপনার Maps অ্যাপ্লিকেশনের মধ্যে ডেটা ব্যবহার করার জন্য একটি ইন্টারফেস। Google Maps Platform পরিষেবার শর্তাবলীতে লাইসেন্স সংক্রান্ত বিধিনিষেধ অনুযায়ী, এই পরিষেবাগুলি ম্যাপের সাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছে।

Maps API ওয়েব পরিষেবা নির্দিষ্ট URL-এ HTTP(S) অনুরোধ ব্যবহার করে, URL প্যারামিটার এবং/অথবা JSON-ফরম্যাট POST ডেটা পরিষেবার আর্গুমেন্ট হিসেবে পাস করে। সাধারণত, এইসব পরিষেবা আপনার অ্যাপ্লিকেশনের মাধ্যমে পার্সিং এবং/অথবা প্রসেসিংয়ের জন্য JSON হিসেবে রেসপন্স বডিতে ডেটা ফেরত দেয়।

ভৌগোলিক লোকেশন সংক্রান্ত অনুরোধ POST ব্যবহার করে নিম্নলিখিত URL-এ পাঠানো হয়:

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

মনে রাখবেন: সব Geolocation API অ্যাপ্লিকেশনের জন্য যাচাইকরণ প্রয়োজন। যাচাইকরণ সংক্রান্ত ক্রেডেনশিয়াল সম্পর্কে আরও তথ্য পান।

SSL/TLS অ্যাক্সেস

API কী ব্যবহার করে বা ব্যবহারকারীর ডেটা আছে এমন সব Google Maps Platform অনুরোধের জন্য HTTPS প্রয়োজন। HTTP-এর মাধ্যমে করা অনুরোধে সংবেদনশীল ব্যক্তিগত তথ্য থাকলে তা বাতিল করা হতে পারে।

Google API-এর ভদ্র ব্যবহার

খারাপভাবে ডিজাইন করা API ক্লায়েন্ট ইন্টারনেট ও Google-এর সার্ভার, উভয়ের উপরেই প্রয়োজনের চেয়ে বেশি লোড দিতে পারে। এই বিভাগে API-এর ক্লায়েন্টদের জন্য কিছু পেশাদার পদ্ধতি উল্লেখ করা হয়েছে। এইসব পেশাদার পদ্ধতি অনুসরণ করলে, অনিচ্ছাকৃতভাবে API-এর অপব্যবহারের কারণে আপনার অ্যাপ্লিকেশন ব্লক হওয়া এড়াতে পারবেন।

এক্সপোনেনশিয়াল ব্যাকঅফ

বিরল ক্ষেত্রে আপনার অনুরোধ পূরণ করার সময় কোনও সমস্যা হতে পারে; আপনি 4XX বা 5XX HTTP রেসপন্স কোড পেতে পারেন অথবা আপনার ক্লায়েন্ট ও Google-এর সার্ভারের মধ্যে TCP কানেকশন ব্যর্থ হতে পারে। প্রায়ই অনুরোধটি আবার করার চেষ্টা করলে কাজ হয়, কারণ আসল অনুরোধটি ব্যর্থ হলেও ফলো-আপ অনুরোধটি সফল হতে পারে। তবে, Google-এর সার্ভারে বারবার অনুরোধ পাঠানোর লুপ তৈরি না করা গুরুত্বপূর্ণ। এই লুপ করার আচরণ আপনার ক্লায়েন্ট ও Google-এর মধ্যে নেটওয়ার্ককে ওভারলোড করতে পারে, যার ফলে অনেক পার্টির সমস্যা হতে পারে।

আরও ভালো উপায় হল, প্রতিটি প্রচেষ্টার মধ্যে সময়ের ব্যবধান বাড়িয়ে আবার চেষ্টা করা। সাধারণত, প্রতিটি প্রচেষ্টার সাথে বিলম্বের সময় গুণিতক ফ্যাক্টর দ্বারা বৃদ্ধি করা হয়, এই পদ্ধতিটি এক্সপোনেনশিয়াল ব্যাকঅফ নামে পরিচিত।

যেমন, ধরুন কোনও অ্যাপ্লিকেশন টাইম জোন API-তে এই অনুরোধ করতে চায়:

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510&timestamp=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-এর API-তে বিপুল সংখ্যক সিঙ্ক্রোনাইজ করা অনুরোধ Google-এর পরিকাঠামোতে ডিস্ট্রিবিউটেড ডিনায়েল অফ সার্ভিস (DDoS) অ্যাটাকের মতো মনে হতে পারে এবং সেই অনুযায়ী ব্যবস্থা নেওয়া হতে পারে। এটি এড়াতে, আপনাকে নিশ্চিত করতে হবে যে API অনুরোধগুলি ক্লায়েন্টদের মধ্যে সিঙ্ক করা হয়নি।

যেমন, এমন একটি অ্যাপ্লিকেশনের কথা ভাবুন যা বর্তমান টাইম জোনে সময় দেখায়। এই অ্যাপ্লিকেশনটি সম্ভবত ক্লায়েন্ট অপারেটিং সিস্টেমে একটি অ্যালার্ম সেট করবে যা এটিকে মিনিটের শুরুতে জাগিয়ে তুলবে যাতে প্রদর্শিত সময় আপডেট করা যায়। অ্যাপ্লিকেশনটি যেন সেই অ্যালার্মের সাথে সম্পর্কিত প্রসেসিংয়ের অংশ হিসেবে কোনও API কল না করে।

একটি নির্দিষ্ট অ্যালার্মের উত্তরে API কল করা খারাপ কারণ এর ফলে API কলগুলি মিনিটের শুরুতে সিঙ্ক্রোনাইজ করা হয়, এমনকি বিভিন্ন ডিভাইসের মধ্যেও, সময়ের সাথে সমানভাবে বিতরণ করার পরিবর্তে। খারাপভাবে ডিজাইন করা অ্যাপ্লিকেশন এটি করলে, প্রতি মিনিটের শুরুতে ট্রাফিক স্বাভাবিক লেভেলের থেকে ষাট গুণ বেশি হয়ে যাবে।

পরিবর্তে, একটি সম্ভাব্য ভালো ডিজাইন হল, র‍্যান্ডমভাবে বেছে নেওয়া সময়ে দ্বিতীয় অ্যালার্ম সেট করা। এই দ্বিতীয় অ্যালার্মটি চালু হলে, অ্যাপ্লিকেশনটি প্রয়োজনীয় যেকোনও API কল করে এবং ফলাফল স্টোর করে। মিনিটের শুরুতে অ্যাপ্লিকেশনটি তার ডিসপ্লে আপডেট করতে চাইলে, এটি আবার API কল করার পরিবর্তে আগে থেকে স্টোর করা ফলাফল ব্যবহার করে। এই পদ্ধতিতে, API কলগুলি সময়ের সাথে সমানভাবে ছড়িয়ে পড়ে। এছাড়াও, ডিসপ্লে আপডেট করার সময় API কল রেন্ডারিংয়ে দেরি করে না।

মিনিটের শুরু ছাড়াও, অন্যান্য সাধারণ সিঙ্ক করার সময় যেগুলি টার্গেট করার ব্যাপারে আপনাকে সতর্ক থাকতে হবে না, সেগুলি হল ঘণ্টার শুরু এবং প্রতিদিন মধ্যরাতে দিনের শুরু।

প্রতিক্রিয়া প্রসেস করা হচ্ছে

এই বিভাগে আলোচনা করা হয়েছে যে কীভাবে ওয়েব পরিষেবা থেকে পাওয়া উত্তর থেকে এইসব ভ্যালু ডায়নামিকভাবে এক্সট্র্যাক্ট করা যায়।

Google Maps ওয়েব পরিষেবা এমন উত্তর প্রদান করে যা বোঝা সহজ, কিন্তু ব্যবহারকারীর পক্ষে ঠিক ততটা সুবিধাজনক নয়। কোয়েরি করার সময়, ডেটার সেট দেখানোর পরিবর্তে, আপনি সম্ভবত কয়েকটি নির্দিষ্ট ভ্যালু এক্সট্র্যাক্ট করতে চান। সাধারণত, আপনি ওয়েব পরিষেবা থেকে পাওয়া উত্তর পার্স করতে এবং শুধুমাত্র আপনার আগ্রহের ভ্যালু এক্সট্র্যাক্ট করতে চাইবেন।

আপনি যে পার্সিং স্কিম ব্যবহার করেন তা নির্ভর করে আপনি JSON-এ আউটপুট ফেরত দিচ্ছেন কিনা তার উপর। JSON রেসপন্স, আগে থেকেই Javascript অবজেক্টের ফর্মে থাকার কারণে, ক্লায়েন্টের Javascript-এর মধ্যেই প্রসেস করা যেতে পারে।