Emitir pedidos HTTP(S)

ID da região

O REGION_ID é um código abreviado que a Google atribui com base na região que seleciona quando cria a sua app. O código não corresponde a um país ou uma província, embora alguns IDs de regiões possam parecer semelhantes aos códigos de países e províncias usados frequentemente. Para apps criadas após fevereiro de 2020, REGION_ID.r está incluído nos URLs do App Engine. Para apps existentes criadas antes desta data, o ID da região é opcional no URL.

Saiba mais acerca dos IDs de regiões.

Esta página descreve como emitir pedidos HTTP(S) a partir da sua app do App Engine.

O App Engine usa o serviço URL Fetch para emitir pedidos HTTP(S) de saída. Para ver detalhes sobre os limites de tamanho dos pedidos e os cabeçalhos enviados num pedido de obtenção de URL, consulte o artigo Pedidos de saída.

Emitir um pedido HTTP

A linguagem PHP oferece várias funções para fazer pedidos HTTP remotos. Estas são implementadas de formas diferentes no Google App Engine e estão sujeitas a quotas e custos diferentes:

  • Controladores de streams: os controladores de streams PHP nativos http:// e https:// são configurados para usar o serviço URL Fetch do App Engine para fazer pedidos HTTP. Muitas funções PHP, como file_get_contents(), usam controladores de streams indiretamente e, por isso, também usam o serviço URL Fetch.
  • Extensão cURL: a extensão cURL usa o serviço Sockets. A extensão cURL tem de estar ativada no ficheiro php.ini da sua aplicação, e a faturação tem de estar ativada para o seu projeto.
  • cURL "lite": o cURL "lite" é uma versão da biblioteca cURL fornecida pela Google que usa o serviço URL Fetch em vez do serviço Sockets. Tem de ativar o cURL "lite" no ficheiro php.ini da sua aplicação. Os seguintes métodos da extensão cURL não são suportados:
    • Funções curl_multi_*
    • Suporte para protocolos não padrão
    • Compatibilidade com portas que não sejam a 80 (HTTP) ou a 443 (HTTPS)

A decisão de usar cURL, cURL Lite ou wrappers de streams depende, em grande parte, da sua aplicação e preferência. Se não tiver a certeza, use a biblioteca HTTP Guzzle. O Guzzle oferece uma camada de abstração para pedidos HTTP, o que lhe permite alterar o serviço subjacente sem reescrever o código da aplicação.

Controladores de streams

Os controladores de streams HTTP(S) padrão são usados em funções PHP incorporadas, como fopen() e file_get_contents().

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = "accept: */*\r\n" .
    "Content-Type: application/x-www-form-urlencoded\r\n" .
    "Custom-Header: custom-value\r\n" .
    "Custom-Header-Two: custom-value-2\r\n";

$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);
$result = file_get_contents($url, false, $context);

cURL e cURL "lite"

Ative o cURL ou o cURL "lite" em php.ini para usar funções cURL para pedidos de saída. O cURL "lite" usa o serviço URL Fetch, enquanto o cURL usa a API Sockets

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept: */*',
    'Content-Type: application/x-www-form-urlencoded',
    'Custom-Header: custom-value',
    'Custom-Header-Two: custom-value-2'
];

// open connection
$ch = curl_init();

// set curl options
$options = [
    CURLOPT_URL => $url,
    CURLOPT_POST => count($data),
    CURLOPT_POSTFIELDS => http_build_query($data),
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
];
curl_setopt_array($ch, $options);

// execute
$result = curl_exec($ch);

// close connection
curl_close($ch);

Guzzle

Por predefinição, o Guzzle usa o controlador de fluxo do PHP, mas usa automaticamente um controlador cURL se o cURL ou o cURL "lite" estiver ativado.

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept' => '*/*',
    'Content-Type' => 'application/x-www-form-urlencoded',
    'Custom-Header' => 'custom-value',
    'Custom-Header-Two' => 'custom-value',
];

$guzzle = new GuzzleHttp\Client;
$request = new GuzzleHttp\Psr7\Request('POST', $url, $headers, http_build_query($data));
$result = $guzzle->send($request);

Defina um limite de tempo do pedido

Use a opção timeout em Contexto HTTP para alterar o prazo.

Desative os redirecionamentos

Se estiver a usar a obtenção de URL, o serviço de obtenção de URL subjacente segue até cinco redirecionamentos por predefinição. Estes redirecionamentos podem encaminhar informações confidenciais, como cabeçalhos de autorização, para o destino redirecionado. Se a sua app não requerer redirecionamentos HTTP, recomendamos que os desative.

Para indicar ao serviço URL Fetch que não siga os redirecionamentos, a sua app tem de definir o parâmetro follow_location nas opções de contexto HTTP para false.

Emitir um pedido HTTPS

Por predefinição, o serviço URL Fetch subjacente valida o certificado do anfitrião que contacta e rejeita pedidos se o certificado não corresponder. Não precisa de proteger explicitamente o seu pedido.

Desative a validação de certificados de anfitrião

Por predefinição, a implementação do App Engine do wrapper HTTPS tenta validar o certificado do anfitrião e rejeita pedidos em que o certificado não corresponde. Para desativar este comportamento, defina o valor de verify_peer como false nas opções de contexto SSL/TLS.

Emitir um pedido para outra app do App Engine

Quando emite um pedido para outra app do App Engine, a sua app do App Engine tem de afirmar a sua identidade adicionando o cabeçalho X-Appengine-Inbound-Appid ao pedido. Se instruir o serviço URL Fetch para não seguir redirecionamentos, o App Engine adiciona este cabeçalho aos pedidos automaticamente.

Consulte o artigo Desativar redirecionamentos para obter orientações sobre como desativar redirecionamentos.

O que se segue?

Saiba mais sobre o serviço de obtenção de URL, como os cabeçalhos que são enviados num pedido de obtenção de URL em Pedidos de saída.