發出 HTTP(S) 要求

本頁面說明如何透過 App Engine 應用程式發出 HTTP(S) 要求。

App Engine 會使用網址擷取服務來發出傳出 HTTP(S) 要求。如要進一步瞭解要求大小上限和透過網址擷取要求傳送的標頭,請參閱傳出要求一文。

發出 HTTP 要求

如要發出傳出 HTTP 要求,請使用 urlfetch.fetch 方法。為方便轉移程式碼,您也可以使用 Python 標準程式庫 urlliburllib2httplib 發出 HTTP 要求。在 App Engine 中使用這些程式庫時,這些程式庫會使用 App Engine 的網址擷取服務執行 HTTP 要求。只要設定使用 URLFetch,您也可以使用第三方 requests 程式庫。

urlfetch

以下程式碼片段示範如何使用 urlfetch 執行基本的 HTTP GET 要求。首先,從 App Engine SDK 匯入 urlfetch 程式庫:

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')

以下程式碼片段示範如何執行更進階的要求,透過使用 urlfetch 的 HTTP POST 要求提交網路表單的資料:

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')

urllib2

以下程式碼片段示範如何使用 urllib2 執行基本的 HTTP GET 要求。首先,匯入 urllib2 程式庫:

import urllib2

接著,使用 urllib2 執行 GET 要求:

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

要求

如要使用要求,您必須依照 Vendoring 操作說明安裝 requestsrequests-toolbelt

安裝完成後,使用 requests_toolbelt.adapters.appengine 模組將要求設為使用 URLFetch:

import requests
import requests_toolbelt.adapters.appengine

# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

設定完成後,您就能夠正常使用要求。

url = 'http://www.google.com/humans.txt'
response = requests.get(url)
response.raise_for_status()
return response.text

如要進一步瞭解 Google App Engine 要求的支援,請參閱 urllib3.contrib.appenginerequests_toolbelt.appengine 的說明文件。

設定要求逾時

您可以使用 urlfetch.set_default_fetch_deadline() 函式調整預設期限。這個函式會將新的預設期限儲存在執行緒本機變數上,因此必須在例如自訂中介軟體中依照不同要求進行個別設定。

發出 HTTPS 要求

如要發出 HTTPS 要求,請在呼叫 urlfetch.fetch() 方法時將 validate_certificate 參數設為 true

發出非同步要求

HTTP(S) 要求預設為同步。如要發出不同步的要求,應用程式必須:

  1. 使用 urlfetch.create_rpc() 建立新的遠端程序呼叫 (RPC) 物件。這個物件代表您在後續方法呼叫中的非同步呼叫。
  2. 呼叫 urlfetch.make_fetch_call() 以建立要求。這個方法需要將 RPC 物件與要求目標的網址做為參數。
  3. 呼叫 RPC 物件的 get_result() 方法。這個方法會在要求成功時傳回結果物件;如果要求期間發生錯誤,則會發出例外狀況。

下列程式碼片段示範如何從 Python 應用程式建立基本的非同步要求。首先,從 App Engine SDK 匯入 urlfetch 程式庫:

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')

設定要求逾時

如要設定要求逾時,請在建立遠端程序呼叫 (RPC) 物件時設定 urlfetch.create_rpc() 方法的 deadline 參數。

使用回呼函式

您可以針對遠端程序呼叫 (RPC) 物件定義回呼函式。當應用程式對物件呼叫 wait()checksuccess()get_result() 之類的方法,導致物件等待要求完成時,將呼叫這個函式。

如要使用回呼函式處理擷取呼叫的結果:

  1. 建立輔助函式來定義回呼範圍。
  2. 建立處理常式函式以處理擷取呼叫的結果。
  3. 將遠端程序呼叫 (RPC) 物件的 callback 屬性設為輔助函式。

以下程式碼片段示範如何叫用回呼函式:

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 應用程式

發出要求至其他 App Engine 應用程式時,App Engine 應用程式必須在要求中加入 X-Appengine-Inbound-Appid 標頭以表明自己的身分。如果您指示網址擷取服務不要追蹤重新導向,App Engine 會自動在要求中加入這個標頭。

如要指示網址擷取服務不要追蹤重新導向,請將 fetch 方法的 follow_redirects 參數設為 False

後續步驟

如要瞭解網址擷取服務,例如透過網址擷取要求傳送的標頭,請參閱傳出要求一文。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Python 2 適用的 App Engine 標準環境