Эта страница содержит краткое введение в 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 | Result |
---|---|---|
http://foo.com |
/bar |
http://foo.com/bar |
http://foo.com/foo |
/bar |
http://foo.com/bar |
http://foo.com/foo |
бар |
http://foo.com/bar |
http://foo.com/foo/ |
бар |
http://foo.com/foo/bar |
http://foo.com |
http://baz.com |
http://baz.com |
http://foo.com/?bar |
бар |
http://foo.com/bar |
обработчик
.Psr7\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
или нам был
получили ответ из обещания. Объект 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.
содержимого из потока 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 может поддерживать сессию cookie для вас, если вы проинструктированы с помощью опции
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
в конструкторе клиента, если вы хотите использовать общий банк cookie для всех запросов.
// 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
хранит cookies в виде массива.GuzzleHttp\Cookie\FileCookieJar
сохраняет несеансовые cookies
используя файл в формате JSON.GuzzleHttp\Cookie\SessionCookieJar
сохраняет cookies в
клиентской сессии.Вы можете вручную установить куки в банку куки с помощью именованного конструктора fromArray(array $cookies, $domain)
.
$jar = \GuzzleHttp\Cookie\CookieJar::fromArray(
[
'some_cookie' => 'foo',
'other_cookie' => 'barbaz1234'
],
'example.org'
);
Вы можете получить cookie по его имени с помощью метода 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
.
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());
}
Исключение GuzzleHttp\Exception\ServerException
выбрасывается для 500 уровня
ошибки, если опция http_errors
запроса установлена в true. Этот
исключение расширяется от GuzzleHttp\Exception\BadResponseException
.
Исключение GuzzleHttp\Exception\TooManyRedirectsException
выбрасывается, когда слишком
много перенаправлений. Это исключение расширяет GuzzleHttp\Exception\RequestException
.
Все вышеперечисленные исключения вытекают из GuzzleHttp\Exception\TransferException
.
Guzzle предоставляет несколько переменных окружения, которые можно использовать для настройки поведения библиотеки.
GUZZLE_CURL_SELECT_TIMEOUT
curl_multi_select()
. Некоторые системы
имеют проблемы с реализацией PHP curl_multi_select()
, где
вызов этой функции всегда приводит к ожиданию максимальной продолжительности
таймаута.HTTP_PROXY
Определяет прокси-сервер для использования при отправке запросов по протоколу "http"
Примечание: поскольку переменная HTTP_PROXY может содержать произвольный пользовательский ввод в некоторых (CGI) средах, эта переменная используется только в CLI SAPI. См. https://httpoxy.org для получения дополнительной информации.
HTTPS_PROXY
NO_PROXY
Guzzle может использовать параметры PHP ini при настройке клиентов.
openssl.cafile