Această pagină oferă o introducere rapidă în Guzzle și exemple introductive. Dacă nu ați instalat deja Guzzle, accesați Instalare pagină.
Puteți trimite cereri cu Guzzle folosind un obiect GuzzleHttp\ClientInterface
.
use GuzzleHttp\Client;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://httpbin.org',
// You can set any number of default request options.
'timeout' => 2.0,
]);
Clienții sunt imuabili în Guzzle, ceea ce înseamnă că nu puteți modifica valorile implicite utilizate de un client după ce acesta a fost creat.
Constructorul clientului acceptă o matrice asociativă de opțiuni:
base_uri
(string|UriInterface) URI de bază al clientului care este fuzionat în relativă URI-uri relative. Poate fi un șir de caractere sau o instanță a UriInterface. Atunci când un URI relativ este furnizat unui client, clientul va combina URI-ul de bază cu URI-ul URI relativ utilizând regulile descrise în RFC 3986, secțiunea 5.2.
// Crearea unui client cu un URI de bază
$client = new GuzzleHttp\Client(['base_uri' => 'https://foo.com/api/'879849852656573008982);
// Trimiteți o cerere către https://foo.com/api/test
$response = $client->request('GET', 'test');
// Trimiteți o cerere către https://foo.com/root
$response = $client->request('GET', '/root');
Nu aveți chef să citiți RFC 3986? Iată câteva exemple rapide despre cum un base_uri
este rezolvat cu un alt URI.
base_uri | URI | Rezultat |
---|---|---|
http://foo.com |
/bar |
http://foo.com/bar |
http://foo.com/foo |
/bar |
http://foo.com/bar |
http://foo.com/foo |
bar |
http://foo.com/bar |
http://foo.com/foo/ |
bar |
http://foo.com/foo/bar |
http://foo.com |
http://baz.com |
http://baz.com |
http://foo.com/?bar |
bar |
http://foo.com/bar |
handler
Psr7\Http\Message\RequestInterface
și un array
de opțiuni de transfer, și trebuie să returneze un
code class="docutils literal">GuzzleHttp\Promise\PromiseInterface care este îndeplinită cu un
Psr7\Http\Message\ResponseInterface
în caz de succes....
Metodele magice de pe client facilitează trimiterea de cereri sincrone:
$response = $client->get('http://httpbin.org/get');
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');
Puteți să creați o cerere și apoi să trimiteți cererea împreună cu clientul atunci când sunteți gata:
use GuzzleHttp\Psr7\Request;
$request = new Request('PUT', 'http://httpbin.org/put');
$response = $client->send($request, ['timeout' => 2]);
Obiectele client oferă o mare flexibilitate în ceea ce privește modul în care cererile sunt transferate, inclusiv opțiunile implicite ale cererii, intermediarul implicit al stivei de gestionari care sunt utilizate de fiecare cerere, precum și un URI de bază care vă permite să trimiteți cereri cu URI-uri relative.
Puteți afla mai multe despre middleware-ul clientului în pagina Handlers and Middleware din documentație.
Puteți trimite cereri asincrone utilizând metodele magice furnizate de un client:
$promise = $client->getAsync('http://httpbin.org/get');
$promise = $client->deleteAsync('http://httpbin.org/delete');
$promise = $client->headAsync('http://httpbin.org/get');
$promise = $client->optionsAsync('http://httpbin.org/get');
$promise = $client->patchAsync('http://httpbin.org/patch');
$promise = $client->postAsync('http://httpbin.org/post');
$promise = $client->putAsync('http://httpbin.org/put');
De asemenea, puteți utiliza metodele sendAsync() și requestAsync() ale unui client:
use GuzzleHttp\Psr7\Request;
// Create a PSR-7 request object to send
$headers = ['X-Foo' => 'Bar'];
$body = 'Hello!';
$request = new Request('HEAD', 'http://httpbin.org/head', $headers, $body);
$promise = $client->sendAsync($request);
// Or, if you don't need to pass in a request instance:
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
Promisiunea returnată de aceste metode implementează standardul
Promises/A+ spec, furnizată de către
Guzzle promises library. Aceasta înseamnă că
că puteți să înlănțuiți apelurile then()
de la promisiune. Aceste apeluri then sunt
fie îndeplinite cu un Psr\Http\Message\ResponseInterface
de succes, fie
respinse cu o excepție.
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\RequestException;
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
function (ResponseInterface $res) {
echo $res->getStatusCode() . "\n";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
echo $e->getRequest()->getMethod();
}
);
Puteți trimite mai multe cereri concomitent, utilizând promisiuni și cereri asincrone.
use GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client(['base_uri' => 'http://httpbin.org/']);
// Initiate each request but do not block
$promises = [
'image' => $client->getAsync('/image'),
'png' => $client->getAsync('/image/png'),
'jpeg' => $client->getAsync('/image/jpeg'),
'webp' => $client->getAsync('/image/webp')
];
// Wait for the requests to complete; throws a ConnectException
// if any of the requests fail
$responses = Promise\Utils::unwrap($promises);
// You can access each response using the key of the promise
echo $responses['image']->getHeader('Content-Length')[0];
echo $responses['png']->getHeader('Content-Length')[0];
// Wait for the requests to complete, even if some of them fail
$responses = Promise\Utils::settle($promises)->wait();
// Values returned above are wrapped in an array with 2 keys: "state" (either fulfilled or rejected) and "value" (contains the response)
echo $responses['image']['state']; // returns "fulfilled"
echo $responses['image']['value']->getHeader('Content-Length')[0];
echo $responses['png']['value']->getHeader('Content-Length')[0];
Puteți utiliza obiectul GuzzleHttp\Pool
atunci când aveți o cantitate nedeterminată de cereri pe care doriți să le trimiteți.
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
$client = new Client();
$requests = function ($total) {
$uri = 'http://127.0.0.1:8126/guzzle-server/perf';
for ($i = 0; $i < $total; $i++) {
yield new Request('GET', $uri);
}
};
$pool = new Pool($client, $requests(100), [
'concurrency' => 5,
'fulfilled' => function (Response $response, $index) {
// this is delivered each successful response
},
'rejected' => function (RequestException $reason, $index) {
// this is delivered each failed request
},
]);
// Initiate the transfers and create a promise
$promise = $pool->promise();
// Force the pool of requests to complete.
$promise->wait();
Sau folosind o închidere care va returna o promisiune odată ce pool-ul apelează închiderea.
$client = new Client();
$requests = function ($total) use ($client) {
$uri = 'http://127.0.0.1:8126/guzzle-server/perf';
for ($i = 0; $i < $total; $i++) {
yield function() use ($client, $uri) {
return $client->getAsync($uri);
};
}
};
$pool = new Pool($client, $requests(100));
În exemplele anterioare, am recuperat o variabilă $response
sau am fost
livrat un răspuns de la o promisiune. Obiectul răspuns implementează un PSR-7
răspuns, Psr\Http\Message\ResponseInterface
, și conține multe elemente de
informații utile.
Puteți obține codul de stare și fraza de motivare a răspunsului:
$code = $response->getStatusCode(); // 200
$reason = $response->getReasonPhrase(); // OK
Puteți prelua antetele din răspuns:
// Check if a header exists.
if ($response->hasHeader('Content-Length')) {
echo "It exists";
}
// Get a header from the response.
echo $response->getHeader('Content-Length')[0];
// Get all of the response headers.
foreach ($response->getHeaders() as $name => $values) {
echo $name . ': ' . implode(', ', $values) . "\r\n";
}
Corpul unui răspuns poate fi recuperat utilizând metoda getBody
. Corpul poate fi utilizat ca șir de caractere, transformat într-un șir de caractere sau utilizat ca un obiect de tip stream.
$body = $response->getBody();
// Implicitly cast the body to a string and echo it
echo $body;
// Explicitly cast the body to a string
$stringBody = (string) $body;
// Read 10 bytes from the body
$tenBytes = $body->read(10);
// Read the remaining contents of the body as a string
$remainingBytes = $body->getContents();
Puteți furniza parametrii șirului de interogare cu o cerere în mai multe moduri.
Puteți seta parametrii șirului de interogare în URI-ul cererii:
$response = $client->request('GET', 'http://httpbin.org?foo=bar');
Puteți specifica parametrii șirului de interogare utilizând opțiunea de solicitare query
ca o matrice.
$client->request('GET', 'http://httpbin.org', [
'query' => ['foo' => 'bar']
]);
Furnizarea opțiunii sub formă de matrice va utiliza funcția http_build_query
din PHP pentru a formata șirul de interogare.
Și, în cele din urmă, puteți furniza opțiunea de solicitare query
sub forma unui șir de caractere.
$client->request('GET', 'http://httpbin.org', ['query' => 'foo=bar']);
Guzzle oferă mai multe metode de încărcare a datelor.
Puteți trimite cereri care conțin un flux de date prin transmiterea unui șir de caractere,
resursă returnată de la fopen
, sau o instanță a unei
Psr\Http\Message\StreamInterface
la opțiunea de cerere body
.
use GuzzleHttp\Psr7;
// Provide the body as a string.
$r = $client->request('POST', 'http://httpbin.org/post', [
'body' => 'raw data'
]);
// Provide an fopen resource.
$body = Psr7\Utils::tryFopen('/path/to/file', 'r');
$r = $client->request('POST', 'http://httpbin.org/post', ['body' => $body]);
// Use the Utils::streamFor method to create a PSR-7 stream.
$body = Psr7\Utils::streamFor('hello!');
$r = $client->request('POST', 'http://httpbin.org/post', ['body' => $body]);
O modalitate ușoară de a încărca date JSON și de a seta antetul corespunzător este utilizarea opțiunii de solicitare json
:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
În plus față de specificarea datelor brute ale unei cereri folosind opțiunea de cerere body
, Guzzle oferă abstracțiuni utile pentru trimiterea de date POST.
Trimiterea de cereri application/x-wwww-form-urlencoded
POST necesită să specificați câmpurile POST ca o matrice în opțiunile de cerere form_params
.
$response = $client->request('POST', 'http://httpbin.org/post', [
'form_params' => [
'field_name' => 'abc',
'other_field' => '123',
'nested_field' => [
'nested' => 'hello'
]
]
]);
Puteți trimite fișiere împreună cu un formular (multipart/form-data
cereri POST),
utilizând opțiunea de cerere multipart
. multipart
acceptă o matrice de
array-uri asociative, unde fiecare array asociativ conține următoarele chei:
Psr\Http\Message\StreamInterface
pentru a transmite în flux
conținutul de la un flux PSR-7.use GuzzleHttp\Psr7;
$response = $client->request('POST', 'http://httpbin.org/post', [
'multipart' => [
[
'name' => 'field_name',
'contents' => 'abc'
],
[
'name' => 'file_name',
'contents' => Psr7\Utils::tryFopen('/path/to/file', 'r')
],
[
'name' => 'other_file',
'contents' => 'hello',
'filename' => 'filename.txt',
'headers' => [
'X-Foo' => 'this is an extra header to include'
]
]
]
]);
Guzzle poate menține o sesiune de cookie-uri pentru dvs. dacă vi se indică acest lucru prin intermediul comenzii
cookies
opțiunea de cerere. Atunci când trimiteți o cerere, opțiunea cookies
trebuie să fie setată la o instanță de GuzzleHttp\Cookie\CookieJarInterface
.
// Use a specific cookie jar
$jar = new \GuzzleHttp\Cookie\CookieJar;
$r = $client->request('GET', 'http://httpbin.org/cookies', [
'cookies' => $jar
]);
Puteți seta cookies
la true
într-un constructor de client dacă doriți să utilizați un borcan de cookie-uri partajat pentru toate cererile.
// Use a shared client cookie jar
$client = new \GuzzleHttp\Client(['cookies' => true]);
$r = $client->request('GET', 'http://httpbin.org/cookies');
Există diferite implementări pentru GuzzleHttp\Cookie\CookieJarInterface
:
GuzzleHttp\Cookie\CookieJar
stochează cookie-urile sub forma unei matrice.GuzzleHttp\Cookie\FileCookieJar
persistă cookie-urile care nu sunt de sesiune.
utilizând un fișier în format JSON.GuzzleHttp\Cookie\SessionCookieJar
persistă cookie-urile în fișierul
sesiunea clientului.Puteți seta manual cookie-urile într-un borcan de cookie-uri cu ajutorul constructorului numit fromArray(array $cookies, $domain)
.
$jar = \GuzzleHttp\Cookie\CookieJar::fromArray(
[
'some_cookie' => 'foo',
'other_cookie' => 'barbaz1234'
],
'example.org'
);
Puteți obține un modul cookie după numele său cu metoda getCookieByName($name)
care returnează o instanță GuzzleHttp\Cookie\SetCookie
.
$cookie = $jar->getCookieByName('some_cookie');
$cookie->getValue(); // 'foo'
$cookie->getDomain(); // 'example.org'
$cookie->getExpires(); // expiration date as a Unix timestamp
Cookie-urile pot fi, de asemenea, preluate într-o matrice datorită metodei toArray().
Interfața GuzzleHttp\Cookie\CookieJarInterface
extinde
Traversable
astfel încât poate fi iterată într-o buclă foreach.
Guzzle va urma automat redirecționările, cu excepția cazului în care îi spuneți să nu o facă. Puteți personaliza comportamentul de redirecționare folosind opțiunea de cerere allow_redirects
.
true
pentru a activa redirecționările normale cu un număr maxim de 5
redirecționări. Aceasta este setarea implicită.false
pentru a dezactiva redirecționările.$response = $client->request('GET', 'http://github.com');
echo $response->getStatusCode();
// 200
Următorul exemplu arată că redirecționările pot fi dezactivate.
$response = $client->request('GET', 'http://github.com', [
'allow_redirects' => false
]);
echo $response->getStatusCode();
// 301
Tree View
Următoarea vizualizare în arbore descrie modul în care excepțiile Guzzle depind unele de altele.
. \RuntimeException
└── TransferException (implements GuzzleException)
├── ConnectException (implements NetworkExceptionInterface)
└── RequestException
├── BadResponseException
│ ├── ServerException
│ └── ClientException
└── TooManyRedirectsException
Guzzle aruncă excepții pentru erorile care apar în timpul unui transfer.
O excepție GuzzleHttp\Exception\ConnectException
este aruncată în
cazul unei erori de rețea. Această excepție se extinde de la
GuzzleHttp\Exception\TransferException
.
O GuzzleHttp\Exception\ClientException
este aruncată pentru 400
în cazul în care opțiunea de cerere http_errors
este setată la true. Acest lucru
excepție se extinde din GuzzleHttp\Exception\BadResponseException
și
GuzzleHttp\Exception\BadResponseException
se extinde de la
GuzzleHttp\Exception\RequestException
.
use GuzzleHttp\Psr7;
use GuzzleHttp\Exception\ClientException;
try {
$client->request('GET', 'https://github.com/_abc_123_404');
} catch (ClientException $e) {
echo Psr7\Message::toString($e->getRequest());
echo Psr7\Message::toString($e->getResponse());
}
O GuzzleHttp\Exception\ServerException
este aruncată pentru nivelul 500
în cazul în care opțiunea de cerere http_errors
este setată la true. Acest lucru
excepție se extinde de la GuzzleHttp\Exception\BadResponseException
.
O GuzzleHttp\Exception\TooManyRedirectsException
este aruncată atunci când sunt aruncate prea multe adrese de redirecționare.
multe redirecționări sunt urmate. Această excepție se extinde de la GuzzleHttp\Exception\RequestException
.
Toate excepțiile de mai sus se extind din GuzzleHttp\Exception\TransferException
.
Guzzle expune câteva variabile de mediu care pot fi utilizate pentru a personaliza comportamentul bibliotecii.
GUZZLE_CURL_SELECT_TIMEOUT
curl_multi_select()
. Unele sisteme
au probleme cu implementarea de către PHP a curl_multi_select()
unde
apelarea acestei funcții duce întotdeauna la așteptarea duratei maxime de
timeout-ului.HTTP_PROXY
Definește proxy-ul care trebuie utilizat atunci când se trimit cereri utilizând protocolul "http"
Notă: deoarece variabila HTTP_PROXY poate conține date arbitrare ale utilizatorului în unele medii (CGI), variabila este utilizată numai în CLI SAPI. Pentru mai multe informații, consultați https://httpoxy.org
HTTPS_PROXY
NO_PROXY
Guzzle poate utiliza setările PHP ini la configurarea clienților.
openssl.cafile