"Guzzle" naudoja PSR-7 kaip HTTP pranešimų sąsają. Dėl to "Guzzle" gali dirbti su bet kuria kita biblioteka, naudojančia PSR-7 pranešimų sąsajas.
"Guzzle" yra HTTP klientas, kuris siunčia HTTP užklausas į serverį ir gauna HTTP atsakymus. Užklausos ir atsakymai vadinami pranešimais.
"Guzzle" remiasi guzzlehttp/psr7
"Composer" paketu, kad įgyvendintų PSR-7 pranešimą.
Užklausą galite sukurti naudodami GuzzleHttp\Psr7\Request
klasę:
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);
Atsakymą galite sukurti naudodami GuzzleHttp\Psr7\Response
klasę:
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);
Tiek užklausos, tiek atsakymo pranešimuose yra HTTP antraštės.
Naudodami hasHeader()
metodą galite patikrinti, ar užklausoje arba atsakyme yra tam tikra antraštė.
use GuzzleHttp\Psr7;
$request = new Psr7\Request('GET', '/', ['X-Foo' => 'bar']);
if ($request->hasHeader('X-Foo')) {
echo 'It is there';
}
Visas antraštės reikšmes galite gauti kaip eilučių masyvą naudodami getHeader()
.
$request->getHeader('X-Foo'); // ['bar']
// Retrieving a missing header returns an empty array.
$request->getHeader('X-Bar'); // []
Pranešimo antraštes galite peržiūrėti naudodami getHeaders()
metodą.
foreach ($request->getHeaders() as $name => $values) {
echo $name . ': ' . implode(', ', $values) . "\r\n";
}
Kai kuriose antraštėse pateikiama papildoma rakto ir vertės poros informacija. Pavyzdžiui, "Link" antraštėse yra nuoroda ir kelios raktų vertės poros:
<http://foo.com>; rel="thing"; type="image/jpeg"
"Guzzle" suteikia patogią funkciją, kurią galima naudoti šių tipų antraštėms analizuoti:
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);
Bus išvesta:
array (
0 =>
array (
0 => '<http:/.../front.jpeg>',
'rel' => 'front',
'type' => 'image/jpeg',
),
)
Rezultate yra rakto ir vertės porų hash. Antraštės reikšmės, neturinčios rakto (t. y. nuoroda), indeksuojamos skaitmenimis, o antraštės dalys, sudarančios raktą vertės porą, pridedamos kaip rakto ir vertės pora.
Tiek užklausos, tiek atsakymo pranešimuose gali būti kūnas.
Pranešimo kūną galite gauti naudodami getBody()
metodą:
$response = GuzzleHttp\get('http://httpbin.org/get');
echo $response->getBody();
// JSON string: { ... }
Užklausos ir atsakymo objektuose naudojamas kūnas yra
Psr\Http\Message\StreamInterface
. Šis srautas naudojamas tiek
duomenims įkelti ir duomenims atsisiųsti. Pagal numatytuosius nustatymus "Guzzle" saugo
sraute, kuriame naudojami PHP laikinieji srautai. Kai kūno dydis
viršija 2 MB, srautas automatiškai pereis prie duomenų saugojimo diske
o ne į atmintį (taip jūsų programa apsaugoma nuo atminties išsekimo).
Lengviausias būdas sukurti pranešimo kūną - naudoti streamFor
metodą iš GuzzleHttp\Psr7\Utils
klasės --
Utils::streamFor
. Šis metodas priima eilutes, išteklius,
callables, iteratorius, kitus streamables ir grąžina egzempliorių
Psr\Http\Message\StreamInterface
.
Užklausos arba atsakymo kūną galima paversti eilute arba prireikus skaityti ir rašyti baitus iš srauto.
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());
Užklausos siunčiamos iš kliento į serverį. Užklausose nurodomas metodas taikomas ištekliui, ištekliaus identifikatorius ir protokolas. versija, kurią reikia naudoti.
Kuriant užklausą reikia nurodyti pageidaujamą HTTP metodą. atlikti. Galite nurodyti bet kurį norimą metodą, įskaitant pasirinktinį metodą kuris gali būti neįtrauktas į RFC 7231 (pvz., "MOVE").
// Create a request using a completely custom HTTP method
$request = new \GuzzleHttp\Psr7\Request('MOVE', 'http://httpbin.org/move');
echo $request->getMethod();
// MOVE
Užklausą galite sukurti ir išsiųsti naudodami kliento metodus, kurie atitinka norimą naudoti HTTP metodą.
$client->get('http://httpbin.org/get', [/** options **/])
$client->post('http://httpbin.org/post', [/** options **/])
$client->head('http://httpbin.org/get', [/** options **/])
$client->put('http://httpbin.org/put', [/** options **/])
$client->delete('http://httpbin.org/delete', [/** options **/])
$client->options('http://httpbin.org/get', [/** options **/])
$client->patch('http://httpbin.org/put', [/** options **/])
Pavyzdžiui:
$response = $client->patch('http://httpbin.org/patch', ['body' => 'content']);
Užklausos URI atvaizduojamas Psr\Http\Message\UriInterface
objektu.
"Guzzle" pateikia šios sąsajos realizaciją, naudodama
GuzzleHttp\Psr7\Uri
klasę.
Kurdami užklausą, URI galite pateikti kaip eilutę arba Psr\Http\Message\UriInterface
egzempliorių.
$response = $client->request('GET', 'http://httpbin.org/get?q=foo');
Užklausos schema nurodo protokolą, kuris turi būti naudojamas siunčiant užklausą. Naudojant "Guzzle schemą galima nustatyti "http" arba "https".
$request = new Request('GET', 'http://httpbin.org');
echo $request->getUri()->getScheme(); // http
echo $request->getUri(); // http://httpbin.org
Kompiuteris pasiekiamas naudojant URI, kuris priklauso užklausai, arba naudojant Host antraštę.
$request = new Request('GET', 'http://httpbin.org');
echo $request->getUri()->getHost(); // httpbin.org
echo $request->getHeader('Host'); // httpbin.org
Naudojant "http" arba "https" schemas prievado naudoti nereikia.
$request = new Request('GET', 'http://httpbin.org:8080');
echo $request->getUri()->getPort(); // 8080
echo $request->getUri(); // http://httpbin.org:8080
Užklausos kelias pasiekiamas per URI objektą.
$request = new Request('GET', 'http://httpbin.org/get');
echo $request->getUri()->getPath(); // /get
Kelio turinys bus automatiškai filtruojamas, kad būtų užtikrinta, jog tik kelyje būtų pateikti leistini simboliai. Bet kokie neleistini simboliai kelias bus koduojamas procentais pagal RFC 3986 3.3 skyrių.
Užklausos užklausos eilutę galima pasiekti naudojant getQuery()
URI objekto, kuriam priklauso užklausa.
$request = new Request('GET', 'http://httpbin.org/?foo=bar');
echo $request->getUri()->getQuery(); // foo=bar
Užklausos eilutės turinys bus automatiškai filtruojamas siekiant užtikrinti, kad užklausos eilutėje būtų tik leistini simboliai. Bet kokie simboliai, kurie užklausos eilutėje yra neleistini, bus koduojami procentais pagal RFC 3986 3.4 skyrių.
Atsakymai - tai HTTP pranešimai, kuriuos klientas gauna iš serverio išsiuntęs HTTP užklausos pranešimą.
Atsakymo pradžios eilutėje pateikiamas protokolas ir protokolo versija, būsenos kodas ir priežasties frazė.
$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
Kaip aprašyta anksčiau, atsakymo kūną galite gauti naudodami getBody()
metodą.
$body = $response->getBody();
echo $body;
// Cast to a string: { ... }
$body->seek(0);
// Rewind the body
$body->read(1024);
// Read bytes of the body
"Guzzle" naudoja PSR-7 srauto objektus užklausos ir atsakymo pranešimams atvaizduoti kūnus. Šie srauto objektai leidžia dirbti su įvairių tipų duomenimis. naudojant bendrą sąsają.
HTTP pranešimus sudaro pradinė eilutė, antraštės ir turinys. HTTP pranešimo kūnas pranešimas gali būti labai mažas arba labai didelis. Bandymas atvaizduoti turinį pranešimo eilutę, gali būti sunaudojama daugiau atminties nei numatyta, nes kūnas turi būti visiškai saugomas atmintyje. Bandymas saugoti pranešimo kūną užklausos ar atsakymo tekstą atmintyje, būtų užkirstas kelias naudoti šią realizaciją iš negalėtų dirbti su dideliais pranešimų kūnais. StreamInterface naudojama siekiant paslėpti įgyvendinimo detales, iš kur skaitomas duomenų srautas arba į kurį rašoma.
PSR-7 Psr\Http\Message\StreamInterface
pateikia keletą metodų, leidžiančių efektyviai skaityti iš srautų, rašyti į juos ir keliauti jais.
Srautai savo galimybes atskleidžia trimis būdais: isReadable()
,
isWritable()
ir isSeekable()
. Šiuos metodus gali naudoti srautas
bendradarbiai, norėdami nustatyti, ar srautas gali atitikti jų reikalavimus.
Kiekvienas srauto egzempliorius turi įvairių galimybių: jie gali būti tik skaitomi, tik rašyti, skaityti ir rašyti, leisti savavališką atsitiktinę prieigą (ieškoti pirmyn arba atgal į bet kurią vietą) arba leisti tik nuosekliąją prieigą (pvz. lizdo arba vamzdžio atveju).
Guzzle naudoja guzzlehttp/psr7
paketą srautui palaikyti. Daugiau
informacijos apie srautų naudojimą, srautų kūrimą, srautų konvertavimą į PHP
srauto išteklius ir srauto dekoratorius rasite
Guzzle PSR-7 dokumentacijoje.
Geriausias būdas sukurti srautą - naudoti GuzzleHttp\Psr7\Utils::streamFor
metodą. Šis metodas priima eilutes, išteklius, grąžintus iš fopen()
,
objektą, kuris įgyvendina __toString()
, iteratorius, šaukinius ir egzempliorius
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
Srautus galite kurti iš iteratorių. Iteratorius gali duoti bet kokį skaičių baitų per vieną iteraciją. Bet kokie pertekliniai iteratoriaus grąžinti baitai, kurie nebuvo srauto vartotojas neprašė, bus įrašyti į buferį iki kito skaitymo.
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); // ...
Srautai pateikia srauto metaduomenis per getMetadata()
metodą. Šis
metodas pateikia duomenis, kuriuos gautumėte iškvietę PHP
stream_get_meta_data() funkciją,
taip pat gali būti pateikiami kiti pasirinktiniai duomenys.
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
Naudojant srautų dekoratorius labai paprasta srautus papildyti pasirinktinėmis funkcijomis. "Guzzle" pateikia keletą integruotų dekoratorių, kurie suteikia papildomų srauto funkcijų.