發出 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 要求

如要發出傳出 HTTP 要求,可使用 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 設定,調整預設的要求截止時間。

設定標頭

如果您使用 URL Fetch,可以呼叫 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 要求

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

停用主機憑證驗證

如要在網址擷取中停用自動驗證主機憑證的功能,請使用 urlfetch 套件中的 FetchOptions 類別發出 HTTPS 要求,並呼叫 doNotValidateCertificate()

發出非同步要求

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

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

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

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

後續步驟

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