發出 HTTPS 要求

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的縮寫代碼。此代碼不對應至國家/地區或省份,即使部分區域 ID 可能與常用的國家/地區和省份代碼相似。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是這段時間前建立的現有應用程式,網址可選擇是否包含地區 ID。

進一步瞭解區域 ID

本頁面說明如何透過第二代執行階段的網址擷取服務,從 App Engine 應用程式發出 HTTP(S) 要求。

建議您先使用語言慣用解決方案發出 HTTP(S) 要求,再使用網址擷取服務。使用網址擷取服務的主要用途是向其他 App Engine 應用程式發出 HTTP(S) 要求,並在該要求中聲明應用程式的身分。

如要進一步瞭解要求大小上限和透過網址擷取要求傳送的標頭,請參閱傳出要求一文。

在預設情況下,在 Java 執行階段中執行的應用程式會使用標準 Java 類別處理 HTTP(S) 要求,例如 java.net.HttpURLConnection。傳送要求的方式與其他 Java 應用程式相同。

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

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

使用網址擷取

如果必須在 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 要求

如要使用網址擷取服務發出傳出 HTTP(S) 要求,請使用 java.net.URLConnection

下列程式碼片段示範如何執行基本的 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);

若您的應用程式未使用 java.net,而是直接使用基礎 urlfetch 套件,您的應用程式必須指定 doNotFollowRedirects

發出 HTTPS 要求

根據預設,基礎網址擷取服務會驗證所連線主機的憑證,如果憑證不符,就會拒絕要求。您不需要明確保護要求。

停用主機憑證驗證

如要在 URL Fetch 中停用自動驗證主機憑證的功能,請使用 urlfetch 套件中的 FetchOptions 類別發出 HTTPS 要求,並呼叫 doNotValidateCertificate() 方法。

發出非同步要求

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

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

使用網址擷取服務向其他 App Engine 應用程式發出要求時,您的應用程式可以在要求中加入 X-Appengine-Inbound-Appid 標頭,以表明自己的身分。

如果您指示網址擷取服務不要追蹤重新導向,App Engine 會自動在要求中加入這個標頭。如要瞭解如何停用重新導向,請參閱「停用重新導向」。

後續步驟

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