Guzzle un PSR-7

Guzzle izmanto PSR-7 kā HTTP ziņojumu saskarni. Tas ļauj Guzzle strādāt ar jebkuru citu bibliotēku, kas izmanto PSR-7 ziņojumu saskarnes.

Guzzle ir HTTP klients, kas sūta HTTP pieprasījumus serverim un saņem HTTP atbildes. Gan pieprasījumus, gan atbildes sauc par ziņojumiem.

Guzzle paļaujas uz guzzlehttp/psr7 Composer paketi PSR-7 ziņojumu implementācijai.

Pieprasījumu var izveidot, izmantojot GuzzleHttp\Psr7\Request klasi:

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

Atbildi var izveidot, izmantojot GuzzleHttp\Psr7\Response klasi:

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

Virsraksti

Gan pieprasījuma, gan atbildes ziņojumos ir HTTP galvenes.

Piekļuve galvenēm

Varat pārbaudīt, vai pieprasījumam vai atbildei ir noteikta galvene, izmantojot hasHeader() metodi.

use GuzzleHttp\Psr7;

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

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

Visas galvenes vērtības var iegūt kā virkņu masīvu, izmantojot getHeader().

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

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

Ziņojuma galvenes var pārlūkot, izmantojot getHeaders() metodi.

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

Kompleksie virsraksti

Dažās galvenēs ir papildu informācija par atslēgu un vērtību pāriem. Piemēram, saite galvenēs ir saite un vairāki atslēgu vērtību pāri:

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

Guzzle nodrošina ērtu funkciju, ko var izmantot, lai analizētu šāda veida galvenes:

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

Būs produkcija:

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

Rezultātā tiek iegūts atslēgu un vērtību pāru hash. Header vērtības, kurām nav atslēgas (t. i., saite), tiek indeksētas skaitliski, bet galvenes daļas, kas veido atslēgu, tiek indeksētas skaitliski. vērtību pāri, tiek pievienotas kā atslēgas un vērtības pāri.

Virsraksts

Gan pieprasījuma, gan atbildes ziņojums var saturēt ķermeni.

Ziņojuma tekstu var iegūt, izmantojot getBody() metodi:

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

Pieprasījuma un atbildes objektos izmantotais ķermenis ir Psr\Http\Message\StreamInterface. Šo plūsmu izmanto gan datu augšupielādei un datu lejupielādei. Guzzle pēc noklusējuma saglabās straumju ķermeni plūsmā, kas izmanto PHP pagaidu plūsmas. Kad ķermeņa lielums pārsniedz 2 MB, plūsma automātiski pārslēgsies uz datu glabāšanu diskā. nevis atmiņā (pasargājot lietojumprogrammu no atmiņas izsmelšanas).

Visvienkāršākais veids, kā izveidot ziņojuma ķermeni, ir izmantot streamFor metodi no GuzzleHttp\Psr7\Utils klases -- Utils::streamFor. Šī metode pieņem virknes, resursus, un iteratorus, citus streamables, un atdod instance of Psr\Http\Message\StreamInterface.

Pieprasījuma vai atbildes tekstu var pārvērst virknē vai pēc vajadzības lasīt un rakstīt baitus no plūsmas.

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

Pieprasījumi

Pieprasījumi tiek nosūtīti no klienta uz serveri. Pieprasījumi ietver metodi resursam piemērojamo metodi, resursa identifikatoru un protokolu. izmantojamā protokola versiju.

Pieprasījuma metodes

Veidojot pieprasījumu, ir jānorāda vēlamā HTTP metode. izpildīt. Varat norādīt jebkuru vēlamo metodi, tostarp pielāgotu metodi. kas var nebūt iekļauta RFC 7231 (piemēram, "MOVE").

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

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

Varat izveidot un nosūtīt pieprasījumu, izmantojot klienta metodes, kas atbilst HTTP metodei, kuru vēlaties izmantot.

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 **/])
OPTIONS
$client->options('http://httpbin.org/get', [/** options **/])
PATCH
$client->patch('http://httpbin.org/put', [/** options **/])

Piemēram:

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

Pieprasījuma URI

Pieprasījuma URI tiek attēlots ar Psr\Http\Message\UriInterface objektu. Guzzle nodrošina šīs saskarnes implementāciju, izmantojot objektu GuzzleHttp\Psr7\Uri klasi.

Veidojot pieprasījumu, URI var norādīt kā virkni vai Psr\Http\Message\UriInterface gadījumu.

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

Shēma

Pieprasījuma shēma norāda protokolu, kas jāizmanto, nosūtot pieprasījumu. Izmantojot Guzzle shēmu var iestatīt kā "http" vai "https".

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

Saimnieks

Saimnieks ir pieejams, izmantojot pieprasījumam piederošo URI vai piekļūstot Host galvenei.

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

Port

Izmantojot shēmas "http" vai "https", nav nepieciešams ports.

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

Ceļš

Pieprasījuma ceļš ir pieejams, izmantojot URI objektu.

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

Ceļa saturs tiks automātiski filtrēts, lai nodrošinātu, ka tikai ceļā ir tikai atļautās rakstzīmes. Jebkuras neatļautas rakstzīmes ceļā tiks procentuāli kodētas saskaņā ar RFC 3986 3.3. sadaļa.

Vaicājumu virkne

Pieprasījuma vaicājuma rindai var piekļūt, izmantojot getQuery() no URI objekta, kam pieder pieprasījums.

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

Pieprasījuma virknes saturs tiks automātiski filtrēts, lai nodrošinātu, ka vaicājuma rindā ir tikai atļautās rakstzīmes. Jebkuras rakstzīmes, kas nav atļautas vaicājuma virknē, tiks procentuāli kodētas saskaņā ar RFC 3986 3.4. sadaļa.

Atbildes

Atbildes ir HTTP ziņojumi, ko klients saņem no servera pēc HTTP pieprasījuma ziņojuma nosūtīšanas.

Sākuma rinda

Atbildes sākuma rindā ir norādīts protokols un protokola versija, statusa kods un iemesla frāze.

$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

Kā aprakstīts iepriekš, atbildes ķermeni var iegūt, izmantojot getBody() metodi.

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

Straumes

Guzzle izmanto PSR-7 plūsmas objektus, lai attēlotu pieprasījuma un atbildes ziņojumu. korpusus. Šie plūsmas objekti ļauj strādāt ar dažādiem datu veidiem. izmantojot vienotu saskarni.

HTTP ziņojumus veido sākuma rinda, galvenes un saturs. HTTP var būt ļoti mazs vai ļoti liels. Mēģinājums atveidot tekstu ziņojumu kā virkni, var viegli patērēt vairāk atmiņas, nekā paredzēts, jo ķermenis pilnībā jāuzglabā atmiņā. Mēģinājums saglabāt ziņojuma ķermeni vai atbildes pieprasījumu vai atbildi atmiņā neļautu izmantot šo implementāciju no iespēju strādāt ar lieliem ziņojumu korpusiem. StreamInterface tiek izmantota lai paslēptu implementācijas detaļas par to, no kurienes tiek nolasīta datu plūsma. vai uz kuru tiek rakstīts.

PSR-7 Psr\Http\Message\StreamInterface piedāvā vairākas metodes, kas ļauj efektīvi lasīt, rakstīt un pārlūkot plūsmas.

Straumes savas iespējas atklāj, izmantojot trīs metodes: isReadable(), isWritable() un isSeekable(). Šīs metodes var izmantot plūsmā lai noteiktu, vai plūsma spēj izpildīt to prasības.

Katrai plūsmas instancei ir dažādas iespējas: tās var būt tikai lasāmās, tikai rakstīšanai, lasīšanai un rakstīšanai, ļaut patvaļīgu nejaušu piekļuvi (meklējot uz priekšu vai atpakaļ uz jebkuru atrašanās vietu) vai atļaut tikai secīgu piekļuvi (piem. ligzdas vai caurules gadījumā).

Guzzle izmanto guzzlehttp/psr7 paketi, lai nodrošinātu straumju atbalstu. Vairāk informāciju par plūsmu lietošanu, plūsmu izveidi, plūsmu konvertēšanu uz PHP plūsmu resursus un plūsmu dekoratorus var atrast sadaļā Guzzle PSR-7 dokumentācijā.

Straumju veidošana

Labākais veids, kā izveidot straumi, ir izmantot GuzzleHttp\Psr7\Utils::streamFor metodi. Šī metode pieņem virknes, resursus, kas atgriežas no fopen(), objektu, kas implementē __toString(), iteratorus, callables un instances. 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

No iteratoriem var izveidot plūsmas. Iterators var dot jebkuru skaitu baitu vienā iterācijā. Jebkurš liekais iteratora atdotais baits, kas nebija pieprasījis plūsmas patērētājs, tiks buferizēti līdz nākamajai lasīšanai.

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

Metadati

Straumes atklāj plūsmas metadatus, izmantojot getMetadata() metodi. Šī metode nodrošina datus, kurus jūs iegūtu, izsaucot PHP stream_get_meta_data() funkciju, un pēc izvēles var atklāt citus pielāgotus datus.

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

Straumes dekoratori

Izmantojot plūsmu dekoratorus, ir ļoti vienkārši pievienot plūsmām pielāgotu funkcionalitāti. Guzzle nodrošina vairākus iebūvētos dekoratorus, kas nodrošina papildu plūsmas funkcionalitāti.