Tato stránka obsahuje stručný úvod do systému Guzzle a úvodní příklady. Pokud jste ještě Guzzle nenainstalovali, přejděte na stránku Instalace na stránku.
Požadavky můžete pomocí Guzzle odesílat pomocí objektu GuzzleHttp\ClientInterface
.
use GuzzleHttp\Client;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://httpbin.org',
// You can set any number of default request options.
'timeout' => 2.0,
]);
Klienti jsou v systému Guzzle neměnní, což znamená, že výchozí hodnoty používané klientem nelze po jeho vytvoření změnit.
Konstruktor klienta přijímá asociativní pole možností:
base_uri
(string|UriInterface) Základní URI klienta, který je sloučen do relativního. URI. Může to být řetězec nebo instance UriInterface. Když relativní URI je klientovi poskytnuto základní URI, klient spojí základní URI s URI relativním URI podle pravidel popsaných v části RFC 3986, sekce 5.2
// Vytvoření klienta se základním URI.
$client = new GuzzleHttp\Client(['base_uri' => 'https://foo.com/api/']);
// Odeslání požadavku na adresu https://foo.com/api/test
$response = $client->request('GET', 'test');
// Odeslání požadavku na adresu https://foo.com/root
$response = $client->request('GET', '/root');
Nechce se vám číst RFC 3986? Zde je několik rychlých příkladů, jak se base_uri
překládá pomocí jiného URI.
base_uri | URI | Výsledek |
---|---|---|
http://foo.com |
/bar |
http://foo.com/bar |
http://foo.com/foo |
/bar |
http://foo.com/bar |
http://foo.com/foo |
bar |
http://foo.com/bar |
http://foo.com/foo/ |
bar |
http://foo.com/foo/bar |
http://foo.com |
http://baz.com |
http://baz.com |
http://foo.com/?bar |
bar |
http://foo.com/bar |
handler
Psr7\Http\Message\RequestInterface
a pole
možností přenosu a musí vrátit
GuzzleHttp\Promise\PromiseInterface
, který je splněn pomocí funkce
Psr7\Http\Message\ResponseInterface
při úspěchu....
Magické metody na klientovi usnadňují odesílání synchronních požadavků:
$response = $client->get('http://httpbin.org/get');
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');
Můžete vytvořit požadavek a poté jej odeslat spolu s klientem, až budete připraveni:
use GuzzleHttp\Psr7\Request;
$request = new Request('PUT', 'http://httpbin.org/put');
$response = $client->send($request, ['timeout' => 2]);
Klientské objekty poskytují velkou flexibilitu v tom, jak jsou požadavky včetně výchozích možností přenosu požadavků, výchozího middlewaru zásobníku obsluhy které jsou použity pro každý požadavek, a základního URI, který umožňuje odesílat požadavky. s relativními URI.
Více informací o klientském middlewaru najdete na stránce Handlery a middleware dokumentace.
Asynchronní požadavky můžete odesílat pomocí magických metod poskytovaných klientem:
$promise = $client->getAsync('http://httpbin.org/get');
$promise = $client->deleteAsync('http://httpbin.org/delete');
$promise = $client->headAsync('http://httpbin.org/get');
$promise = $client->optionsAsync('http://httpbin.org/get');
$promise = $client->patchAsync('http://httpbin.org/patch');
$promise = $client->postAsync('http://httpbin.org/post');
$promise = $client->putAsync('http://httpbin.org/put');
Můžete také použít metody sendAsync() a requestAsync() klienta:
use GuzzleHttp\Psr7\Request;
// Create a PSR-7 request object to send
$headers = ['X-Foo' => 'Bar'];
$body = 'Hello!';
$request = new Request('HEAD', 'http://httpbin.org/head', $headers, $body);
$promise = $client->sendAsync($request);
// Or, if you don't need to pass in a request instance:
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
Příslib vrácený těmito metodami implementuje funkci
specifikaci Promises/A+, kterou poskytuje nástroj
Guzzle promises library. To znamená, že
že můžete řetězit then()
volání ze slibu. Tato volání then jsou
buď splněny úspěšným Psr\Http\Message\ResponseInterface
nebo
odmítnuta s výjimkou.
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\RequestException;
$promise = $client->requestAsync('GET', 'http://httpbin.org/get');
$promise->then(
function (ResponseInterface $res) {
echo $res->getStatusCode() . "\n";
},
function (RequestException $e) {
echo $e->getMessage() . "\n";
echo $e->getRequest()->getMethod();
}
);
Pomocí slibů a asynchronních požadavků můžete odesílat více požadavků současně.
use GuzzleHttp\Client;
use GuzzleHttp\Promise;
$client = new Client(['base_uri' => 'http://httpbin.org/']);
// Initiate each request but do not block
$promises = [
'image' => $client->getAsync('/image'),
'png' => $client->getAsync('/image/png'),
'jpeg' => $client->getAsync('/image/jpeg'),
'webp' => $client->getAsync('/image/webp')
];
// Wait for the requests to complete; throws a ConnectException
// if any of the requests fail
$responses = Promise\Utils::unwrap($promises);
// You can access each response using the key of the promise
echo $responses['image']->getHeader('Content-Length')[0];
echo $responses['png']->getHeader('Content-Length')[0];
// Wait for the requests to complete, even if some of them fail
$responses = Promise\Utils::settle($promises)->wait();
// Values returned above are wrapped in an array with 2 keys: "state" (either fulfilled or rejected) and "value" (contains the response)
echo $responses['image']['state']; // returns "fulfilled"
echo $responses['image']['value']->getHeader('Content-Length')[0];
echo $responses['png']['value']->getHeader('Content-Length')[0];
Objekt GuzzleHttp\Pool
můžete použít, pokud chcete odeslat neurčité množství požadavků.
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
$client = new Client();
$requests = function ($total) {
$uri = 'http://127.0.0.1:8126/guzzle-server/perf';
for ($i = 0; $i < $total; $i++) {
yield new Request('GET', $uri);
}
};
$pool = new Pool($client, $requests(100), [
'concurrency' => 5,
'fulfilled' => function (Response $response, $index) {
// this is delivered each successful response
},
'rejected' => function (RequestException $reason, $index) {
// this is delivered each failed request
},
]);
// Initiate the transfers and create a promise
$promise = $pool->promise();
// Force the pool of requests to complete.
$promise->wait();
Nebo pomocí uzávěru, který vrátí slib, jakmile fond zavolá uzávěr.
$client = new Client();
$requests = function ($total) use ($client) {
$uri = 'http://127.0.0.1:8126/guzzle-server/perf';
for ($i = 0; $i < $total; $i++) {
yield function() use ($client, $uri) {
return $client->getAsync($uri);
};
}
};
$pool = new Pool($client, $requests(100));
V předchozích příkladech jsme načítali proměnnou $response
nebo jsme byli
byla doručena odpověď ze slibu. Objekt response implementuje PSR-7
response, Psr\Http\Message\ResponseInterface
, a obsahuje spoustu prvků.
užitečných informací.
Můžete získat stavový kód a důvodovou frázi odpovědi:
$code = $response->getStatusCode(); // 200
$reason = $response->getReasonPhrase(); // OK
Z odpovědi můžete načíst hlavičky:
// Check if a header exists.
if ($response->hasHeader('Content-Length')) {
echo "It exists";
}
// Get a header from the response.
echo $response->getHeader('Content-Length')[0];
// Get all of the response headers.
foreach ($response->getHeaders() as $name => $values) {
echo $name . ': ' . implode(', ', $values) . "\r\n";
}
Tělo odpovědi lze získat pomocí metody getBody
. Tělo lze použít jako řetězec, převést na řetězec nebo použít jako objekt typu stream.
$body = $response->getBody();
// Implicitly cast the body to a string and echo it
echo $body;
// Explicitly cast the body to a string
$stringBody = (string) $body;
// Read 10 bytes from the body
$tenBytes = $body->read(10);
// Read the remaining contents of the body as a string
$remainingBytes = $body->getContents();
Parametry řetězce dotazu můžete zadat několika způsoby.
V URI požadavku můžete nastavit parametry řetězce dotazu:
$response = $client->request('GET', 'http://httpbin.org?foo=bar');
Parametry řetězce dotazu můžete zadat pomocí možnosti požadavku query
jako pole.
$client->request('GET', 'http://httpbin.org', [
'query' => ['foo' => 'bar']
]);
Poskytnutí možnosti jako pole použije k formátování řetězce dotazu funkci PHP http_build_query
.
A nakonec můžete zadat možnost požadavku query
jako řetězec.
$client->request('GET', 'http://httpbin.org', ['query' => 'foo=bar']);
Služba Guzzle nabízí několik způsobů nahrávání dat.
Požadavky, které obsahují proud dat, můžete odeslat předáním řetězce,
zdroj vrácený z fopen
, nebo instanci
Psr\Http\Message\StreamInterface
k možnosti body
požadavku.
use GuzzleHttp\Psr7;
// Provide the body as a string.
$r = $client->request('POST', 'http://httpbin.org/post', [
'body' => 'raw data'
]);
// Provide an fopen resource.
$body = Psr7\Utils::tryFopen('/path/to/file', 'r');
$r = $client->request('POST', 'http://httpbin.org/post', ['body' => $body]);
// Use the Utils::streamFor method to create a PSR-7 stream.
$body = Psr7\Utils::streamFor('hello!');
$r = $client->request('POST', 'http://httpbin.org/post', ['body' => $body]);
Jednoduchý způsob, jak nahrát data JSON a nastavit příslušnou hlavičku, je použití možnosti požadavku json
:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
Kromě zadání surových dat požadavku pomocí možnosti body
požadavku poskytuje Guzzle užitečné abstrakce pro odesílání dat POST.
Odesílání application/x-www-form-urlencoded
POST požadavků vyžaduje zadání POST polí jako pole v form_params
možnostech požadavku.
$response = $client->request('POST', 'http://httpbin.org/post', [
'form_params' => [
'field_name' => 'abc',
'other_field' => '123',
'nested_field' => [
'nested' => 'hello'
]
]
]);
Spolu s formulářem můžete odeslat soubory (multipart/form-data
POST požadavky),
pomocí možnosti multipart
request. multipart
přijímá pole typu
asociativních polí, kde každé asociativní pole obsahuje následující klíče:
Psr\Http\Message\StreamInterface
pro streamování
z proudu PSR-7.use GuzzleHttp\Psr7;
$response = $client->request('POST', 'http://httpbin.org/post', [
'multipart' => [
[
'name' => 'field_name',
'contents' => 'abc'
],
[
'name' => 'file_name',
'contents' => Psr7\Utils::tryFopen('/path/to/file', 'r')
],
[
'name' => 'other_file',
'contents' => 'hello',
'filename' => 'filename.txt',
'headers' => [
'X-Foo' => 'this is an extra header to include'
]
]
]
]);
Aplikace Guzzle může udržovat relaci souborů cookie za vás, pokud k tomu dostanete pokyn pomocí příkazu
cookies
možnost požadavku. Při odesílání požadavku se použije možnost cookies
.
musí být nastavena na instanci GuzzleHttp\Cookie\CookieJarInterface
.
// Use a specific cookie jar
$jar = new \GuzzleHttp\Cookie\CookieJar;
$r = $client->request('GET', 'http://httpbin.org/cookies', [
'cookies' => $jar
]);
Pokud chcete používat sdílenou nádobu se soubory cookie pro všechny požadavky, můžete v konstruktoru klienta nastavit hodnotu cookies
na true
.
// Use a shared client cookie jar
$client = new \GuzzleHttp\Client(['cookies' => true]);
$r = $client->request('GET', 'http://httpbin.org/cookies');
Pro rozhraní GuzzleHttp\Cookie\CookieJarInterface
existují různé implementace:
GuzzleHttp\Cookie\CookieJar
ukládá cookies jako pole.GuzzleHttp\Cookie\FileCookieJar
uchovává soubory cookie, které nejsou soubory relací.
pomocí souboru ve formátu JSON.GuzzleHttp\Cookie\SessionCookieJar
uchovává soubory cookie v databázi.
klientské relaci.Soubory cookie můžete ručně nastavit do nádoby na soubory cookie pomocí pojmenovaného konstruktoru fromArray(array $cookies, $domain)
.
$jar = \GuzzleHttp\Cookie\CookieJar::fromArray(
[
'some_cookie' => 'foo',
'other_cookie' => 'barbaz1234'
],
'example.org'
);
Soubor cookie můžete získat podle jeho názvu pomocí metody getCookieByName($name)
, která vrátí instanci GuzzleHttp\Cookie\SetCookie
.
$cookie = $jar->getCookieByName('some_cookie');
$cookie->getValue(); // 'foo'
$cookie->getDomain(); // 'example.org'
$cookie->getExpires(); // expiration date as a Unix timestamp
Cookies lze také načíst do pole díky metodě toArray().
Rozhraní GuzzleHttp\Cookie\CookieJarInterface
rozšiřuje rozhraní
Traversable
, takže jej lze iterovat v cyklu foreach.
Guzzle bude automaticky sledovat přesměrování, pokud mu neřeknete, aby to nedělal. Chování přesměrování můžete upravit pomocí volby allow_redirects
request.
true
pro povolení normálních přesměrování s maximálním počtem 5.
přesměrování. Toto je výchozí nastavení.false
pro vypnutí přesměrování.$response = $client->request('GET', 'http://github.com');
echo $response->getStatusCode();
// 200
Následující příklad ukazuje, že přesměrování lze zakázat.
$response = $client->request('GET', 'http://github.com', [
'allow_redirects' => false
]);
echo $response->getStatusCode();
// 301
Zobrazení stromu
Následující stromové zobrazení popisuje vzájemnou závislost výjimek Guzzle.
. \RuntimeException
└── TransferException (implements GuzzleException)
├── ConnectException (implements NetworkExceptionInterface)
└── RequestException
├── BadResponseException
│ ├── ServerException
│ └── ClientException
└── TooManyRedirectsException
Guzzle vyhodí výjimky pro chyby, které se vyskytnou během přenosu.
V příkazu GuzzleHttp\Exception\ConnectException je vyhodnocena výjimka GuzzleHttp\Exception\ConnectException
.
v případě chyby při připojení k síti. Tato výjimka se rozšiřuje z
GuzzleHttp\Exception\TransferException
.
Je vyhozena GuzzleHttp\Exception\ClientException
pro 400.
úrovně, pokud je volba http_errors
požadavku nastavena na true. Toto
se rozšiřuje z GuzzleHttp\Exception\BadResponseException
a
GuzzleHttp\Exception\BadResponseException
rozšiřuje z
GuzzleHttp\Exception\RequestException
.
use GuzzleHttp\Psr7;
use GuzzleHttp\Exception\ClientException;
try {
$client->request('GET', 'https://github.com/_abc_123_404');
} catch (ClientException $e) {
echo Psr7\Message::toString($e->getRequest());
echo Psr7\Message::toString($e->getResponse());
}
Pro úroveň 500 je vyhozena GuzzleHttp\Exception\ServerException
.
pokud je volba http_errors
požadavku nastavena na true. Toto
se rozšiřuje z GuzzleHttp\Exception\BadResponseException
.
Výjimka GuzzleHttp\Exception\TooManyRedirectsException
se vyhodí, když je příliš mnoho adres.
následuje příliš mnoho přesměrování. Tato výjimka se rozšiřuje z GuzzleHttp\Exception\RequestException
.
Všechny výše uvedené výjimky vycházejí z GuzzleHttp\Exception\TransferException
.
Guzzle nabízí několik proměnných prostředí, které lze použít k přizpůsobení chování knihovny.
GUZZLE_CURL_SELECT_TIMEOUT
curl_multi_select()
. Některé systémy
mají problémy s implementací curl_multi_select()
v jazyce PHP, kdy
volání této funkce má vždy za následek čekání na maximální dobu trvání funkce.
timeoutu.HTTP_PROXY
Definuje proxy server, který se použije při odesílání požadavků pomocí protokolu "http"
Poznámka: protože proměnná HTTP_PROXY může v některých prostředích (CGI) obsahovat libovolný uživatelský vstup, používá se tato proměnná pouze v CLI SAPI. Více informací naleznete v https://httpoxy.org.
HTTPS_PROXY
NO_PROXY
Guzzle může při konfiguraci klientů využívat nastavení PHP ini.
openssl.cafile