Invio di richieste HTTP(S)

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base alla regione selezionata al momento della creazione dell'app. Non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono apparire simili ai codici di paese e provincia di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID regione è facoltativo nell'URL.

Scopri di più sugli ID regione.

Questa pagina descrive come emettere richieste HTTP(S) dalla tua app App Engine.

Per impostazione predefinita, le applicazioni in esecuzione nel runtime Java 8 utilizzano classi Java standard per le richieste HTTP(S), ad esempio java.net.HttpURLConnection. Puoi inviare le richieste come faresti per qualsiasi altra applicazione Java. Per utilizzare il comportamento predefinito, devi abilitare la fatturazione per la tua applicazione. In caso contrario, riceverai le seguenti eccezioni:

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

Utilizzo delle classi di rete di runtime standard

Se utilizzi le classi di rete Java standard, la tua app avrà accesso alle seguenti funzionalità:

Utilizzo del recupero degli URL

Se devi utilizzare il recupero URL in un'app Java 8, aggiungi la seguente riga al tuo file appengine-web.xml:

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

Ad esempio:

<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>

Emissione di una richiesta HTTP

Emetti una richiesta HTTP in uscita utilizzando java.net.URLConnection.

Lo snippet seguente mostra come eseguire una richiesta HTTP GET di base. L'applicazione crea un nuovo oggetto URL, quindi chiama il metodo openStream() dell'oggetto per recuperare i contenuti in quell'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();

Per richieste più avanzate, utilizza java.net.HttpURLConnection come segue:

  1. Crea un nuovo oggetto URL.
  2. Crea un nuovo oggetto URLConnection chiamando il metodo openConnection() dell'oggetto URL.
  3. Crea un nuovo oggetto HttpURLConnection trasmettendo l'oggetto URLConnection nel tipo di oggetto HttpURLConnection.
  4. Imposta il metodo di richiesta dell'oggetto HttpURLConnection.
  5. Crea un flusso di output per la richiesta.
  6. Scrivi il payload della richiesta nel flusso.
  7. Chiudi lo stream.

Lo snippet seguente mostra come utilizzare HttpURLConnection per eseguire una richiesta più avanzata, inviando i dati da un modulo web tramite una richiesta 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());
}

Impostazione di un timeout della richiesta

Se utilizzi il recupero di URL, puoi modificare la scadenza predefinita per le richieste utilizzando l'impostazione appengine.api.urlfetch.defaultDeadline nel file appengine-web.xml.

Impostazione delle intestazioni

Se usi il recupero di URL, puoi impostare un'intestazione HTTP sulla richiesta in uscita, chiamando il metodo setRequestProperty() dell'oggetto HttpURLConnection. Lo snippet seguente imposta l'intestazione X-MyApp-Version su 2.7.3:

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

Disattivazione dei reindirizzamenti

Per impostazione predefinita, HttpURLConnection segue i reindirizzamenti HTTP.

Se utilizzi il servizio di recupero URL, per impostazione predefinita il servizio sottostante di recupero URL segue fino a cinque reindirizzamenti. Questi reindirizzamenti potrebbero inoltrare informazioni sensibili, come le intestazioni di autorizzazione, alla destinazione reindirizzata. Se la tua app non richiede i reindirizzamenti HTTP, ti consigliamo di disabilitare questi ultimi.

Per disabilitare questo comportamento, passa il valore false al metodo setInstanceFollowRedirects() dell'oggetto HttpURLConnection:

conn.setInstanceFollowRedirects(false);

Se la tua app utilizza direttamente il pacchetto urlfetch sottostante invece di java.net, l'app deve specificare doNotFollowRedirects.

Emissione di una richiesta HTTPS

Se usi il recupero di URL, invia una richiesta HTTPS utilizzando la classe FetchOptions nel pacchetto urlfetch e chiama validateCertificate().

Emissione di una richiesta asincrona

Le richieste HTTP(S) sono sincrone per impostazione predefinita. Per inviare una richiesta asincrona, l'applicazione deve utilizzare il metodo fetchAsync() di URLFetchService. Questo metodo restituisce un valore java.util.concurrent.Future<HTTPResponse>.

Invio di una richiesta a un'altra app App Engine

Quando invii una richiesta a un'altra app App Engine, questa deve dichiarare la propria identità aggiungendo l'intestazione X-Appengine-Inbound-Appid alla richiesta. Se indichi al servizio di recupero URL di non seguire i reindirizzamenti, App Engine aggiungerà automaticamente questa intestazione alle richieste.

Per istruzioni su come disattivare i reindirizzamenti, consulta l'argomento Disattivazione dei reindirizzamenti.

Passaggi successivi

Scopri di più sul servizio di recupero degli URL, come le intestazioni inviate in una richiesta di recupero degli URL in Richieste in uscita.