שליחת בקשות HTTPS

מזהה אזור

REGION_ID הוא קוד מקוצר ש-Google מקצה על סמך האזור שבוחרים כשיוצרים את האפליקציה. הקוד לא תואם למדינה או למחוז, למרות שחלק ממזהי האזורים עשויים להיראות דומים לקודים נפוצים של מדינות ומחוזות. באפליקציות שנוצרו אחרי פברואר 2020, REGION_ID.r נכלל בכתובות URL של App Engine. באפליקציות קיימות שנוצרו לפני התאריך הזה, מזהה האזור הוא אופציונלי בכתובת ה-URL.

מידע נוסף על מזהי אזורים

בדף הזה מוסבר איך לשלוח בקשות HTTP(S) מאפליקציית App Engine באמצעות שירות אחזור של כתובות אתרים לדור השני של סביבות זמן ריצה.

לפני שמבצעים את ההוראות בדף הזה, מומלץ להשתמש בפתרונות אידיומטיים של שפה כדי להנפיק בקשות HTTP(S) לפני השימוש בשירות URL Fetch. מקרה השימוש העיקרי ב-URL Fetch הוא כשרוצים להנפיק בקשות HTTP(S) לאפליקציית App Engine אחרת ולאשר את הזהות של האפליקציה בבקשה הזו.

לפרטים על מגבלות גודל הבקשה ועל הכותרות שנשלחות בבקשת URL Fetch, אפשר לעיין במאמר בנושא בקשות יוצאות.

שליחת בקשת HTTP

כדי להשתמש בשירות אחזור של כתובות אתרים כדי לשלוח בקשות HTTP(S) יוצאות,

כדי להנפיק בקשת HTTP יוצאת, אפשר להשתמש בכל אחת מהספריות הבאות:

  • כדי לשפר את ניידות הקוד, כדאי להשתמש בספרייה הרגילה של Python‏ urllib.request כדי להנפיק בקשות HTTP.
  • משתמשים בספרייה של צד שלישי, כמו requests.
  • מבצעים קריאה מפורשת לספרייה urlfetch ומשתמשים בשיטה urlfetch.fetch.

urllib.request

מייבאים את ספריית urllib.request:

import urllib.request

לאחר מכן, משתמשים ב-urllib.request כדי לבצע את בקשת GET:

url = 'http://www.google.com/humans.txt'
try:
    result = urllib.request.urlopen(url)
    self.response.write(result.read())
except urllib.error.URLError:
    logging.exception('Caught exception fetching url')

urlfetch

בקטעי הקוד הבאים אפשר לראות איך מבצעים בקשת HTTP בסיסית של GET באמצעות urlfetch. קודם כל, מייבאים את הספרייה urlfetch מ-App Engine SDK:

from google.appengine.api import urlfetch

משתמשים ב-urlfetch כדי לבצע את בקשת GET:

url = 'http://www.google.com/humans.txt'
try:
    result = urlfetch.fetch(url)
    if result.status_code == 200:
        self.response.write(result.content)
    else:
        self.response.status_code = result.status_code
except urlfetch.Error:
    logging.exception('Caught exception fetching url')

בקטע הקוד הבא מוצג איך לבצע בקשה מתקדמת יותר, לשלוח נתונים מטופס אינטרנטי באמצעות בקשת HTTP POST באמצעות urlfetch:

try:
    form_data = urllib.urlencode(UrlPostHandler.form_fields)
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    result = urlfetch.fetch(
        url='http://localhost:8080/submit_form',
        payload=form_data,
        method=urlfetch.POST,
        headers=headers)
    self.response.write(result.content)
except urlfetch.Error:
    logging.exception('Caught exception fetching url')

הגדרת זמן קצוב לתפוגת בקשה

אפשר לשנות את ברירת המחדל של תאריך היעד באמצעות הפונקציה urlfetch.set_default_fetch_deadline(). הפונקציה הזו מאחסנת את תאריך היעד החדש שמוגדר כברירת מחדל במשתנה מקומי של השרשור, ולכן צריך להגדיר אותה לכל בקשה, למשל, בתוכנת ביניים מותאמת אישית.

השבתת ההפניות האוטומטיות

אם אתם משתמשים ב-URL Fetch, שירות אחזור של כתובות אתרים הבסיסי עוקב אחרי עד חמש הפניות אוטומטיות כברירת מחדל. ההפניות האלה יכולות להעביר מידע רגיש, כמו כותרות הרשאה, ליעד שאליו מתבצעת ההפניה מחדש. אם האפליקציה לא דורשת הפניות אוטומטיות של HTTP, מומלץ להשבית את ההפניות האוטומטיות.

כדי להנחות את שירות אחזור כתובות האתרים לא לעקוב אחרי הפניות אוטומטיות, מגדירים את הפרמטר follow_redirects של השיטה fetch לערך False.

שליחת בקשת HTTPS

כברירת מחדל, שירות אחזור של כתובות אתרים הבסיסי מאמת את האישור של המארח שאליו הוא מתחבר, ודוחה בקשות אם האישור לא תואם. אין צורך לאבטח את הבקשה באופן מפורש.

השבתת אימות של אישור מארח

כדי להשבית את האימות האוטומטי של אישור המארח ב-URL Fetch, צריך לשלוח בקשת HTTPS ולהגדיר את הפרמטר validate_certificate לערך False כשקוראים לשיטה urlfetch.fetch().

שליחת בקשה אסינכרונית

כברירת מחדל, בקשות HTTP(S) הן סנכרוניות. כדי לשלוח בקשה לא סנכרונית, האפליקציה צריכה:

  1. יוצרים אובייקט RPC חדש באמצעות urlfetch.create_rpc(). האובייקט הזה מייצג את הקריאה האסינכרונית שלכם בהפעלות method עוקבות.
  2. כדי להגיש את הבקשה, צריך להתקשר למספר urlfetch.make_fetch_call(). השיטה הזו מקבלת את אובייקט ה-RPC ואת כתובת ה-URL של יעד הבקשה כפרמטרים.
  3. מבצעים קריאה ל-method‏ get_result() של אובייקט RPC. השיטה הזו מחזירה את אובייקט התוצאה אם הבקשה מצליחה, ומעלה חריגה אם מתרחשת שגיאה במהלך הבקשה.

בקטעי הקוד הבאים אפשר לראות איך שולחים בקשה אסינכרונית בסיסית מאפליקציית Python. קודם מייבאים את הספרייה urlfetch מ-App Engine SDK:

from google.appengine.api import urlfetch

לאחר מכן, משתמשים ב-urlfetch כדי לשלוח את הבקשה לא סנכרונית:

rpc = urlfetch.create_rpc()
urlfetch.make_fetch_call(rpc, 'http://www.google.com/')

# ... do other things ...
try:
    result = rpc.get_result()
    if result.status_code == 200:
        text = result.content
        self.response.write(text)
    else:
        self.response.status_int = result.status_code
        self.response.write('URL returned status code {}'.format(
            result.status_code))
except urlfetch.DownloadError:
    self.response.status_int = 500
    self.response.write('Error fetching URL')

הגדרת זמן קצוב לתפוגת בקשה

כדי להגדיר זמן קצוב לתפוגה של הבקשה, מגדירים את הפרמטר deadline של ה-method‏ urlfetch.create_rpc() כשיוצרים את אובייקט ה-RPC.

שימוש בפונקציית קריאה חוזרת

אפשר להגדיר פונקציית קריאה חוזרת לאובייקט ה-RPC. הפונקציה תופעל כשהאפליקציה שלכם תפעיל שיטה באובייקט – כמו wait(),‏ checksuccess() או get_result() – שתגרום לאובייקט להמתין עד שהבקשה תושלם.

כדי להשתמש בפונקציית קריאה חוזרת לטיפול בתוצאה של קריאת האחזור:

  1. יוצרים פונקציית עזר כדי להגדיר את ההיקף של הקריאה החוזרת.
  2. יוצרים פונקציית handler כדי לטפל בתוצאה של קריאת ה-fetch.
  3. מגדירים את מאפיין callback של אובייקט ה-RPC לפונקציית העזר.

בקטע הקוד הבא אפשר לראות איך מפעילים פונקציית קריאה חוזרת:

def handle_result(rpc):
    result = rpc.get_result()
    self.response.write(result.content)
    logging.info('Handling RPC in callback: result {}'.format(result))

urls = ['http://www.google.com',
        'http://www.github.com',
        'http://www.travis-ci.org']
rpcs = []
for url in urls:
    rpc = urlfetch.create_rpc()
    rpc.callback = functools.partial(handle_result, rpc)
    urlfetch.make_fetch_call(rpc, url)
    rpcs.append(rpc)

# ... do other things ...

# Finish all RPCs, and let callbacks process the results.

for rpc in rpcs:
    rpc.wait()

logging.info('Done waiting for RPCs')

שליחת בקשה לאפליקציית App Engine אחרת

כשמשתמשים ב-URL Fetch כדי לשלוח בקשה לאפליקציית App Engine אחרת, האפליקציה יכולה לאמת את הזהות שלה על ידי הוספת הכותרת X-Appengine-Inbound-Appid לבקשה.

אם תנחו את שירות אחזור של כתובות אתרים לא לעקוב אחרי הפניות אוטומטיות, App Engine יוסיף את הכותרת הזו לבקשות באופן אוטומטי. הוראות להשבתת הפניות זמינות במאמר השבתת הפניות.

המאמרים הבאים

מידע על שירות אחזור של כתובות אתרים, כמו הכותרות שנשלחות בבקשת אחזור של כתובת URL, זמין במאמר בנושא בקשות יוצאות.