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);
Sekä pyyntö- että vastausviestit sisältävät HTTP-otsakkeita.
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";
}
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.
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 lähetetään asiakkaalta palvelimelle. Pyynnöt sisältävät menetelmän jota sovelletaan resurssiin, resurssin tunniste ja protokolla. versio.
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ää.
$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 **/])
Esimerkiksi:
$response = $client->patch('http://httpbin.org/patch', ['body' => 'content']);
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');
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ää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
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
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.
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 ovat HTTP-viestejä, jotka asiakas saa palvelimelta HTTP-pyyntösanoman lähettämisen jälkeen.
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
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
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.
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); // ...
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
Mukautetun toiminnallisuuden lisääminen virtoihin on hyvin yksinkertaista stream-koristeiden avulla. Guzzle tarjoaa useita sisäänrakennettuja koristeaineita, jotka tarjoavat lisävirran toiminnallisuutta.