Guzzle ja PSR-7

Guzzle käyttää PSR-7:ää HTTP-viestiliitäntänä. Tämän ansiosta Guzzle voi toimia minkä tahansa muun PSR-7-viestiliitäntöjä käyttävän kirjaston kanssa.

Guzzle on HTTP-asiakasohjelma, joka lähettää HTTP-pyyntöjä palvelimelle ja vastaanottaa HTTP-vastauksia. Sekä pyyntöjä että vastauksia kutsutaan viesteiksi.

Guzzle luottaa guzzlehttp/psr7 Composer-pakettiin PSR-7:n sanomatoteutuksessa.

Voit luoda pyynnön käyttämällä GuzzleHttp\Psr7\Request-luokkaa:

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

Voit luoda vastauksen käyttämällä GuzzleHttp\Psr7\Response-luokkaa:

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

Otsikot

Sekä pyyntö- että vastausviestit sisältävät HTTP-otsakkeita.

Pääsy otsikoihin

Voit tarkistaa, onko pyynnössä tai vastauksessa tietty otsake hasHeader() -menetelmällä.

use GuzzleHttp\Psr7;

$request = new Psr7\Request('GET', '/', ['X-Foo' => 'bar']);

if ($request->hasHeader('X-Foo')) {
    echo 'It is there';
}

Voit hakea kaikki otsikkoarvot merkkijonomassana käyttämällä getHeader().

$request->getHeader('X-Foo'); // ['bar']

// Retrieving a missing header returns an empty array.
$request->getHeader('X-Bar'); // []

Voit selata viestin otsikoita getHeaders()-menetelmällä.

foreach ($request->getHeaders() as $name => $values) {
    echo $name . ': ' . implode(', ', $values) . "\r\n";
}

Monimutkaiset otsikot

Jotkin otsikot sisältävät lisätietoa avain-arvoparista. Esimerkiksi Link-otsikot sisältävät linkin ja useita avainarvopareja:

<http://foo.com>; rel="thing"; type="image/jpeg"

Guzzle tarjoaa kätevän ominaisuuden, jota voidaan käyttää tällaisten otsikoiden jäsentämiseen:

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

Tulee ulos:

array (
  0 =>
  array (
    0 => '<http:/.../front.jpeg>',
    'rel' => 'front',
    'type' => 'image/jpeg',
  ),
)

Tulos sisältää avain-arvoparien hashin. Otsikon arvot, joilla ei ole avainta (eli linkki), indeksoidaan numeerisesti, kun taas otsikon osat, jotka muodostavat avaimen arvoparin muodostavat, lisätään avain-arvopareiksi.

Body

Sekä pyyntö- että vastausviestit voivat sisältää rungon.

Voit hakea viestin rungon getBody()-menetelmällä:

$response = GuzzleHttp\get('http://httpbin.org/get');
echo $response->getBody();
// JSON string: { ... }

Pyyntö- ja vastausobjekteissa käytettävä runko on muotoa Psr\Http\Message\StreamInterface. Tätä virtaa käytetään sekä tietojen lataamiseen ja tietojen lataamiseen. Guzzle tallentaa oletusarvoisesti rungon viestin runko virtaan, joka käyttää PHP:n tilapäisvirtoja. Kun rungon koko ylittää 2 Mt, virta siirtyy automaattisesti tallentamaan tiedot levylle. eikä muistiin (suojaten sovellusta muistin loppumiselta).

Helpoin tapa luoda viestin runko on käyttää streamFor metodia GuzzleHttp\Psr7\Utils luokasta -- Utils::streamFor. Tämä metodi hyväksyy merkkijonoja, resursseja, callables, iteraattoreita, muita streamables, ja palauttaa instanssin of Psr\Http\Message\StreamInterface.

Pyynnön tai vastauksen runko voidaan muuntaa merkkijonoksi tai voit lukea ja kirjoittaa tavuja virrasta tarpeen mukaan.

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

Pyynnöt

Pyynnöt lähetetään asiakkaalta palvelimelle. Pyynnöt sisältävät menetelmän jota sovelletaan resurssiin, resurssin tunniste ja protokolla. versio.

Pyyntömenetelmät

Pyyntöä luodessasi sinun odotetaan antavan haluamasi HTTP-menetelmän. suorittaa. Voit määrittää minkä tahansa haluamasi menetelmän, myös mukautetun menetelmän. joka ei ehkä ole osa RFC 7231:tä (kuten "MOVE").

// Create a request using a completely custom HTTP method
$request = new \GuzzleHttp\Psr7\Request('MOVE', 'http://httpbin.org/move');

echo $request->getMethod();
// MOVE

Voit luoda ja lähettää pyynnön käyttämällä asiakkaan metodeja, jotka vastaavat haluamaasi HTTP-menetelmää.

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

Esimerkiksi:

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

Pyynnön URI

Pyynnön URI:tä edustaa Psr\Http\Message\UriInterface -objekti. Guzzle tarjoaa tämän rajapinnan toteutuksen käyttäen komentoa GuzzleHttp\Psr7\Uri -luokkaa.

Kun luot pyynnön, voit antaa URI:n merkkijonona tai Psr\Http\Message\UriInterface -olion instanssina.

$response = $client->request('GET', 'http://httpbin.org/get?q=foo');

Scheme

Pyynnön järjestelmä järjestelmä määrittää protokollan, jota käytetään pyynnön lähettämisessä. Guzzlea käytettäessä scheme voidaan asettaa "http" tai "https".

$request = new Request('GET', 'http://httpbin.org');
echo $request->getUri()->getScheme(); // http
echo $request->getUri(); // http://httpbin.org

Isäntä

Isäntään pääsee käsiksi pyynnön omistaman URI:n avulla tai käyttämällä Host-otsikkoa.

$request = new Request('GET', 'http://httpbin.org');
echo $request->getUri()->getHost(); // httpbin.org
echo $request->getHeader('Host'); // httpbin.org

Satama

Porttia ei tarvita, kun käytetään "http"- tai "https"-järjestelyjä.

$request = new Request('GET', 'http://httpbin.org:8080');
echo $request->getUri()->getPort(); // 8080
echo $request->getUri(); // http://httpbin.org:8080

Path

Pyynnön polku on käytettävissä URI-objektin kautta.

$request = new Request('GET', 'http://httpbin.org/get');
echo $request->getUri()->getPath(); // /get

Polun sisältö suodatetaan automaattisesti sen varmistamiseksi, että vain polussa on vain sallittuja merkkejä. Kaikki merkit, jotka eivät ole sallittuja polussa, koodataan prosentuaalisesti seuraavien arvojen mukaisesti RFC 3986, kohta 3.3> mukaan.

Kyselymerkkijono

Pyynnön kyselymerkkijonoon pääsee käsiksi pyynnön omistaman URI-objektin getQuery() avulla.

$request = new Request('GET', 'http://httpbin.org/?foo=bar');
echo $request->getUri()->getQuery(); // foo=bar

Kyselymerkkijonon sisältö suodatetaan automaattisesti sen varmistamiseksi, että että kyselymerkkijonossa on vain sallittuja merkkejä. Kaikki merkit, jotka eivät ole sallittuja kyselymerkkijonossa, koodataan prosentuaalisesti seuraavien arvojen mukaisesti RFC 3986, kohta 3.4 mukaan.

Vastaukset

Vastaukset ovat HTTP-viestejä, jotka asiakas saa palvelimelta HTTP-pyyntösanoman lähettämisen jälkeen.

Aloituslinja

Vastauksen alkuosa sisältää protokollan ja protokollaversion, tilakoodin ja syylausekkeen.

$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

Kuten aiemmin kuvattiin, voit saada vastauksen rungon getBody()-menetelmällä.

$body = $response->getBody();
echo $body;
// Cast to a string: { ... }
$body->seek(0);
// Rewind the body
$body->read(1024);
// Read bytes of the body

Virrat

Guzzle käyttää PSR-7-virtaobjekteja pyyntö- ja vastausviestien esittämiseen. rungot. Näiden stream-objektien avulla voit työskennellä erityyppisten tietojen kanssa kaikki käyttäen yhteistä rajapintaa.

HTTP-viestit koostuvat aloitusrivistä, otsikoista ja rungosta. HTTP-viestin runko voi olla hyvin pieni tai erittäin suuri. Yritys esittää runko viestin merkkijonona voi helposti kuluttaa enemmän muistia kuin on tarkoitus, koska runko on tallennettava kokonaan muistiin. Yritys tallentaa viestin runko pyynnön tai vastauksen tallentaminen muistiin estäisi kyseisen toteutuksen käyttämisen alkaen pystyä käsittelemään suuria viestirunkoja. StreamInterfacea käytetään jotta voidaan piilottaa toteutuksen yksityiskohdat siitä, mistä tietovirta luetaan. tai mihin kirjoitetaan.

PSR-7 Psr\Http\Message\StreamInterface paljastaa useita metodeja, jotka mahdollistavat virtojen tehokkaan lukemisen, kirjoittamisen ja läpikäymisen.

Virrat paljastavat ominaisuutensa kolmella menetelmällä: isReadable(), isWritable() ja isSeekable(). Näitä metodeja voi käyttää stream yhteistyökumppanit määrittämään, pystyykö virta täyttämään heidän vaatimuksensa.

Kullakin stream-instanssilla on erilaisia ominaisuuksia: ne voivat olla vain lukukäyttöön tarkoitettuja, vain kirjoittaa, lukea-kirjoittaa, sallia mielivaltaisen satunnaiskäytön (etsimällä eteenpäin tai taaksepäin mihin tahansa paikkaan), tai sallia vain peräkkäisen käytön (esim. socketin tai putken tapauksessa).

Guzzle käyttää guzzlehttp/psr7 -pakettia tarjotakseen stream-tuen. Lisää tietoa virtojen käytöstä, virtojen luomisesta, virtojen muuntamisesta PHP:ksi. stream-resurssiksi, ja stream-koristeista löytyy dokumentista Guzzle PSR-7 -dokumentaatiosta.

Virtojen luominen

Paras tapa luoda virta on käyttää GuzzleHttp\Psr7\Utils::streamFor metodia. Tämä metodi hyväksyy merkkijonoja, resursseja, jotka on palautettu fopen(), objektin, joka toteuttaa __toString(), iteraattoreita, kutsuttavia ja instansseja. 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

Voit luoda virtoja iteraattoreista. Iteraattori voi tuottaa minkä tahansa määrän tavua per iteraatio. Kaikki iteraattorin palauttamat ylimääräiset tavut, jotka eivät olleet virran kuluttaja ei ole pyytänyt, puskuroidaan seuraavaan lukukertaan asti.

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

Metatiedot

Virrat paljastavat virran metatiedot getMetadata() -menetelmän avulla. Tämä metodi tarjoaa tiedot, jotka haetaan kutsuttaessa PHP:n metodia nimeltä stream_get_meta_data()-funktiota, ja voi valinnaisesti antaa muita mukautettuja tietoja.

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

Mukautetun toiminnallisuuden lisääminen virtoihin on hyvin yksinkertaista stream-koristeiden avulla. Guzzle tarjoaa useita sisäänrakennettuja koristeaineita, jotka tarjoavat lisävirran toiminnallisuutta.