Класс CURLRequest
Класс CURLRequest — это лёгкий HTTP-клиент, основанный на cURL, который позволяет взаимодействовать с другими веб-сайтами и серверами. Он может использоваться для получения содержимого результата поиска Google, извлечения веб-страницы или изображения, а также для взаимодействия с API и многим другим.
Этот класс моделируется по библиотеке Guzzle HTTP Client, так как она является одной из наиболее широко используемых библиотек. В возможных случаях синтаксис сохранён для того, чтобы, если вашему приложению требуется что-то немного более мощное, чем предлагает эта библиотека, вам нужно будет изменить очень мало, чтобы перейти к использованию Guzzle.
Примечание
Данный класс требует, чтобы библиотека cURL была установлена в вашей версии PHP. Это очень распространённая библиотека, которая, как правило, доступна, но не все хосты её предоставляют, поэтому, пожалуйста, уточните у своего хостинг-провайдера, если у вас возникнут проблемы.
Настройка для CURLRequest
Параметры совместного использования
По историческим причинам по умолчанию CURLRequest разделяет все параметры между запросами. Если вы отправляете более одного запроса с экземпляром класса, это поведение может привести к ошибочному запросу с ненужными заголовками.
Вы можете изменить поведение, изменив значение следующего параметра конфигурации в файле app/Config/CURLRequest.php на false.
public $shareOptions = false;
Загрузка библиотеки
Библиотеку можно загрузить вручную или через класс Services.
Для загрузки с помощью класса Services вызовите метод curlrequest().
$client = \Config\Services::curlrequest();
Вы можете передать массив с параметрами по умолчанию в качестве первого параметра для изменения обработки запроса cURL. Параметры описаны позже в этом документе:
$options = [
'baseURI' => 'http://example.com/api/v1/',
'timeout' => 3,
];
$client = \Config\Services::curlrequest($options);
Примечание
Когда $shareOptions имеет значение false, параметры по умолчанию, переданные в конструктор класса, будут использоваться для всех запросов. Другие параметры будут сброшены после отправки запроса.
При ручном создании класса вам нужно передать несколько зависимостей. Первый параметр — экземпляр класса Config\App. Второй параметр — экземпляр URI. Третий параметр — объект Response. Четвертый параметр — необязательный массив $options.
$client = new \CodeIgniter\HTTP\CURLRequest(
new \Config\App(),
new \CodeIgniter\HTTP\URI(),
new \CodeIgniter\HTTP\Response(new \Config\App()),
$options
);
Работа с библиотекой
Работа с запросами cURL сводится к созданию объекта запроса и получению объекта Response. Он предназначен для обработки связи. После этого у вас есть полный контроль над тем, как обрабатывается информация.
Отправка запросов
Большинство взаимодействий осуществляется через метод request(), который отправляет запрос и возвращает вам экземпляр Response. Он принимает HTTP-метод, URL и массив параметров.
$client = \Config\Services::curlrequest();
$response = $client->request('GET', 'https://api.github.com/user', [
'auth' => ['user', 'pass'],
]);
Примечание
Когда $shareOptions имеет значение false, параметры, переданные в метод, будут использоваться для запроса. После отправки запроса они будут очищены. Если вы хотите использовать параметры для всех запросов, передайте их в конструктор.
Поскольку ответ является экземпляром CodeIgniter\HTTP\Response, у вас доступна вся обычная информация:
echo $response->getStatusCode();
echo $response->getBody();
echo $response->getHeader('Content-Type');
$language = $response->negotiateLanguage(['en', 'fr']);
Хотя метод request() является наиболее гибким, вы также можете использовать следующие сокращённые методы. Каждый из них принимает URL в качестве первого параметра и массив параметров во втором.
$client->get('http://example.com');
$client->delete('http://example.com');
$client->head('http://example.com');
$client->options('http://example.com');
$client->patch('http://example.com');
$client->put('http://example.com');
$client->post('http://example.com');
Базовый URL
Базовый URL может быть установлен как один из параметров при создании экземпляра класса. Это позволяет установить базовый URL и затем отправлять все запросы с этим клиентом, используя относительные URL. Это особенно полезно при работе с API:
$client = \Config\Services::curlrequest([
'baseURI' => 'https://example.com/api/v1/',
]);
// GET http:example.com/api/v1/photos
$client->get('photos');
// GET http:example.com/api/v1/photos/13
$client->delete('photos/13');
Когда относительный URL предоставляется методу request() или любому из сокращённых методов, он будет объединён с baseURI в соответствии с правилами, описанными в RFC 3986, разделе 5.2. Чтобы сэкономить ваше время, вот некоторые примеры того, как выполняются объединения.
| baseURI | 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 |
Использование ответов
Каждый вызов request() возвращает объект Response, который содержит много полезной информации и несколько полезных методов. Наиболее часто используемые методы позволяют определить сам ответ.
Вы можете получить код состояния и фразу причины ответа:
$code = $response->getStatusCode(); // 200 $reason = $response->getReason(); // OK
Вы можете получить заголовки из ответа:
// Get a header line
echo $response->getHeaderLine('Content-Type');
// Get all headers
foreach ($response->getHeaders() as $name => $value) {
echo $name .': '. $response->getHeaderLine($name) ."\n";
}
Тело можно получить с помощью метода getBody().
$body = $response->getBody();
Тело — это исходное тело, предоставленное удалённым сервером. Если тип содержимого требует форматирования, вам нужно будет убедиться, что ваш скрипт это обрабатывает:
if (strpos($response->getHeader('content-type'), 'application/json') !== false) {
$body = json_decode($body);
}
Параметры запроса
В этом разделе описаны все доступные параметры, которые можно передать в конструктор, метод request() или любой из сокращённых методов.
allow_redirects
По умолчанию cURL следует за всеми заголовками «Location:», отправляемыми удалёнными серверами. Параметр allow_redirects позволяет изменить это поведение.
Если вы установите его в false, то перенаправления вообще не будут следовать:
$client->request('GET', 'http://example.com', ['allow_redirects' => false]);
Установив его в true, вы примените настройки по умолчанию к запросу:
$client->request('GET', 'http://example.com', ['allow_redirects' => true]);
// Sets the following defaults:
'max' => 5, // Maximum number of redirects to follow before stopping
'strict' => true, // Ensure POST requests stay POST requests through redirects
'protocols' => ['http', 'https'] // Restrict redirects to one or more protocols
Вы можете передать массив в качестве значения параметра allow_redirects для указания новых настроек вместо значений по умолчанию:
$client->request('GET', 'http://example.com', ['allow_redirects' => [
'max' => 10,
'protocols' => ['https'] // Force HTTPS domains only.
]]);
Примечание
Следование перенаправлениям не работает, когда PHP находится в режиме safe_mode или включён open_basedir.
auth
Позволяет предоставить данные авторизации для HTTP Basic и Digest авторизации. Ваш скрипт, возможно, должен будет выполнить дополнительные действия для поддержки аутентификации Digest — это просто передаёт имя пользователя и пароль. Значение должно быть массивом, где первый элемент — имя пользователя, а второй — пароль. Третий параметр должен указывать тип используемой аутентификации, либо basic или digest:
$client->request('GET', 'http://example.com', ['auth' => ['username', 'password', 'digest']]);
body
Существует два способа установить тело запроса для типов запросов, которые их поддерживают, таких как PUT или POST. Первый способ — использовать метод setBody().
$client->setBody($body) ->request('put', 'http://example.com');
Второй способ — передать параметр body. Это сделано для сохранения совместимости с API Guzzle и работает точно так же, как предыдущий пример. Значение должно быть строкой:
$client->request('put', 'http://example.com', ['body' => $body]);
cert
Чтобы указать расположение PEM-сертификата клиента, передайте строку с полным путём к файлу в качестве параметра cert. Если требуется пароль, установите значение в массив с первым элементом, как путь к сертификату, и вторым — пароль:
$client->request('get', '/', ['cert' => ['/path/getServer.pem', 'password']);
connect_timeout
По умолчанию CodeIgniter не накладывает ограничений на попытки cURL подключиться к веб-сайту. Если вам нужно изменить это значение, вы можете сделать это, передав количество времени в секундах с помощью параметра connect_timeout. Вы можете передать 0, чтобы ждать неопределённое время:
$response->request('GET', 'http://example.com', ['connect_timeout' => 0]);
cookie
Это указывает имя файла, который cURL должен использовать для чтения значений cookie и сохранения значений cookie. Это делается с помощью параметров CURL_COOKIEJAR и CURL_COOKIEFILE. Пример:
$response->request('GET', 'http://example.com', ['cookie' => WRITEPATH . 'CookieSaver.txt']);
debug
При передаче значения debug и установке его в значение true, это позволит включить дополнительную отладку, выводящую информацию в STDERR во время выполнения скрипта. Это делается путем передачи CURLOPT_VERBOSE и вывода результата. Таким образом, при запуске встроенного сервера через spark serve, вы увидите вывод в консоли. В противном случае, вывод будет записан в журнал ошибок сервера.
Вы можете передать имя файла в качестве значения для debug, чтобы вывод записывался в файл:
$response->request('GET', 'http://example.com', ['debug' => '/usr/local/curl_log.txt']);
delay
Позволяет приостановить выполнение на заданное количество миллисекунд перед отправкой запроса:
// Delay for 2 seconds
$response->request('GET', 'http://example.com', ['delay' => 2000]);
form_params
Вы можете отправить данные формы в запросе POST с типом контента application/x-www-form-urlencoded, передав ассоциативный массив в опцию form_params. Это установит заголовок Content-Type в значение application/x-www-form-urlencoded, если он ещё не установлен:
$client->request('POST', '/post', [
'form_params' => [
'foo' => 'bar',
'baz' => ['hi', 'there'],
],
]);
Примечание
form_params нельзя использовать с опцией multipart. Вы должны использовать одну или другую. Используйте form_params для запросов application/x-www-form-urlencoded, и multipart для запросов multipart/form-data.
headers
Хотя вы можете установить любые необходимые для запроса заголовки, используя метод setHeader(), вы также можете передать ассоциативный массив заголовков в качестве опции. Каждый ключ — это имя заголовка, а каждое значение — строка или массив строк, представляющие значения поля заголовка:
$client->request('get', '/', [
'headers' => [
'User-Agent' => 'testing/1.0',
'Accept' => 'application/json',
'X-Foo' => ['Bar', 'Baz'],
],
]);
Если заголовки переданы в конструктор, они рассматриваются как значения по умолчанию, которые будут переопределены более поздними массивами заголовков или вызовами метода setHeader().
http_errors
По умолчанию, CURLRequest завершится ошибкой, если возвращённый код HTTP больше или равен 400. Вы можете установить http_errors в false, чтобы вернуть содержимое вместо этого:
$client->request('GET', '/status/500');
// Will fail verbosely
$res = $client->request('GET', '/status/500', ['http_errors' => false]);
echo $res->getStatusCode();
// 500
json
Опция json используется для удобной загрузки данных в формате JSON в качестве тела запроса. Добавляется заголовок Content-Type со значением application/json, перезаписывая любой ранее установленный заголовок Content-Type. Данные, предоставляемые в этой опции, могут быть любым значением, которое принимает json_encode().
$response = $client->request('PUT', '/put', ['json' => ['foo' => 'bar']]);
Примечание
Эта опция не позволяет настроить функцию json_encode(), или заголовок Content-Type. Если вам нужна такая возможность, вам нужно будет закодировать данные вручную, передав их через метод setBody() класса CURLRequest, и установить заголовок Content-Type методом setHeader().
multipart
Когда вам нужно отправить файлы и другие данные через запрос POST, вы можете использовать опцию multipart, вместе с классом CURLFile. Значения должны быть ассоциативным массивом данных POST для отправки. Для более безопасного использования устаревший метод отправки файлов путём добавления имени файла с префиксом @ был отключён. Все файлы, которые вы хотите отправить, должны быть переданы как экземпляры CURLFile.
$post_data = [
'foo' => 'bar',
'userfile' => new \CURLFile('/path/to/file.txt'),
];
Примечание
multipart нельзя использовать с опцией form_params. Вы можете использовать только одну из них. Используйте form_params для запросов application/x-www-form-urlencoded, и multipart для запросов multipart/form-data.
query
Вы можете передать данные для отправки в качестве переменных строки запроса, передав ассоциативный массив в качестве опции query:
// Send a GET request to /get?foo=bar
$client->request('GET', '/get', ['query' => ['foo' => 'bar']]);
timeout
По умолчанию, функции cURL могут выполняться неограниченное время. Вы можете изменить это с помощью опции timeout. Значение должно быть количеством секунд, в течение которых функции должны выполняться. Используйте 0 для неограниченного ожидания:
$response->request('GET', 'http://example.com', ['timeout' => 5]);
user-agent
Позволяет указать User Agent для запросов:
$response->request('GET', 'http://example.com', ['user_agent' => 'CodeIgniter Framework v4']);
verify
Эта опция описывает поведение проверки SSL-сертификата. Если опция verify имеет значение true, это включает проверку SSL-сертификата и использует стандартный набор CA-сертификатов, предоставляемый операционной системой. Если установлено значение false, это отключит проверку сертификата (это небезопасно и позволяет атаки типа "человек посередине"). Вы можете установить строку, содержащую путь к набору CA-сертификатов, чтобы включить проверку с настроенным сертификатом. Значение по умолчанию — true:
// Use the system's CA bundle (this is the default setting)
$client->request('GET', '/', ['verify' => true]);
// Use a custom SSL certificate on disk.
$client->request('GET', '/', ['verify' => '/path/to/cert.pem']);
// Disable validation entirely. (Insecure!)
$client->request('GET', '/', ['verify' => false]);
version
Для установки используемого HTTP-протокола вы можете передать строку или число с номером версии (обычно 1.0 или 1.1, 2.0 в настоящее время не поддерживается):
// Force HTTP/1.0
$client->request('GET', '/', ['version' => 1.0]);
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/libraries/curlrequest.html