Menerbitkan Permintaan HTTP(S)

ID region

REGION_ID adalah kode singkat yang ditetapkan Google berdasarkan region yang Anda pilih saat membuat aplikasi. Kode ini tidak sesuai dengan negara atau provinsi, meskipun beberapa ID region mungkin tampak mirip dengan kode negara dan provinsi yang umum digunakan. Untuk aplikasi yang dibuat setelah Februari 2020, REGION_ID.r disertakan dalam URL App Engine. Untuk aplikasi lama yang dibuat sebelum tanggal tersebut, ID region bersifat opsional dalam URL.

Pelajari ID region lebih lanjut.

Halaman ini menjelaskan cara menerbitkan permintaan HTTP(S) dari aplikasi App Engine Anda.

Secara default, App Engine menggunakan layanan URL-fetch untuk mengeluarkan permintaan HTTP(S) keluar.

Untuk mengetahui detail tentang batas ukuran permintaan dan header mana yang dikirim dalam permintaan URL Fetch, lihat Permintaan Keluar.

Jika Anda telah menyiapkan Akses VPC Serverless atau jika Anda menggunakan Sockets API, Anda perlu menghentikan URL-fetch dari permintaan penanganan. URL Fetch menyebabkan permintaan ke jaringan VPC Anda atau ke Sockets API gagal. Setelah Anda menonaktifkan URL Fetch, library Python standar akan menangani permintaan HTTP. Jika memerlukan fitur yang disediakan oleh URL Fetch untuk permintaan tertentu, Anda dapat menggunakan library urlfetch secara langsung untuk permintaan khusus tersebut.

Memberikan permintaan HTTP

Untuk mengeluarkan permintaan HTTP keluar, gunakan metodeurlfetch.fetch. Untuk meningkatkan portabilitas kode, Anda juga dapat menggunakan library standar Python urllib, urllib2, atau httplib untuk mengeluarkan permintaan HTTP. Saat Anda menggunakan library ini di App Engine, library tersebut akan melakukan permintaan HTTP menggunakan layanan URL Fetch App Engine. Anda juga dapat menggunakan library requests pihak ketiga selama Anda mengonfigurasinya untuk menggunakan URLFetch.

urlfetch

Cuplikan berikut menunjukkan cara membuat permintaan GET HTTP dasar menggunakan urlfetch. Pertama, impor library urlfetch dari App Engine SDK:

from google.appengine.api import urlfetch

Selanjutnya, gunakan urlfetch untuk melakukan permintaan 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')

Cuplikan berikut menunjukkan cara melakukan permintaan lanjutan, mengirimkan data dari formulir web melalui permintaan POST HTTP menggunakan 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')

urllib2

Cuplikan berikut menunjukkan cara membuat permintaan GET HTTP dasar menggunakan urllib2. Pertama, impor library urllib2:

import urllib2

Selanjutnya, gunakan urllib2 untuk melakukan permintaan 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')

permintaan

Untuk menggunakan permintaan, Anda harus menginstal requests dan requests-toolbelt menggunakan petunjuk vendor.

Setelah diinstal, gunakan modul requests_toolbelt.adapters.appengine untuk mengonfigurasi permintaan agar menggunakan 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()

Setelah dikonfigurasi, Anda dapat menggunakan permintaan seperti biasa:

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

Untuk informasi selengkapnya tentang dukungan permintaan untuk Google App Engine, lihat dokumentasi untuk urllib3.contrib.appengine dan requests_toolbelt.appengine

Menyetel waktu tunggu permintaan

Anda dapat menyesuaikan batas waktu default menggunakan fungsi urlfetch.set_default_fetch_deadline(). Fungsi ini menyimpan batas waktu default baru pada variabel lokal thread, sehingga harus ditetapkan untuk setiap permintaan, misalnya, di middleware khusus.

Menonaktifkan pengalihan

Jika Anda menggunakan URL Fetch, layanan URL-Fetch dasar akan mengikuti hingga lima pengalihan secara default. Pengalihan ini dapat meneruskan informasi sensitif, seperti header otorisasi, ke tujuan yang dialihkan. Jika aplikasi Anda tidak memerlukan pengalihan HTTP, sebaiknya nonaktifkan pengalihan.

Untuk menginstruksikan layanan URL Fetch agar tidak mengikuti pengalihan, tetapkan parameter follow_redirects metode fetch ke False.

Memberikan permintaan HTTPS

Untuk memberikan permintaan HTTPS, tetapkan parameter validate_certificate ke true saat memanggil metode urlfetch.fetch().

Memberikan permintaan asinkron

Permintaan HTTP(S) sinkron secara default. Untuk mengirimkan permintaan asinkron, aplikasi Anda harus:

  1. Buat objek RPC baru menggunakan urlfetch.create_rpc(). Objek ini mewakili panggilan asinkron Anda dalam panggilan metode berikutnya.
  2. Panggil urlfetch.make_fetch_call() untuk membuat permintaan. Metode ini menggunakan objek RPC Anda dan URL target permintaan sebagai parameter.
  3. Panggil metode get_result() objek RPC. Metode ini menampilkan objek hasil jika permintaan berhasil, dan memunculkan pengecualian jika terjadi error selama permintaan.

Cuplikan berikut menunjukkan cara membuat permintaan asinkron dasar dari aplikasi Python. Pertama, impor library urlfetch dari App Engine SDK:

from google.appengine.api import urlfetch

Selanjutnya, gunakan urlfetch untuk membuat permintaan asinkron:

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

Menyetel waktu tunggu permintaan

Guna menetapkan waktu tunggu untuk permintaan Anda, tetapkan parameter deadline metode urlfetch.create_rpc() saat Anda membuat objek RPC.

Menggunakan fungsi callback

Anda dapat menentukan fungsi callback untuk objek RPC Anda. Fungsi tersebut akan dipanggil saat aplikasi Anda memanggil metode pada objek tersebut—sepertiwait() danchecksuccess(), atau get_result()—yang menyebabkan objek menunggu hingga permintaan selesai.

Untuk menggunakan fungsi callback guna menangani hasil panggilan ambil:

  1. Buat fungsi bantuan untuk menentukan cakupan callback.
  2. Buat fungsi pengendali untuk menangani hasil panggilan ambil Anda.
  3. Tetapkan atribut callback objek RPC Anda ke fungsi bantuan.

Cuplikan berikut menunjukkan cara memanggil fungsi 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')

Mengeluarkan permintaan ke aplikasi App Engine lain

Saat menerbitkan permintaan ke aplikasi App Engine lain, aplikasi App Engine Anda harus menegaskan identitasnya dengan menambahkan header X-Appengine-Inbound-Appid ke permintaan tersebut. Jika Anda menginstruksikan layanan URL-Fetch untuk tidak mengikuti pengalihan, App Engine akan otomatis menambahkan header ini ke permintaan.

Lihat Menonaktifkan pengalihan untuk mendapatkan panduan tentang cara menonaktifkan pengalihan.

Langkah selanjutnya

Pelajari layanan URL-Fetch, seperti header yang dikirim dalam permintaan URL Fetch di Permintaan Keluar.