Guzzle ir PSR-7

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

Antraštės

Tiek užklausos, tiek atsakymo pranešimuose yra HTTP antraštės.

Prieiga prie antraščių

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";
}

Sudėtinės antraštės

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.

Kūnas

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

Prašymai

Užklausos siunčiamos iš kliento į serverį. Užklausose nurodomas metodas taikomas ištekliui, ištekliaus identifikatorius ir protokolas. versija, kurią reikia naudoti.

Užklausų metodai

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ą.

GET
$client->get('http://httpbin.org/get', [/** options **/])
POST
$client->post('http://httpbin.org/post', [/** options **/])
HEAD
$client->head('http://httpbin.org/get', [/** options **/])
PUT
$client->put('http://httpbin.org/put', [/** options **/])
DELETE
$client->delete('http://httpbin.org/delete', [/** options **/])
GALIMYBĖS
$client->options('http://httpbin.org/get', [/** options **/])
PATCH
$client->patch('http://httpbin.org/put', [/** options **/])

Pavyzdžiui:

$response = $client->patch('http://httpbin.org/patch', ['body' => 'content']);

Užklausos URI

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

Schema

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

Šeimininkas

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

Port

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

Kelias

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 eilutė

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

Atsakymai - tai HTTP pranešimai, kuriuos klientas gauna iš serverio išsiuntęs HTTP užklausos pranešimą.

Pradžios eilutė

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

Body

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

Srautai

"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.

Srautų kūrimas

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

Metaduomenys

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

Stream Decorators

Naudojant srautų dekoratorius labai paprasta srautus papildyti pasirinktinėmis funkcijomis. "Guzzle" pateikia keletą integruotų dekoratorių, kurie suteikia papildomų srauto funkcijų.