Como emitir solicitações HTTP(S)

ID da região

O REGION_ID é um código que o Google atribui com base na região selecionada ao criar o aplicativo. A inclusão de REGION_ID.r nos URLs do App Engine é opcional para aplicativos atuais e em breve será obrigatória para todos os aplicativos novos.

Para garantir uma transição tranquila, estamos atualizando lentamente o App Engine para usar IDs da região. Se ainda não tivermos atualizado seu projeto do Google Cloud, você não verá um ID da região para o aplicativo. Como o ID é opcional para os aplicativos atuais, não é necessário atualizar os URLs ou fazer outras alterações quando o ID da região está disponível para os aplicativos já existentes.

Saiba mais sobre IDs da região.

Esta página descreve como emitir solicitações HTTP(S) do seu aplicativo App Engine.

Por padrão, os aplicativos em execução no ambiente de execução do Java 8 usam classes Java padrão para solicitações HTTP(S), como java.net.HttpURLConnection. Você envia solicitações como faria para qualquer outro aplicativo Java. Para usar o comportamento padrão, você precisa ativar o faturamento para seu aplicativo ou receberá as seguintes exceções:

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

Como usar classes de rede de ambiente de execução padrão

Se você usar as classes de rede Java padrão, seu aplicativo terá acesso aos seguintes recursos:

Como usar o URLFetch

Se você precisar usar o URL Fetch em um aplicativo Java 8, adicione a seguinte linha ao arquivo appengine-web.xml:

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

Por exemplo:

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

Esta configuração não exige que o app esteja com o faturamento ativado.

Como emitir solicitações HTTP

Emita uma solicitação HTTP de saída usando java.net.URLConnection.

O snippet a seguir demonstra como executar uma solicitação básica HTTP GET. O aplicativo cria um novo objeto URL e chama o método openStream() do objeto para recuperar o conteúdo nesse 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();

Para solicitações mais avançadas, use java.net.HttpURLConnection da seguinte maneira:

  1. Crie um novo objeto URL.
  2. Crie um novo objeto URLConnection chamando o método openConnection() do objeto URL.
  3. Crie um novo objeto HttpURLConnection transmitindo seu objeto URLConnection para o tipo de objeto HttpURLConnection.
  4. Defina o método de solicitação do objeto HttpURLConnection.
  5. Crie um stream de saída para a solicitação.
  6. Grave o payload da solicitação no stream.
  7. Feche o stream.

O snippet a seguir demonstra como usar HttpURLConnection para executar uma solicitação mais avançada, enviando dados de um formulário da Web por meio de uma solicitação 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());
}

Como definir um tempo limite de solicitação

Se você estiver usando a busca de URL, poderá ajustar o prazo padrão para solicitações usando a configuração appengine.api.urlfetch.defaultDeadline no arquivo appengine-web.xml.

Como definir cabeçalhos

Se você estiver usando a busca de URL, poderá definir um cabeçalho HTTP na solicitação de saída chamando o método setRequestProperty() do objeto HttpURLConnection. O snippet a seguir define o cabeçalho X-MyApp-Version como 2.7.3:

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

Como desativar redirecionamentos

Por padrão, HttpURLConnection segue redirecionamentos HTTP. Se você estiver usando a busca de URL, o serviço de busca de URL subjacente seguirá até cinco redirecionamentos. Para desativar esse comportamento, transmita o valor false para o método setInstanceFollowRedirects() do objeto HttpURLConnection:

conn.setInstanceFollowRedirects(false);

Se o aplicativo usar o pacote urlfetch subjacente diretamente em vez de java.net, ele precisará especificar doNotFollowRedirects.

Como emitir solicitações HTTPS

Se você estiver usando a busca de URL, emita uma solicitação HTTPS usando a classe FetchOptions no pacote urlfetch e chame validateCertificate().

Como emitir uma solicitação assíncrona

As solicitações HTTP(S) são síncronas por padrão. Para emitir uma solicitação assíncrona, seu aplicativo precisa usar o método fetchAsync() de URLFetchService. Esse método retorna um java.util.concurrent.Future<HTTPResponse>.

Como emitir solicitações para outro aplicativo do App Engine

Ao emitir uma solicitação para outro aplicativo do App Engine, o aplicativo precisa declarar a identidade dele adicionando o cabeçalho X-Appengine-Inbound-Appid à solicitação. Se você instruir o serviço de busca de URL a não seguir redirecionamentos, o App Engine adicionará esse cabeçalho às solicitações automaticamente. Consulte Como desativar redirecionamentos para orientação sobre como desativar redirecionamentos.

A seguir

Para saber mais sobre o serviço de busca de URL, como os cabeçalhos que são enviados em uma solicitação de busca de URL, consulte Solicitações de saída (em inglês).