Guzzle utilizează PSR-7 ca interfață de mesaje HTTP. Acest lucru permite Guzzle să lucreze cu orice altă bibliotecă care utilizează interfețe de mesaje PSR-7.
Guzzle este un client HTTP care trimite cereri HTTP către un server și primește răspunsuri HTTP. Atât cererile, cât și răspunsurile sunt denumite mesaje.
Guzzle se bazează pe pachetul guzzlehttp/psr7
Composer pentru implementarea PSR-7 pentru mesajele sale.
Puteți crea o cerere folosind clasa GuzzleHttp\Psr7\Request
:
use GuzzleHttp\Psr7\Request;
$request = new Request('GET', 'http://httpbin.org/get');
// You can provide other optional constructor arguments.
$headers = ['X-Foo' => 'Bar'];
$body = 'hello!';
$request = new Request('PUT', 'http://httpbin.org/put', $headers, $body);
Puteți crea un răspuns utilizând clasa GuzzleHttp\Psr7\Response
:
use GuzzleHttp\Psr7\Response;
// The constructor requires no arguments.
$response = new Response();
echo $response->getStatusCode(); // 200
echo $response->getProtocolVersion(); // 1.1
// You can supply any number of optional arguments.
$status = 200;
$headers = ['X-Foo' => 'Bar'];
$body = 'hello!';
$protocol = '1.1';
$response = new Response($status, $headers, $body, $protocol);
Atât mesajele de cerere, cât și cele de răspuns conțin anteturi HTTP.
Puteți verifica dacă o cerere sau un răspuns are un anumit antet folosind metoda hasHeader()
.
use GuzzleHttp\Psr7;
$request = new Psr7\Request('GET', '/', ['X-Foo' => 'bar']);
if ($request->hasHeader('X-Foo')) {
echo 'It is there';
}
Puteți prelua toate valorile antetului ca o matrice de șiruri folosind getHeader()
.
$request->getHeader('X-Foo'); // ['bar']
// Retrieving a missing header returns an empty array.
$request->getHeader('X-Bar'); // []
Puteți itera peste anteturile unui mesaj utilizând metoda getHeaders()
.
foreach ($request->getHeaders() as $name => $values) {
echo $name . ': ' . implode(', ', $values) . "\r\n";
}
Unele anteturi conțin informații suplimentare privind perechile cheie-valoare. De exemplu, anteturile Link conțin un link și mai multe perechi de valori cheie:
<http://foo.com>; rel="thing"; type="image/jpeg"
Guzzle oferă o funcție convenabilă care poate fi utilizată pentru a analiza aceste tipuri de anteturi:
use GuzzleHttp\Psr7;
$request = new Psr7\Request('GET', '/', [
'Link' => '<http:/.../front.jpeg>; rel="front"; type="image/jpeg"'
]);
$parsed = Psr7\Header::parse($request->getHeader('Link'));
var_export($parsed);
Va ieși:
array (
0 =>
array (
0 => '<http:/.../front.jpeg>',
'rel' => 'front',
'type' => 'image/jpeg',
),
)
Rezultatul conține un hash de perechi cheie-valoare. Valorile antetului care nu au nicio cheie (de exemplu, legătura) sunt indexate numeric, în timp ce părțile de antet care formează o cheie pereche cheie-valoare sunt adăugate ca o pereche cheie-valoare.
Atât mesajele de cerere, cât și cele de răspuns pot conține un corp.
Puteți prelua corpul unui mesaj utilizând metoda getBody()
:
$response = GuzzleHttp\get('http://httpbin.org/get');
echo $response->getBody();
// JSON string: { ... }
Corpul utilizat în obiectele request și response este un obiect
Psr\Http\Message\StreamInterface
. Acest flux este utilizat atât pentru
încărcarea de date și descărcarea de date. Guzzle va stoca, în mod implicit, corpul fișierului
unui mesaj într-un flux care utilizează fluxurile temporare PHP. Atunci când dimensiunea corpului
depășește 2 MB, fluxul va trece automat la stocarea datelor pe disc
mai degrabă decât în memorie (protejând aplicația de epuizarea memoriei).
Cel mai simplu mod de a crea un corp pentru un mesaj este folosind streamFor
din clasa GuzzleHttp\Psr7\Utils
--
Utils::streamFor
. Această metodă acceptă șiruri de caractere, resurse,
callables, iteratori, alte streamables, și returnează o instanță de
Psr\Http\Message\StreamInterface
.
Corpul unei cereri sau al unui răspuns poate fi transformat într-un șir de caractere sau puteți citi și scrie octeți de pe flux, după cum este necesar.
use GuzzleHttp\Stream\Stream;
$response = $client->request('GET', 'http://httpbin.org/get');
echo $response->getBody()->read(4);
echo $response->getBody()->read(4);
echo $response->getBody()->read(1024);
var_export($response->eof());
Cererile sunt trimise de la un client la un server. Cererile includ metoda de a fi aplicată unei resurse, identificatorul resursei și protocolul. de utilizat.
Atunci când creați o cerere, trebuie să furnizați metoda HTTP pe care doriți să o folosiți. să executați. Puteți specifica orice metodă pe care o doriți, inclusiv o metodă personalizată care s-ar putea să nu facă parte din RFC 7231 (cum ar fi "MOVE").
// Create a request using a completely custom HTTP method
$request = new \GuzzleHttp\Psr7\Request('MOVE', 'http://httpbin.org/move');
echo $request->getMethod();
// MOVE
Puteți să creați și să trimiteți o cerere folosind metode pe un client care corespund metodei HTTP pe care doriți să o utilizați.
$client->get('http://httpbin.org/get', [/** options **/879849852657373008982)
$client->post('http://httpbin.org/post', [/** options **/879849852657373008982)
$client->head('http://httpbin.org/get', [/** options **/879849852657373008982)
$client->put('http://httpbin.org/put', [/** options **/879849852657373008982)
$client->delete('http://httpbin.org/delete', [/** options **/879849852657373008982)
$client->options('http://httpbin.org/get', [/** options **/])
$client->patch('http://httpbin.org/put', [/** options **/879849852657373008982)
De exemplu:
$response = $client->patch('http://httpbin.org/patch', ['body' => 'content']);
URI-ul de cerere este reprezentat de un obiect Psr\Http\Message\UriInterface
.
Guzzle oferă o implementare a acestei interfețe folosind
GuzzleHttp\Psr7\Uri
.
Atunci când creați o cerere, puteți furniza URI sub forma unui șir de caractere sau a unei instanțe de Psr\Http\Message\UriInterface
.
$response = $client->request('GET', 'http://httpbin.org/get?q=foo');
schema unei cereri specifică protocolul care trebuie utilizat la trimiterea cererii. Atunci când se utilizează Guzzle, schema schema poate fi setată la "http" sau "https".
$request = new Request('GET', 'http://httpbin.org');
echo $request->getUri()->getScheme(); // http
echo $request->getUri(); // http://httpbin.org
Gazda este accesibilă prin intermediul URI-ului deținut de cerere sau prin accesarea antetului Host.
$request = new Request('GET', 'http://httpbin.org');
echo $request->getUri()->getHost(); // httpbin.org
echo $request->getHeader('Host'); // httpbin.org
Nu este necesar niciun port atunci când se utilizează schemele "http" sau "https".
$request = new Request('GET', 'http://httpbin.org:8080');
echo $request->getUri()->getPort(); // 8080
echo $request->getUri(); // http://httpbin.org:8080
Calea de acces a unei cereri este accesibilă prin intermediul obiectului URI.
$request = new Request('GET', 'http://httpbin.org/get');
echo $request->getUri()->getPath(); // /get
Conținutul căii de acces va fi filtrat automat pentru a se asigura că numai caracterele permise sunt prezente în calea de acces. Toate caracterele care nu sunt permise în calea de acces va fi codificat în procente în conformitate cu RFC 3986 secțiunea 3.3
Șirul de interogare al unei cereri poate fi accesat cu ajutorul getQuery()
al obiectului URI deținut de cerere.
$request = new Request('GET', 'http://httpbin.org/?foo=bar');
echo $request->getUri()->getQuery(); // foo=bar
Conținutul șirului de interogare va fi filtrat automat pentru a se asigura că în șirul de interogare sunt prezente numai caracterele permise. Orice caracter care care nu sunt permise în șirul de interogare vor fi codificate în procente în conformitate cu RFC 3986 secțiunea 3.4
Răspunsurile sunt mesajele HTTP pe care un client le primește de la un server după trimiterea unui mesaj de solicitare HTTP.
Linia de început a unui răspuns conține protocolul și versiunea protocolului, codul de stare și fraza de motiv.
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'http://httpbin.org/get');
echo $response->getStatusCode(); // 200
echo $response->getReasonPhrase(); // OK
echo $response->getProtocolVersion(); // 1.1
După cum s-a descris anterior, puteți obține corpul unui răspuns utilizând metoda getBody()
.
$body = $response->getBody();
echo $body;
// Cast to a string: { ... }
$body->seek(0);
// Rewind the body
$body->read(1024);
// Read bytes of the body
Guzzle utilizează obiecte de flux PSR-7 pentru a reprezenta mesajele de cerere și răspuns. de răspuns și răspuns. Aceste obiecte stream vă permit să lucrați cu diferite tipuri de date, toate utilizând o interfață comună.
Mesajele HTTP constau dintr-o linie de început, anteturi și un corp. Corpul unui mesaj HTTP mesaj poate fi foarte mic sau extrem de mare. Încercarea de a reprezenta corpul unui mesaj sub forma unui șir de caractere poate consuma cu ușurință mai multă memorie decât se intenționează, deoarece corpul trebuie să fie stocat complet în memorie. Încercarea de a stoca corpul unui mesaj de tip cerere sau răspuns în memorie ar împiedica utilizarea implementării respective de către de a putea lucra cu corpuri mari de mesaje. StreamInterface este utilizată în pentru a ascunde detaliile de implementare a locului în care un flux de date este citit din sau în care se scrie.
PSR-7 Psr\Http\Message\StreamInterface
expune mai multe metode care permit citirea, scrierea și parcurgerea eficientă a fluxurilor.
Fluxurile își expun capacitățile folosind trei metode: isReadable()
,
isWritable()
, și isSeekable()
. Aceste metode pot fi utilizate de stream
colaboratori pentru a determina dacă un flux este capabil să le îndeplinească cerințele.
Fiecare instanță de flux are diferite capacități: poate fi doar de citire, numai în scriere, citire-scriere, permite accesul aleatoriu arbitrar (căutare înainte sau înapoi), sau înapoi către orice locație) sau să permită numai accesul secvențial (de exemplu, în cazul cazul unui socket sau al unui pipe).
Guzzle utilizează pachetul guzzlehttp/psr7
pentru a oferi suport pentru fluxuri. Mai multe informații
informații despre utilizarea fluxurilor, crearea de fluxuri, conversia fluxurilor în PHP
resursă de flux și decoratori de fluxuri pot fi găsite în
Documentația Guzzle PSR-7.
Cel mai bun mod de a crea un flux este folosind GuzzleHttp\Psr7\Utils::streamFor
metoda . Această metodă acceptă șiruri de caractere, resurse returnate din fopen()
,
un obiect care implementează __toString()
, iteratori, callables și instanțe
de Psr\Http\Message\StreamInterface
.
use GuzzleHttp\Psr7;
$stream = Psr7\Utils::streamFor('string data');
echo $stream;
// string data
echo $stream->read(3);
// str
echo $stream->getContents();
// ing data
var_export($stream->eof());
// true
var_export($stream->tell());
// 11
Puteți crea fluxuri din iteratori. Iteratorul poate produce orice număr de octeți pe iterație. Orice octet în exces returnat de către iterator care nu a fost solicitați de un consumator de flux vor fi blocați în memorie tampon până la o citire ulterioară.
use GuzzleHttp\Psr7;
$generator = function ($bytes) {
for ($i = 0; $i < $bytes; $i++) {
yield '.';
}
};
$iter = $generator(1024);
$stream = Psr7\Utils::streamFor($iter);
echo $stream->read(3); // ...
Fluxurile expun metadatele fluxurilor prin metoda getMetadata()
. Această metodă
metodă oferă datele pe care le recuperați atunci când apelați metoda PHP
stream_get_meta_data(),
și, opțional, poate expune și alte date personalizate.
use GuzzleHttp\Psr7;
$resource = Psr7\Utils::tryFopen('/path/to/file', 'r');
$stream = Psr7\Utils::streamFor($resource);
echo $stream->getMetadata('uri');
// /path/to/file
var_export($stream->isReadable());
// true
var_export($stream->isWritable());
// false
var_export($stream->isSeekable());
// true
Adăugarea unei funcționalități personalizate la fluxuri este foarte simplă cu ajutorul decoratorilor de fluxuri. Guzzle oferă mai multe decoratoare încorporate care oferă fluxuri suplimentare funcționalitate suplimentară pentru fluxuri.