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 요청을 통해 전송되는 헤더에 대한 자세한 내용은 아웃바운드 요청을 참조하세요.

HTTP 요청 전송

PHP 언어는 원격 HTTP 요청을 수행하기 위한 여러 가지 함수를 제공합니다. 이러한 함수는 Google App Engine에서 다양한 방식으로 구현되며, 서로 다른 할당량과 비용이 적용됩니다.

  • 스트림 핸들러: 기본 http://https:// PHP 스트림 핸들러는 App Engine의 URL Fetch 서비스를 사용하여 HTTP 요청을 수행하도록 구성됩니다. file_get_contents()와 같은 많은 PHP 함수는 스트림 핸들러를 간접적으로 사용하며, 따라서 URL Fetch 서비스도 사용합니다.
  • cURL 확장: cURL 확장소켓 서비스를 사용합니다. 애플리케이션의 php.ini 파일에서 cURL 확장이 사용 설정되어야 하고 프로젝트에 청구가 사용 설정되어야 합니다.
  • cURL 'lite': cURL 'lite'는 소켓 서비스 대신 URL Fetch 서비스를 사용하는 cURL 라이브러리의 Google 제공 버전입니다. 애플리케이션의 php.ini 파일에서 cURL 'lite'를 사용 설정해야 합니다. cURL 확장의 다음 메서드는 지원되지 않습니다.
    • 함수 curl_multi_*
    • 비 표준 프로토콜 지원
    • 80(HTTP) 또는 443(HTTPS) 이외의 포트 지원

cURL, cURL Lite 또는 스트림 래퍼 사용 여부 결정은 주로 애플리케이션과 선호도에 따라 다릅니다. 정확히 모르겠으면 Guzzle HTTP 라이브러리를 사용합니다. Guzzle은 HTTP 요청의 추상 계층을 제공하며, 사용자는 이를 통해 애플리케이션 코드를 다시 작성하지 않고 기본 서비스를 변경할 수 있습니다.

스트림 핸들러

표준 HTTP(S) 스트림 핸들러는 fopen(), file_get_contents() 등의 기본 제공 PHP 함수에 사용됩니다.

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = "accept: */*\r\n" .
    "Content-Type: application/x-www-form-urlencoded\r\n" .
    "Custom-Header: custom-value\r\n" .
    "Custom-Header-Two: custom-value-2\r\n";

$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);
$result = file_get_contents($url, false, $context);

cURL 및 cURL 'lite'

php.ini의 cURL 또는 cURL 'lite'를 사용 설정하여 아웃바운드 요청에 cURL 함수를 사용할 수 있습니다. cURL 'lite'는 URL Fetch 서비스를 사용하고 cURL은 Sockets API를 사용합니다.

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept: */*',
    'Content-Type: application/x-www-form-urlencoded',
    'Custom-Header: custom-value',
    'Custom-Header-Two: custom-value-2'
];

// open connection
$ch = curl_init();

// set curl options
$options = [
    CURLOPT_URL => $url,
    CURLOPT_POST => count($data),
    CURLOPT_POSTFIELDS => http_build_query($data),
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
];
curl_setopt_array($ch, $options);

// execute
$result = curl_exec($ch);

// close connection
curl_close($ch);

Guzzle

기본적으로 Guzzle은 PHP의 스트림 핸들러를 사용하지만 cURL 또는 cURL 'lite'를 사용 설정한 경우에는 자동으로 cURL 핸들러를 사용합니다.

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept' => '*/*',
    'Content-Type' => 'application/x-www-form-urlencoded',
    'Custom-Header' => 'custom-value',
    'Custom-Header-Two' => 'custom-value',
];

$guzzle = new GuzzleHttp\Client;
$request = new GuzzleHttp\Psr7\Request('POST', $url, $headers, http_build_query($data));
$result = $guzzle->send($request);

요청 시간 제한 설정

HTTP 컨텍스트에서 timeout 옵션을 사용하여 기한을 변경합니다.

리디렉션 사용 중지

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

리디렉션을 따르지 않도록 URL Fetch 서비스에 지시하려면 앱이 HTTP 컨텍스트 옵션follow_location 매개변수를 false로 설정해야 합니다.

HTTPS 요청 실행

HTTP 요청 전송을 참조하세요.

호스트 인증서 유효성 검사 중지

기본적으로 HTTPS 래퍼의 App Engine 구현은 호스트 인증서의 유효성 검사를 시도하고 인증서가 일치하지 않으면 요청을 거부합니다. 이 동작을 사용 중지하려면 SSL/TLS 컨텍스트 옵션에서 verify_peer 값을 false로 설정합니다.

다른 App Engine 앱으로 요청 전송

다른 App Engine 앱에 요청을 전송하는 경우 App Engine 앱은 요청에 X-Appengine-Inbound-Appid 헤더를 추가하여 자신의 ID를 입증해야 합니다. URL Fetch 서비스에 리디렉션을 따르지 않도록 지시하면 App Engine이 헤더를 요청에 자동으로 추가합니다.

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

다음 단계

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