Invio di richieste HTTP(S)

ID regione

Il REGION_ID è un codice abbreviato che Google assegna in base alla regione selezionata durante la creazione dell'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 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 riceverai 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à:

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

Utilizzo di Recupero URL

Se devi utilizzare URL Fetch 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>

Emettere una richiesta HTTP

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

Il seguente snippet 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 all'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 eseguendo il cast dell'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.

Il seguente snippet mostra come utilizzare HttpURLConnection per eseguire una richiesta più avanzata, inviando i dati di 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());
}

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

Impostare le intestazioni

Se utilizzi URL Fetch, puoi impostare un'intestazione HTTP nella 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 URL Fetch, il servizio URL Fetch 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 reindirizzamenti HTTP, ti consigliamo di disattivarli.

Per disattivare 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 anziché java.net, deve specificare doNotFollowRedirects.

Emettere una richiesta HTTPS

Per impostazione predefinita, il servizio URL Fetch sottostante convalida il certificato dell'host che contatta e rifiuta le richieste se il certificato non corrisponde. Non è necessario proteggere esplicitamente la richiesta.

Disattiva la convalida del certificato host

Per disattivare la convalida automatica del certificato host in URL Fetch, invia una richiesta HTTPS utilizzando la classe FetchOptions nel pacchetto urlfetch e chiama doNotValidateCertificate().

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 URLFetchService fetchAsync(). Questo metodo restituisce un java.util.concurrent.Future<HTTPResponse>.

Emettere una richiesta a un'altra app App Engine

Quando invii 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 istruisci il servizio URL Fetch a non seguire i reindirizzamenti, App Engine aggiungerà automaticamente questa intestazione alle richieste.

Per indicazioni su come disattivare i reindirizzamenti, vedi 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.