FAQ

Guzzle richiede cURL?

No. Guzzle può usare qualsiasi gestore HTTP per inviare richieste. Questo significa che Guzzle può essere usato con cURL, lo stream wrapper di PHP, i socket, e le librerie non bloccanti come React. È sufficiente configurare un gestore HTTP per utilizzare un metodo diverso di invio delle richieste.

Nota

Guzzle ha storicamente utilizzato solo cURL per inviare richieste HTTP. cURL è un incredibile client HTTP (probabilmente il migliore), e Guzzle continuerà ad usarlo di default quando è disponibile. È raro, ma alcuni sviluppatori non hanno hanno cURL installato sui loro sistemi o si imbattono in problemi specifici della versione. Permettendo di scambiare i gestori HTTP, Guzzle è ora molto più personalizzabile e in grado di adattarsi alle esigenze di più sviluppatori.

Guzzle può inviare richieste asincrone?

Sì. Puoi usare il requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync, e patchAsync di un client per inviare una richiesta asincrona. Il client restituirà un GuzzleHttp\Promise\PromiseInterface oggetto. Potete concatenare then dalla promessa.

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

Si può forzare una risposta asincrona a completare usando il metodo wait() della promessa restituita.

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

Come posso aggiungere opzioni cURL personalizzate?

cURL offre un enorme numero di opzioni personalizzabili. Mentre Guzzle normalizza molte di queste opzioni in diversi gestori, ci ci sono momenti in cui è necessario impostare opzioni cURL personalizzate. Questo può essere realizzato passando un array associativo di impostazioni cURL nella chiave curl di una richiesta.

Per esempio, diciamo che avete bisogno di personalizzare l'interfaccia di rete in uscita usata con un cliente.

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

Se usate richieste asincrone con cURL multi handler e volete modificarlo, le opzioni aggiuntive possono essere specificate come un array associativo nella chiave options della chiave del costruttore CurlMultiHandler.

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,
    ]
]))]);

Come posso aggiungere opzioni personalizzate al contesto del flusso?

Puoi passare opzioni personalizzate di stream context usando la chiave stream_context dell'opzione di richiesta. L'array stream_context è un array associativo dove ogni chiave è un trasporto PHP e ogni valore è un array associativo di opzioni di trasporto.

Per esempio, diciamo che avete bisogno di personalizzare l'interfaccia di rete in uscita usata con un client e permettere certificati autofirmati.

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

Perché ricevo un errore di verifica SSL?

Dovete specificare il percorso su disco del bundle della CA usato da Guzzle per verificare il certificato del peer. Vedere verify.

Cos'è questo errore di annidamento di funzioni massime?

Maximum function nesting level of '100' reached, aborting

Potreste incorrere in questo errore se avete l'estensione XDebug installata e eseguite molte richieste in callback. Questo messaggio di errore viene specificamente dall'estensione XDebug. PHP stesso non ha un limite di limite di nidificazione. Cambia questa impostazione nel tuo php.ini per aumentare il limite:

xdebug.max_nesting_level = 1000

Perché ricevo una risposta di errore 417?

Questo può accadere per una serie di ragioni, ma se state inviando richieste PUT, POST, o PATCH con un'intestazione Expect: 100-Continue, un server che non supporta questa intestazione restituirà una risposta 417. È possibile aggirare questo problema impostando l'opzione di richiesta expect su 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]);

Come posso tracciare le richieste reindirizzate?

È possibile abilitare il tracciamento degli URI reindirizzati e dei codici di stato tramite l'opzione opzione track_redirects. Ogni URI reindirizzato e codice di stato sarà memorizzato nella cartella X-Guzzle-Redirect-History e nell'X-Guzzle-Redirect-Status-History rispettivamente.

L'URI della richiesta iniziale e il codice di stato finale saranno esclusi dai risultati. Con questo in mente si dovrebbe essere in grado di tracciare facilmente il percorso completo di reindirizzamento di una richiesta.

Per esempio, diciamo che avete bisogno di tracciare i reindirizzamenti e fornire entrambi i risultati insieme in un unico rapporto:

// 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);