HTTPS 요청 전송

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

기본적으로 Java 런타임에서 실행되는 애플리케이션은 java.net.HttpURLConnection과 같은 HTTP(S) 요청에 표준 Java 클래스를 사용합니다. 다른 자바 애플리케이션과 마찬가지로 요청을 보냅니다.

표준 런타임 네트워크 클래스 사용

표준 자바 네트워크 클래스를 사용하는 경우 앱에서 다음 기능에 액세스할 수 있습니다.

  • 요청 데이터에 대한 32MB 한도가 적용되지 않습니다.
  • HTTP 2.0을 지원합니다.
  • Java용 Cloud 클라이언트 라이브러리에서 액세스할 수 있는 모든 Google Cloud기반 API를 지원합니다.

URL 가져오기 사용

Java 앱에서 URL Fetch를 사용해야 하는 경우 appengine-web.xml 파일에 다음 줄을 추가하세요.

 <url-stream-handler>urlfetch</url-stream-handler>

예를 들면 다음과 같습니다.

<xml version="1.0" encoding="utf-8">
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <!-- ... -->
  <url-stream-handler>urlfetch</url-stream-handler>
  <!-- ... -->
</appengine-web-app>

HTTP 요청 전송

URL Fetch 서비스를 사용하여 아웃바운드 HTTP(S) 요청을 전송하려면 java.net.URLConnection을 사용하세요.

다음 스니펫은 기본적인 HTTP GET 요청을 수행하는 방법을 보여줍니다. 애플리케이션에서 새로운 URL 객체를 만든 후 이 객체의 openStream() 메서드를 호출하여 해당 URL에서 콘텐츠를 검색합니다.

URL url = new URL("http://api.icndb.com/jokes/random");
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer json = new StringBuffer();
String line;

while ((line = reader.readLine()) != null) {
  json.append(line);
}
reader.close();

더 많은 고급 기능을 사용하려면 java.net.HttpURLConnection를 다음과 같이 사용합니다.

  1. 새로운 URL 객체를 만듭니다.
  2. URL 객체의 openConnection() 메서드를 호출하여 새로운 URLConnection 객체를 만듭니다.
  3. URLConnection 객체를 HttpURLConnection 객체 유형으로 cast 변환하여 새 HttpURLConnection 객체를 만듭니다.
  4. HttpURLConnection 객체의 요청 메서드를 설정합니다.
  5. 요청의 출력 스트림을 만듭니다.
  6. 요청 페이로드를 스트림에 기록합니다.
  7. 스트림을 닫습니다.

다음 스니펫은 HttpURLConnection을 사용하여 더 많은 고급 요청을 수행하고 PUT 요청을 사용하여 웹 양식의 데이터를 제출하는 방법을 보여줍니다.

URL url = new URL("http://jsonplaceholder.typicode.com/posts/" + id);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Enable output for the connection.
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
// Set HTTP request method.
conn.setRequestMethod("PUT");

// Create JSON request.
JSONObject jsonObj =
    new JSONObject().put("userId", 1).put("id", id).put("title", text).put("body", text);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(jsonObj.toString());
writer.close();

int respCode = conn.getResponseCode(); // New items get NOT_FOUND on PUT
if (respCode == HttpURLConnection.HTTP_OK || respCode == HttpURLConnection.HTTP_NOT_FOUND) {
  req.setAttribute("error", "");
  StringBuilder response = new StringBuilder();
  String line;

  // Read input data stream.
  BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  while ((line = reader.readLine()) != null) {
    response.append(line);
  }
  reader.close();
  req.setAttribute("response", response.toString());
} else {
  req.setAttribute("error", conn.getResponseCode() + " " + conn.getResponseMessage());
}

요청 제한 시간 설정

URL Fetch를 사용하는 경우 appengine-web.xml 파일의 appengine.api.urlfetch.defaultDeadline 설정을 사용하여 요청의 기본 기한을 조정할 수 있습니다.

헤더 설정

URL 가져오기를 사용하는 경우 HttpURLConnection 객체의 setRequestProperty() 메서드를 호출하여 발신 요청에 HTTP 헤더를 설정할 수 있습니다. 다음 스니펫은 X-MyApp-Version 헤더를 2.7.3로 설정합니다.

conn.setRequestProperty("X-MyApp-Version", "2.7.3");

리디렉션 사용 중지

기본적으로 HttpURLConnection은 HTTP 리디렉션을 따릅니다.

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

이 동작을 사용 중지하려면 값 falseHttpURLConnection 객체의 setInstanceFollowRedirects() 메서드에 전달합니다.

conn.setInstanceFollowRedirects(false);

앱에서 java.net 대신 기본 urlfetch 패키지를 직접 사용하는 경우 앱에서 doNotFollowRedirects를 지정해야 합니다.

HTTPS 요청 전송

기본 URL Fetch 서비스는 기본적으로 연결 중인 호스트의 인증서를 검증하고, 인증서가 일치하지 않으면 요청을 거부합니다. 요청을 명시적으로 보호할 필요는 없습니다.

비동기 요청 전송

기본적으로 HTTP(S) 요청은 동기식입니다. 비동기 요청을 실행하려면 애플리케이션에서 URLFetchServicefetchAsync() 메서드를 사용해야 합니다. 이 메서드는 java.util.concurrent.Future<HTTPResponse>를 반환합니다.

다른 App Engine 앱으로 요청 전송

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

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

다음 단계

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