HTTP(S) 요청 실행

리전 ID

REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.

리전 ID에 대해 자세히 알아보세요.

이 페이지는 App Engine 앱에서 HTTP(S) 요청을 전송하는 방법을 설명합니다.

기본적으로 App Engine은 URL Fetch 서비스를 사용하여 아웃바운드 HTTP(S) 요청을 실행합니다.

요청 크기 한도 및 URL Fetch 요청을 통해 전송되는 헤더에 대한 자세한 내용은 아웃바운드 요청을 참조하세요.

서버리스 VPC 액세스를 설정했거나 Sockets API를 사용하는 경우 URL Fetch 요청 처리를 중지해야 합니다. URL Fetch를 사용하면 VPC 네트워크 또는 소켓 API에 대한 요청이 실패합니다. URL Fetch를 사용 중지하면 표준 Python 라이브러리가 HTTP 요청을 처리합니다. 특정 요청에 대해 URL Fetch에서 제공하는 기능이 필요한 경우 해당 요청에 urlfetch 라이브러리를 직접 사용할 수 있습니다.

HTTP 요청 실행

아웃바운드 HTTP 요청을 실행하려면 urlfetch.fetch 메서드를 사용합니다. 또한 코드 이동성을 높이기 위해 Python 표준 라이브러리인 urllib, urllib2 또는 httplib를 사용하여 HTTP 요청을 전송할 수도 있습니다. App Engine에서 이러한 라이브러리를 사용하면 App Engine의 URL Fetch 서비스를 사용하여 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')

요청

요청을 사용하려면 벤더링 안내에 따라 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() 함수를 사용하여 기본 기한을 조정할 수 있습니다. 이 함수는 스레드 로컬 변수에 새로운 기본 기한을 저장하므로 커스텀 미들웨어에서와 같이 각 요청에 설정해야 합니다.

리디렉션 사용 중지

URL Fetch를 사용하는 경우 기본 URL Fetch 서비스는 기본적으로 최대 5개의 리디렉션을 따릅니다. 이러한 리디렉션은 승인 헤더와 같은 민감한 정보를 리디렉션된 대상으로 전달할 수 있습니다. 앱에 HTTP 리디렉션이 필요하지 않으면 리디렉션을 사용 중지하는 것이 좋습니다.

URL Fetch 서비스에 리디렉션을 따르지 않도록 지시하려면 fetch 메서드의 follow_redirects 매개변수를 False로 설정합니다.

HTTPS 요청 실행

HTTPS 요청을 실행하려면 urlfetch.fetch() 메서드를 호출할 때 validate_certificate 매개변수를 true로 설정합니다.

비동기식 요청 실행

기본적으로 HTTP(S) 요청은 동기식입니다. 비동기식 요청을 전송하려면 애플리케이션에서 다음을 수행해야 합니다.

  1. urlfetch.create_rpc()를 사용하여 새로운 RPC 객체를 만듭니다. 이 객체는 후속 메서드 호출에서 비동기식 호출을 나타냅니다.
  2. urlfetch.make_fetch_call()을 호출하여 요청합니다. 이 메서드는 RPC 객체와 요청 대상의 URL을 매개변수로 사용합니다.
  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 헤더를 추가하여 자신의 ID를 입증해야 합니다. URL Fetch 서비스에 리디렉션을 따르지 않도록 지시하면 App Engine이 헤더를 요청에 자동으로 추가합니다.

리디렉션 사용 중지에 대한 안내는 리디렉션 사용 중지를 참조하세요.

다음 단계

아웃바운드 요청에서 URL Fetch 요청을 통해 전송되는 헤더와 같은 URL Fetch 서비스에 대해 알아보기