發出 HTTP(S) 要求

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的簡寫代碼。雖然某些區域 ID 可能看起來與常用的國家/地區代碼相似,但此代碼並非對應國家/地區或省份。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是在此日期之前建立的現有應用程式,網址中則可選擇加入地區 ID。

進一步瞭解區域 ID

本頁說明如何透過 App Engine 應用程式發出 HTTP(S) 要求。

在預設情況下,在 Java 8 執行階段中執行的應用程式會使用標準的 Java 類別,用於 HTTP(S) 要求,例如 java.net.HttpURLConnection。您可以傳送要求,就像傳送任何其他 Java 應用程式一樣。如要使用預設行為,您必須為應用程式啟用結帳系統,否則會收到下列例外狀況:

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

使用標準執行階段網路類別

如果您使用標準 Java 網路類別,應用程式將可存取下列功能:

使用網址擷取

若您必須在 Java 8 應用程式中使用 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 要求

您可以使用 java.net.URLConnection 發出傳出 HTTP 要求。

以下程式碼片段示範如何執行基本 HTTP GET 要求。應用程式會建立新的 URL 物件,然後呼叫物件的 openStream() 方法,擷取該網址的內容:

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 物件類型,以建立新的 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 設定調整預設的要求截止時間。

設定標頭

如果您使用網址擷取,可以呼叫 HttpURLConnection 物件的 setRequestProperty() 方法,在傳出要求上設定 HTTP 標頭。以下程式碼片段會將 X-MyApp-Version 標頭設為 2.7.3

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

停用重新導向

根據預設,HttpURLConnection 會遵循 HTTP 重新導向。

如果您使用網址擷取服務,則基礎網址擷取服務會根據預設追蹤最多五次重新導向。這些重新導向可能會將機密資訊 (例如授權標頭) 轉寄至重新導向的目的地。如果應用程式不需要 HTTP 重新導向,建議您停用重新導向。

如要停用這項行為,請將 false 值傳遞至 HttpURLConnection 物件的 setInstanceFollowRedirects() 方法:

conn.setInstanceFollowRedirects(false);

如果您的應用程式直接使用基礎 urlfetch 套件,而非 java.net,則應用程式必須指定 doNotFollowRedirects

發出 HTTPS 要求

如果您使用的是網址擷取,請使用 urlfetch 套件中的 FetchOptions 類別發出 HTTPS 要求,然後呼叫 validateCertificate()

發出非同步要求

HTTP(S) 要求預設為同步。如要發出非同步要求,應用程式必須使用 URLFetchServicefetchAsync() 方法。這個方法會傳回 java.util.concurrent.Future<HTTPResponse>

發出要求至其他 App Engine 應用程式

發出要求至其他 App Engine 應用程式時,App Engine 應用程式必須在要求中加入 X-Appengine-Inbound-Appid 標頭以表明自己的身分。如果您指示網址擷取服務不要追蹤重新導向,App Engine 會自動在要求中加入這個標頭。

如要瞭解如何停用重新導向,請參閱「停用重新導向」。

後續步驟

如要瞭解網址擷取服務,例如透過網址擷取要求傳送的標頭,請參閱傳出要求一文。