FAQ

O Guzzle requer cURL?

Não. O Guzzle pode usar qualquer manipulador HTTP para enviar pedidos. Isto significa que o Guzzle pode ser usado com cURL, PHP's stream wrapper, tomadas, e bibliotecas sem bloqueios como Reagir. Só precisa de configurar um manipulador HTTP para utilizar um método diferente de envio de pedidos.

Nota

Historicamente, a Guzzle tem utilizado apenas cURL para enviar pedidos HTTP. cURL é um incrível cliente HTTP (indiscutivelmente o melhor), e Guzzle continuará a usar por defeito, quando está disponível. É raro, mas alguns criadores não têm o cURL instalado nos seus sistemas ou correm com problemas específicos de versão. Ao permitir manipuladores HTTP permutáveis, o Guzzle é agora muito mais personalizável e capaz de se adaptar às necessidades de mais criadores.

Pode a Guzzle enviar pedidos assíncronos?

Sim. Pode usar o requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, e patchAsync métodos de um cliente para enviar um pedido assíncrono. O cliente devolverá um GuzzleHttp\Promise\PromiseInterface object. Pode encadear then. funciona fora do âmbito da promessa.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(function ($response) {
    echo 'Got a response! ' . $response->getStatusCode();
});

Pode forçar uma resposta assíncrona a completar usando o método wait() método da promessa devolvida.

$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$response = $promise->wait();

Como posso adicionar opções personalizadas de cURL?

cURL oferece um grande número de opções personalizáveis. Enquanto o Guzzle normaliza muitas destas opções através de diferentes manipuladores, aí são alturas em que é necessário definir opções personalizadas de cURL. Isto pode ser realizado passando um conjunto associativo de definições de cURL na chave de um pedido.

Por exemplo, digamos que é necessário personalizar a interface de saída de rede utilizada com um cliente.

$client->request('GET', '/', [
    'curl' => [
        CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx'
    ]
]);

Se utilizar pedidos assíncronos com o multi-manipulador cURL e quiser afiná-lo, opções adicionais podem ser especificadas como uma matriz associativa no options key of the CurlMultiHandler construtor.

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlMultiHandler;

$client = new Client(['handler' => HandlerStack::create(new CurlMultiHandler([
    'options' => [
        CURLMOPT_MAX_TOTAL_CONNECTIONS => 50,
        CURLMOPT_MAX_HOST_CONNECTIONS => 5,
    ]
]))]);

Como posso adicionar opções de contexto de fluxo personalizado?

Pode passar as opções de contexto stream utilizando a tecla stream_context da opção de pedido. A tecla stream_context. array é um array associativo onde cada chave é um transporte PHP, e cada valor é um conjunto associativo de opções de transporte.

Por exemplo, digamos que é necessário personalizar a interface de saída de rede utilizada com um cliente e permitir certificados autoassinados.

$client->request('GET', '/', [
    'stream' => true,
    'stream_context' => [
        'ssl' => [
            'allow_self_signed' => true
        ],
        'socket' => [
            'bindto' => 'xxx.xxx.xxx.xxx'
        ]
    ]
]);

Porque estou a receber um erro de verificação SSL?

É necessário especificar o caminho no disco para o pacote CA utilizado pela Guzzle para a verificação do certificado do par. Ver verify.

O que é este erro de encaixe máximo de função?

Maximum function nesting level of '100' reached, aborting

Poderá deparar-se com este erro se tiver a extensão XDebug instalada e executa uma série de pedidos em callbacks. Esta mensagem de erro vem especificamente a partir da extensão XDebug. O próprio PHP não tem uma função limite de nidificação. Altere esta configuração no seu php.ini para aumentar o limite:

xdebug.max_nesting_level = 1000

Porque estou a receber uma resposta de erro 417?

Isto pode ocorrer por várias razões, mas se estiver a enviar PUT, POST, ou PATCH solicita com um cabeçalho Espere: 100-Continue, um servidor que não apoiar este cabeçalho irá devolver uma resposta de 417. Pode contornar isto através de definir a opção expect request option to false:

$client = new GuzzleHttp\Client();

// Disable the expect header on a single request
$response = $client->request('PUT', '/', ['expect' => false]);

// Disable the expect header on all client requests
$client = new GuzzleHttp\Client(['expect' => false]);

Como posso seguir pedidos redireccionados?

Pode permitir o seguimento de URIs redireccionadas e códigos de estado através do opção track_redirects. Cada URI redireccionado e código de estado será armazenado na opção X-Guzzle-Redirect-History e o X-Guzzle-Redirect-Status-History cabeçalho, respectivamente.

O URI do pedido inicial e o código de estado final serão excluídos dos resultados. Com isto em mente, deverá ser capaz de seguir facilmente o caminho de redireccionamento completo de um pedido.

Por exemplo, digamos que precisa de seguir os redireccionamentos e fornecer ambos os resultados em conjunto num único relatório:

// First you configure Guzzle with redirect tracking and make a request
$client = new Client([
    RequestOptions::ALLOW_REDIRECTS => [
        'max'             => 10,        // allow at most 10 redirects.
        'strict'          => true,      // use "strict" RFC compliant redirects.
        'referer'         => true,      // add a Referer header
        'track_redirects' => true,
    ],
]);
$initialRequest = '/redirect/3'; // Store the request URI for later use
$response = $client->request('GET', $initialRequest); // Make your request

// Retrieve both Redirect History headers
$redirectUriHistory = $response->getHeader('X-Guzzle-Redirect-History')[0]; // retrieve Redirect URI history
$redirectCodeHistory = $response->getHeader('X-Guzzle-Redirect-Status-History')[0]; // retrieve Redirect HTTP Status history

// Add the initial URI requested to the (beginning of) URI history
array_unshift($redirectUriHistory, $initialRequest);

// Add the final HTTP status code to the end of HTTP response history
array_push($redirectCodeHistory, $response->getStatusCode());

// (Optional) Combine the items of each array into a single result set
$fullRedirectReport = [];
foreach ($redirectUriHistory as $key => $value) {
    $fullRedirectReport[$key] = ['location' => $value, 'code' => $redirectCodeHistory[$key]];
}
echo json_encode($fullRedirectReport);