Invio di richieste HTTP(S)

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base alla regione selezionata quando crei l'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono sembrare simili ai codici di paesi e province 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) 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. Invii le richieste come faresti per qualsiasi altra applicazione Java. Per utilizzare il comportamento predefinito, devi attivare la fatturazione per la tua applicazione, altrimenti verranno visualizzate 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à:

  • Il limite di 32 MB per i dati delle richieste viene rimosso.
  • Supporto per HTTP 2.0.
  • Supporta tutte le API basate su Google Cloud accessibili dalla libreria client Google Cloud per Java.

Utilizzare il recupero URL

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

Emetti 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 all'URL specificato:

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 eseguendo il casting dell'oggetto URLConnection al tipo di oggetto HttpURLConnection.
  4. Imposta il metodo di richiesta dell'oggetto HttpURLConnection.
  5. Crea uno stream di output per la richiesta.
  6. Scrivi il payload della richiesta nello stream.
  7. Chiudi lo stream.

Il seguente snippet 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 URL Fetch, puoi modificare la scadenza predefinita per le richieste utilizzando l'impostazione appengine.api.urlfetch.defaultDeadline nel file appengine-web.xml.

Impostazione delle intestazioni

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

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

Disattivare i reindirizzamenti

Per impostazione predefinita, HttpURLConnection segue i reindirizzamenti HTTP.

Se utilizzi il recupero dell'URL, il servizio di recupero dell'URL sottostante segue fino a cinque reindirizzamenti per impostazione predefinita. 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 disattivarli.

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

conn.setInstanceFollowRedirects(false);

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

Invio di una richiesta HTTPS

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

Invio di una richiesta asincrona

Le richieste HTTP(S) sono sincrone per impostazione predefinita. Per emettere 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 emetti una richiesta a un'altra app App Engine, la tua app App Engine deve affermare la propria identità aggiungendo l'intestazione X-Appengine-Inbound-Appid alla richiesta. Se indichi al servizio di recupero dell'URL di non seguire i reindirizzamenti, App Engine aggiugnerà automaticamente questa intestazione alle richieste.

Per istruzioni su come disattivare i reindirizzamenti, consulta Disattivare i reindirizzamenti.

Passaggi successivi

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