HTTP(S) 요청 전송

리전 ID

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

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

이 페이지에서는 2세대 런타임용 URL Fetch 서비스를 사용하여 App Engine 앱에서 HTTP(S) 요청을 전송하는 방법을 설명합니다.

이 페이지의 안내를 따르기 전에 URL Fetch 서비스를 사용하기 전에 언어 관용구 솔루션을 사용하여 HTTP(S) 요청을 전송하는 것이 좋습니다. URL Fetch를 사용하는 기본 사용 사례는 다른 App Engine 앱에 HTTP(S) 요청을 전송하고 해당 요청에 대해 앱의 ID를 어설션하려는 경우입니다.

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

HTTP 요청 실행

URL Fetch 서비스를 사용하여 아웃바운드 HTTP(S) 요청을 전송하려면 urlfetch 라이브러리를 명시적으로 호출해야 합니다.

아웃바운드 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

다음 스니펫은 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')

요청 시간 제한 설정

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 앱으로 요청 전송

URL Fetch를 사용하여 다른 App Engine 앱에 요청을 전송하는 경우 앱은 요청에 X-Appengine-Inbound-Appid 헤더를 추가하여 자신의 ID를 어설션할 수 있습니다.

URL Fetch 서비스에 리디렉션을 따르지 않도록 지시하면 App Engine이 헤더를 요청에 자동으로 추가합니다. 리디렉션 사용 중지에 대한 안내는 리디렉션 사용 중지를 참조하세요.

다음 단계

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