Тази страница съдържа кратко въведение в Guzzle и въвеждащи примери. Ако все още не сте инсталирали Guzzle, посетете Инсталация страница.
Можете да изпращате заявки с Guzzle, като използвате обект 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,
]);
Клиентите са неизменни в Guzzle, което означава, че не можете да променяте настройките по подразбиране, използвани от даден клиент, след като е създаден.
Конструкторът на клиента приема асоциативен масив от опции:
base_uri(string|UriInterface) Базов URI на клиента, който се обединява в относителен URI. Може да бъде низ или инстанция на UriInterface. Когато относителен URI се предоставя на клиент, клиентът ще комбинира базовия URI с относителния URI, като използва правилата, описани в RFC 3986, раздел 5.2.
// Създаване на клиент с базов URI
$client = new GuzzleHttp\Client(['base_uri' => 'https://foo.com/api/']);
// Изпращане на заявка до https://foo.com/api/test
$response = $client->request('GET', 'test');
// Изпращане на заявка до https://foo.com/root
$response = $client->request('GET', '/root');
Не ви се иска да четете RFC 3986? Ето няколко бързи примера за това как един base_uri се разрешава с друг URI.
| base_uri | URI | Резултат |
|---|---|---|
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 |
handlerPsr7\Http\Message\RequestInterface и масив
от опции за прехвърляне и трябва да върне
GuzzleHttp\Promise\PromiseInterface, който се изпълнява с
Psr7\Http\Message\ResponseInterface при успех....Магическите методи в клиента улесняват изпращането на синхронни заявки:
$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');
Можете да създадете заявка и след това да я изпратите заедно с клиента, когато сте готови:
use GuzzleHttp\Psr7\Request;
$request = new Request('PUT', 'http://httpbin.org/put');
$response = $client->send($request, ['timeout' => 2]);
Клиентските обекти осигуряват голяма гъвкавост по отношение на начина, по който се включително опции за заявки по подразбиране, междинно оборудване за обработка на заявки по подразбиране които се използват от всяка заявка, и базов URI, който ви позволява да изпращате заявки с относителни URI.
Можете да научите повече за клиентския междинен софтуер в Handlers and Middleware страницата на документацията.
Можете да изпращате асинхронни заявки, като използвате магическите методи, предоставени от клиента:
$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');
Можете също така да използвате методите sendAsync() и requestAsync() на клиента:
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');
Обещанието, върнато от тези методи, реализира
Promises/A+ spec, предоставен от
Guzzle promises library. Това означава, че
че можете да свързвате then() повиквания от обещанието. Тези извиквания then са
или се изпълняват с успешно Psr\Http\Message\ResponseInterface или
отхвърлени с изключение.
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();
}
);
Можете да изпращате няколко заявки едновременно, като използвате обещания и асинхронни заявки.
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];
Можете да използвате обекта GuzzleHttp\Pool, когато имате неопределено количество заявки, които искате да изпратите.
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();
Или да използвате затваряне, което ще върне обещание, след като басейнът извика затварянето.
$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));
В предишните примери извличахме променлива $response или бяхме
получихме отговор от обещание. Обектът на отговора имплементира PSR-7
отговор, Psr\Http\Message\ResponseInterface, и съдържа много
полезна информация.
Можете да получите кода на състоянието и фразата за причина на отговора:
$code = $response->getStatusCode(); // 200
$reason = $response->getReasonPhrase(); // OK
Можете да извличате заглавия от отговора:
// 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";
}
Тялото на отговора може да бъде извлечено чрез метода getBody. Тялото може да се използва като низ, да се превърне в низ или да се използва като обект, подобен на поток.
$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();
Можете да предоставите параметри на заявката по няколко начина.
Можете да зададете параметри на низ от заявки в URI на заявката:
$response = $client->request('GET', 'http://httpbin.org?foo=bar');
Можете да зададете параметрите на низа на заявката, като използвате опцията за заявка query като масив.
$client->request('GET', 'http://httpbin.org', [
'query' => ['foo' => 'bar']
]);
Предоставянето на опцията като масив ще използва функцията на PHP http_build_query за форматиране на заявката.
И накрая, можете да предоставите опцията за заявка query като низ.
$client->request('GET', 'http://httpbin.org', ['query' => 'foo=bar']);
Guzzle предоставя няколко метода за качване на данни.
Можете да изпращате заявки, които съдържат поток от данни, като предавате низ,
ресурс, върнат от fopen, или инстанция на
Psr\Http\Message\StreamInterface към опцията body на заявката.
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]);
Лесен начин за качване на JSON данни и задаване на подходящ хедър е използването на опцията за заявка json:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
В допълнение към задаването на необработените данни на заявката с помощта на опцията за заявка body, Guzzle предоставя полезни абстракции за изпращане на POST данни.
Изпращането на application/x-www-form-urlencoded POST заявки изисква да зададете POST полетата като масив в form_params опциите на заявката.
$response = $client->request('POST', 'http://httpbin.org/post', [
'form_params' => [
'field_name' => 'abc',
'other_field' => '123',
'nested_field' => [
'nested' => 'hello'
]
]
]);
Можете да изпращате файлове заедно с формуляр (multipart/form-data POST заявки),
като използвате опцията multipart за заявка. multipart приема масив от
асоциативни масиви, като всеки асоциативен масив съдържа следните ключове:
Psr\Http\Message\StreamInterface за поточно предаване на съдържанието
съдържанието от поток 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'
]
]
]
]);
Guzzle може да поддържа сесия с бисквитки за вас, ако сте инструктирани с помощта на
cookies опция за заявка. Когато изпращате заявка, опцията cookies
трябва да бъде зададена като инстанция на GuzzleHttp\Cookie\CookieJarInterface.
// Use a specific cookie jar
$jar = new \GuzzleHttp\Cookie\CookieJar;
$r = $client->request('GET', 'http://httpbin.org/cookies', [
'cookies' => $jar
]);
Можете да зададете cookies на true в конструктора на клиента, ако искате да използвате общ буркан с бисквитки за всички заявки.
// Use a shared client cookie jar
$client = new \GuzzleHttp\Client(['cookies' => true]);
$r = $client->request('GET', 'http://httpbin.org/cookies');
Съществуват различни имплементации за GuzzleHttp\Cookie\CookieJarInterface :
GuzzleHttp\Cookie\CookieJar съхранява бисквитките като масив.GuzzleHttp\Cookie\FileCookieJar запазва бисквитките, които не са от сесията.
с помощта на файл, форматиран в JSON.GuzzleHttp\Cookie\SessionCookieJar запазва бисквитките в
сесията на клиента.Можете ръчно да зададете "бисквитки" в буркан за "бисквитки" с именувания конструктор fromArray(array $cookies, $domain).
$jar = \GuzzleHttp\Cookie\CookieJar::fromArray(
[
'some_cookie' => 'foo',
'other_cookie' => 'barbaz1234'
],
'example.org'
);
Можете да получите бисквитка по нейното име с метода getCookieByName($name), който връща GuzzleHttp\Cookie\SetCookie инстанция.
$cookie = $jar->getCookieByName('some_cookie');
$cookie->getValue(); // 'foo'
$cookie->getDomain(); // 'example.org'
$cookie->getExpires(); // expiration date as a Unix timestamp
Бисквитките могат да се извличат и в масив благодарение на метода toArray().
Интерфейсът GuzzleHttp\Cookie\CookieJarInterface разширява
Traversable, така че може да бъде претърсван в цикъла foreach.
Guzzle автоматично ще следва пренасочвания, освен ако не му кажете да не го прави. Можете да персонализирате поведението на пренасочване, като използвате опцията за заявка allow_redirects.
true, за да разрешите нормални пренасочвания с максимален брой 5
пренасочвания. Това е настройката по подразбиране.false, за да деактивирате пренасочването.$response = $client->request('GET', 'http://github.com');
echo $response->getStatusCode();
// 200
Следващият пример показва, че пренасочването може да бъде деактивирано.
$response = $client->request('GET', 'http://github.com', [
'allow_redirects' => false
]);
echo $response->getStatusCode();
// 301
Изглед на дърво
Следният дървовиден изглед описва как изключенията на Guzzle зависят едно от друго.
. \RuntimeException
└── TransferException (implements GuzzleException)
├── ConnectException (implements NetworkExceptionInterface)
└── RequestException
├── BadResponseException
│ ├── ServerException
│ └── ClientException
└── TooManyRedirectsException
Guzzle хвърля изключения за грешки, които възникват по време на прехвърлянето.
Изключение GuzzleHttp\Exception\ConnectException се хвърля в
в случай на грешка в мрежата. Това изключение се разширява от
GuzzleHttp\Exception\TransferException.
Изхвърля се GuzzleHttp\Exception\ClientException за 400
ниво, ако опцията за заявка http_errors е настроена на true. Това
изключение се разширява от GuzzleHttp\Exception\BadResponseException и
GuzzleHttp\Exception\BadResponseException разширява от
GuzzleHttp\Exception\RequestException.
използвайте 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());
}
Изхвърля се GuzzleHttp\Exception\ServerException за ниво 500
ако опцията за заявка http_errors е настроена на true. Тази опция
изключение се разширява от GuzzleHttp\Exception\BadResponseException.
Изключение GuzzleHttp\Exception\TooManyRedirectsException се хвърля, когато твърде много
се следват твърде много пренасочвания. Това изключение се разширява от GuzzleHttp\Exception\RequestException.
Всички горепосочени изключения се разширяват от GuzzleHttp\Exception\TransferException.
Guzzle предлага няколко променливи на средата, които могат да се използват за персонализиране на поведението на библиотеката.
GUZZLE_CURL_SELECT_TIMEOUTcurl_multi_select(). Някои системи
имат проблеми с имплементацията на PHP на curl_multi_select(), където
извикването на тази функция винаги води до изчакване на максималната продължителност на
времетраенето.HTTP_PROXYОпределя прокси сървъра, който да се използва при изпращане на заявки чрез протокола "http".
Забележка: тъй като променливата HTTP_PROXY може да съдържа произволен потребителски вход в някои (CGI) среди, променливата се използва само в CLI SAPI. Вижте https://httpoxy.org за повече информация.
HTTPS_PROXYNO_PROXYGuzzle може да използва настройките на PHP ini при конфигурирането на клиенти.
openssl.cafile