HTTP(S) 요청 전송

리전 ID

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

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

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

기본적으로 자바 8 런타임에서 실행되는 애플리케이션은 java.net.HttpURLConnection과 같은 HTTP(S) 요청에 표준 자바 클래스를 사용합니다. 다른 자바 애플리케이션과 마찬가지로 요청을 보냅니다. 기본 동작을 사용하려면 애플리케이션에서 결제를 사용 설정해야 합니다. 그렇지 않으면 다음과 같은 예외가 발생합니다.

  • java.net.UnknownHostException
  • java.net.SocketTimeoutException
  • java.io.IOException

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

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

URL 가져오기 사용

자바 8 애플리케이션에서 URL 가져오기를 사용해야 하는 경우 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 요청 실행

java.net.URLConnection을 사용하여 아웃바운드 HTTP 요청을 전송합니다.

다음 스니펫은 기본적인 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 가져오기를 사용하는 경우 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 가져오기를 사용하는 경우 urlfetch 패키지의 FetchOptions 클래스를 사용하여 HTTPS 요청을 실행하고 validateCertificate()를 호출합니다.

비동기식 요청 실행

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

다른 App Engine 앱으로 요청 전송

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

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

다음 단계

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