FAQ

Vaatiiko Guzzle cURL:n?

Ei. Guzzle voi käyttää mitä tahansa HTTP-käsittelijää pyyntöjen lähettämiseen. Tämä tarkoittaa, että Guzzle voidaan käyttää cURL:n, PHP:n stream-kääreen, socketien ja lukkiutumattomien kirjastojen kanssa. kuten React. Sinun täytyy vain määrittää HTTP-käsittelijä. käyttämään eri menetelmää pyyntöjen lähettämiseen.

Huomautus

Guzzle on perinteisesti käyttänyt vain cURL:ää HTTP-pyyntöjen lähettämiseen. cURL on hämmästyttävä HTTP-asiakasohjelma (kiistatta paras), ja Guzzle käyttää jatkossakin cURL:ää. sitä oletusarvoisesti, kun se on saatavilla. Se on harvinaista, mutta jotkut kehittäjät eivät ole ole asentanut cURL:ää järjestelmiinsä tai törmäävät versiokohtaisiin ongelmiin. Sallimalla vaihdettavat HTTP-käsittelijät Guzzle on nyt paljon paremmin muokattavissa. ja pystyy mukautumaan useampien kehittäjien tarpeisiin.

Voiko Guzzle lähettää asynkronisia pyyntöjä?

Kyllä. Voit käyttää requestAsync, sendAsync, getAsync, headAsync, putAsync, postAsync, deleteAsync ja patchAsync. metodeja, joilla asiakas lähettää asynkronisen pyynnön. Asiakas palauttaa GuzzleHttp\Promise\PromiseInterface -olion. Voit ketjuttaa then funktioita lupauksesta.

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

Voit pakottaa asynkronisen vastauksen loppuun käyttämällä palautetun lupauksen wait() metodia.

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

Miten voin lisätä mukautettuja cURL-asetuksia?

cURL tarjoaa valtavan määrän muokattavia vaihtoehtoja. Vaikka Guzzle normalisoi monet näistä vaihtoehdoista eri käsittelijöiden välillä, on olemassa on tilanteita, joissa sinun on asetettava mukautettuja cURL-asetuksia. Tämä voidaan tehdä välittämällä assosiatiivinen joukko cURL-asetuksia curl-avaimessa a request.

Oletetaan esimerkiksi, että sinun on mukautettava asiakkaan kanssa käytettävää lähtevää verkkoliitäntää.

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

Jos käytät asynkronisia pyyntöjä cURL-monikäsittelijän kanssa ja haluat säätää sitä, lisäasetukset voidaan määritellä assosiatiivisena joukkona attribuutissa options -avaimeen CurlMultiHandler -konstruktorissa.

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

Miten voin lisätä mukautettuja stream-kontekstin vaihtoehtoja?

Voit välittää mukautettuja virtauskontekstin asetuksia käyttämällä pyyntövaihtoehdon stream_context-avainta. stream_context array on assosiatiivinen array, jossa jokainen avain on PHP-siirto ja jokainen arvo on on assosiatiivinen joukko kuljetusvaihtoehtoja.

Oletetaan esimerkiksi, että sinun on mukautettava asiakkaan kanssa käytettävää lähtevää verkkoliitäntää ja sallittava itse allekirjoitetut varmenteet.

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

Miksi saan SSL-varmennusvirheen?

Sinun on määritettävä levyllä oleva polku CA-pakettiin, jota Guzzle käyttää vertaisvarmenteen tarkistamiseen. Katso verify.

Mikä on tämä maksimifunktion sisäkkäisvirhe?

Maximum function nesting level of '100' reached, aborting

Saatat törmätä tähän virheeseen, jos sinulla on asennettuna XDebug-laajennus ja suoritat paljon pyyntöjä takaisinkutsuissa. Tämä virheilmoitus tulee erityisesti XDebug-laajennuksesta. PHP:llä itsellään ei ole funktiota sisäkkäisrajoitusta. Muuta tätä asetusta php.ini:ssäsi lisätäksesi rajaa:

xdebug.max_nesting_level = 1000

Miksi saan 417-virheilmoituksen?

Tämä voi johtua monista syistä, mutta jos lähetät PUT-, POST- tai PATCH-pyyntöjä, joissa on Expect: 100-Continue -otsikko, palvelin, joka ei ole ei tue tätä otsikkoa, palauttaa vastauksen 417. Tämän voi kiertää seuraavasti asettamalla expect-pyyntövaihtoehdon arvoksi 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]);

Miten voin seurata uudelleenohjattuja pyyntöjä?

Voit ottaa uudelleenohjattujen URI:iden ja tilakoodien seurannan käyttöön komennolla track_redirects -vaihtoehdon avulla. Jokainen uudelleenohjattu URI ja tilakoodi tallennetaan tiedostoon X-Guzzle-Redirect-History ja X-Guzzle-Redirect-Status-History. otsikon mukaisesti.

Alkuperäisen pyynnön URI ja lopullinen tilakoodi jätetään tulosten ulkopuolelle. Näin ollen sinun pitäisi pystyä helposti seuraamaan pyynnön koko uudelleenohjauspolkua.

Sanotaan esimerkiksi, että sinun on seurattava uudelleenohjauksia ja annettava molemmat tulokset yhdessä raportissa:

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