Invio di richieste HTTP(S)

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base all'area geografica selezionata al momento della creazione dell'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono sembrare simili ai codici 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 inviare richieste HTTP(S) dall'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. Invia 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, verranno applicate le seguenti eccezioni:

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

Utilizzo delle classi di rete runtime standard

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

Utilizzo del recupero URL

Se devi utilizzare il recupero URL in un'app Java 8, aggiungi la seguente riga al 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>

Invio di una richiesta HTTP

Puoi inviare una richiesta HTTP in uscita utilizzando java.net.URLConnection.

Lo snippet seguente mostra come eseguire una richiesta GET HTTP 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 nel seguente modo:

  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 il tuo oggetto URLConnection al 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 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 URL, puoi impostare un'intestazione HTTP sulla richiesta in uscita richiamando 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 recupero URL, per impostazione predefinita il relativo servizio sottostante 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 reindirizzamenti HTTP, ti consigliamo di disattivarli.

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.

Emettere una richiesta HTTPS

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

Emettere una richiesta asincrona

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

Emissione 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à questa intestazione alle richieste automaticamente.

Per istruzioni su come disattivare i reindirizzamenti, consulta la sezione Disattivazione dei reindirizzamenti.

Passaggi successivi

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