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 il giorno Febbraio 2020, REGION_ID.r è incluso in 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), come 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à:

Utilizzo del 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 richiamando l'oggetto URL openConnection().
  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 dati da un modulo web per 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 richieste utilizzando appengine.api.urlfetch.defaultDeadline nel file appengine-web.xml.

Impostazione delle intestazioni

Se utilizzi il recupero degli 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");

Disattivazione dei reindirizzamenti

Per impostazione predefinita, HttpURLConnection segue i reindirizzamenti HTTP.

Se utilizzi il recupero URL, il servizio di recupero URL sottostante segue fino a cinque reindirizzamenti per impostazione predefinita. Questi reindirizzamenti potrebbero inoltrare informazioni sensibili, ad esempio come 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 tuo HttpURLConnection metodo setInstanceFollowRedirects() dell'oggetto:

conn.setInstanceFollowRedirects(false);

Se la tua app utilizza direttamente il pacchetto urlfetch sottostante anziché java.net, la tua app 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().

Emissione di una richiesta asincrona

Le richieste HTTP(S) sono sincrone per impostazione predefinita. Per emettere un richiesta, la tua applicazione deve utilizzare di URLFetchService fetchAsync(). 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 di App Engine, la tua app di App Engine deve dichiarare 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 indicazioni sulla disattivazione dei reindirizzamenti, consulta la sezione 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.