An open API service indexing awesome lists of open source software.

https://github.com/andy87/curl-requester

Многофункциональный класс для отправки запросов с помощью функций cURL.
https://github.com/andy87/curl-requester

Last synced: 3 months ago
JSON representation

Многофункциональный класс для отправки запросов с помощью функций cURL.

Awesome Lists containing this project

README

        



curl-requester

Многофункциональный класс для отправки запросов с помощью функций cURL.

***Решаемые задачи/цели:***

1. Единая точка входа для отправки запросов

2. Легко использовать (простой интерфейс и настройка)


## Пример кода использования.
```php
/** @var andy87\curl_requester\Curl $curl */

//GET запрос
$resp = $curl->get( 'vk.com/id806034' )->response(); // string

// Получение ответа в качестве объекта с запросом методом POST
$respObject = $curl->post( 'vk.com/user/add', [ 'name' => 'and_y87' ])->run()->asObject(); // object

// Имитация запроса методом PATCH с получением тестовых данных
$response = $curl->patch( 'vk.com/user/get', ['id' => 806034])
->setTestResponse('{"name" : "Андрей", "do" : "code"}')
->run();

//Получение данных
$respArray = $response->asArray(); // ['name' => 'Андрей', 'do'=> 'code']
$http_code = $response->httpCode;
```


### Mapping
Переменные в примерах кода:
- ***$response*** - объект класса `andy87\curl_requester\entity\Response`
- ***$request*** - объект класса `andy87\curl_requester\entity\Request`
- ***$query*** - объект класса `andy87\curl_requester\entity\Query`

### Детальнее
Доступно 6 методов/запросов: GET, POST, PUT, PATCH, HEAD, DELETE
Все методы вызываются идентично.
1. **конструктор** - принимает аргументы:
- *string* **url** - адрес на который будет осуществлён запрос
- *array* **params** - параметры запроса *(не обязательный)*

```php
/** @var andy87\curl_requester\Curl $curl */
/** @var andy87\curl_requester\entity\Response $curl */

$request = $curl->get('https://andy87.ru');

$request = $curl->post('www.andy87.ru/search', [ 'text' => 'php' ]);
```

2. Ответ(***response***).
Возможно получить ответ несколькими способами:
- Преобразует ответ в объект( object )
```php
/** @var andy87\curl_requester\Curl $curl */

$respObject = $curl->get('www.andy87.ru/data')->asObject(); // object
```
- Преобразует ответ в массив( array )
```php
/** @var andy87\curl_requester\Curl $curl */

$respArray = $curl->get('www.andy87.ru/data')->asArray(); // array
```
- Текст ( string )
```php
/** @var andy87\curl_requester\Curl $curl */
/** @var andy87\curl_requester\entity\Response $response */

$resp = $curl->get('www.andy87.ru')->response(); // string

//Аналог

$response = $curl->get('www.andy87.ru')->run(); // Вернёт объект класса `Response` (информацию об ответе)
$resp = $response->response;

//Аналог(краткая запись)
$resp = $curl->get('www.andy87.ru')->run()->response;
$resp = $curl->get('www.andy87.ru')->response();
```

### Информация об ответе.
`Response::class`
- ***response*** - ответ на запрос
- ***httpCode*** - код ответа на запрос
```php
/** @var andy87\curl_requester\Curl $curl */

$response = $curl->post( 'www.andy87.ru')->run(); //Вернёт объект класса `Request` (данные запроса).

$respArray = $response->asArray(); // ['name' => 'Андрей', 'do'=> 'code']
$httpCode = $response->httpCode; //Код ответа сервера

$query = $response->getQuery(); //Вернёт объект класса `Query` (информацию о запросе.)
```

### Информация о запросе.
`Query::class`
- **method** - метод запроса
- **url** - адрес запроса
- **postFields** - данные запроса
- **headers** - Заголовки запроса
- **curlOptions** - опции cURL запроса
- **response** - ответ на запрос
- **httpCode** - код ответа на запрос
```php
/** @var andy87\curl_requester\Curl $curl */
/** @var andy87\curl_requester\entity\Query $query */

$query = $curl->post( 'www.andy87.ru')->run()->getQuery();

$method = $query->method;
$url = $query->url;
$headers = $query->headers;
$postFields = $query->postFields;
$curlOptions= $query->curlOptions;
$response = $query->response;
$http_code = $query->httpCode;

$isPost = $query->isPost();
//... и т.д. ( isGet(), isPut() ... )
```


## Дополнительные возможности

### Вернуть тестовые данные
- **setTestResponse( *string* $response, *int* $http_code )** - запрос не выполнится и вернётся заданный ответ.
- *string* **$response** - имитируемый ответ
- *int* **$http_code** - имитируемый код ответа ( По умолчанию 200 )
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post('www.crm.ru/get-user', ['id' => 123])
->setTestResponse(json_encode(['name'=>'Андрей', 'do'=>'code']), 302 )
->response();
```
### Расширить/дополнить заголовки запроса
- **addHeaders( *array* $array )** - добавляемые заголовки
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post('www.crm.ru/get-user', ['id' => 123])
->addHeaders(['Content-Type: application/json'])
->response();
```
### Подготовленные данные
- **prepareParams( *string* $postField )** - данные для запроса не будут проходить обработку [http_build_query()](https://www.php.net/manual/ru/function.http-build-query.php) они считаются уже подготовленными для запроса
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post( 'www.vk.com/806034')
->prepareParams( http_build_query(['id' => 123]) )
->response();

// Аналог
$params = http_build_query(['id' => 123]);
$resp = $curl->post( 'www.vk.com/806034', $params )->prepareParams()->response();
```
### Использование Basic авторизации
- **setBasicAuth( *string* $token )** - Добавляет в заголовки
`Authorization: Basic eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9`
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post('www.crm.ru/get-user', ['id' => 123])
->setBasicAuth('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9')
->response();
```
### Дополнительные cURL опции
- **addCurlOptions( *array* $array )** - дополнительные опции cURL для [curl_setopt()](https://www.php.net/manual/ru/function.curl-setopt.php)
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post('www.crm.ru/get-user/delete', ['id' => 123])
->addCurlOptions([ CURLOPT_FOLLOWLOCATION => true])
->response();
```
### Использование Cookie
- **useCookie( *string* $cookie, *string* $path )** - использование cookie. Задаются:
`CURLOPT_COOKIE`
`CURLOPT_COOKIEJAR`
`CURLOPT_COOKIEFILE`
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post('www.crm.ru/get-user', ['id' => 123])
->useCookie('cookiename=cookievalue', '/tmp/cookies.txt')
->response();
```

### Отключение проверки SSL
- **disableSSL()** - отключение проверки SSL. Задаются:
`CURLOPT_SSL_VERIFYPEER => false`
`CURLOPT_SSL_VERIFYHOST => false`
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post( 'www.crm.ru/get-user', ['id' => 123])
->disableSSL()
->response();
```
### Разрешение редиректа
- **enableRedirect()** - разрешение на редирект, если ответ сервера требует редиректа. Задаётся:
`CURLOPT_FOLLOWLOCATION => true`
```php
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post( 'www.vk.com/806034')
->enableRedirect()
->response();
```

### Получение расширенной информации по запросу.
- **addCurlInfo( *array* $curl_info )** - Дополняет список информации по запросу которую надо получить
```php
/** @var andy87\curl_requester\Curl $curl */

$query = $curl->post('www.vk.com/806034')
->addCurlInfo([CURLINFO_EFFECTIVE_URL]) // Добавление необходимой информации к ответу
->run()
->getQuery();

$last_url = $query->info[ CURLINFO_EFFECTIVE_URL ]; //Получение информации
```
### Установка event функций
- **setEvent( *string* $event, *callable* $function )** - callback функция, которая будет вызвана в event
- *string* ***$event*** - ключ события. Доступны:
- **Request**::***EVENT_RUN*** - до запроса и до инициализации resource cURL
- **Request**::***EVENT_BEFORE_REQUEST*** - до запроса, после инициализации resource cURL
- **Request**::***EVENT_AFTER_REQUEST*** - после запроса, после инициализации resource cURL
- *callable* ***$function*** - вызываемая функция
```php
use andy87\curl_requester\entity\Query

/** @var andy87\curl_requester\Curl $curl */

$request = $curl->post('www.vk.com/806034');
//пример: задать некий callBack после запроса
$request->setEvent(
Request::EVENT_AFTER_REQUEST,
function ( Query $query, $curlHandler )
{
// some code
}
);

$resp = $request->run()->response;
```
### Установка callBack функции
- **setCallback( *callable* $callback )** - функция( **Request**::***EVENT_AFTER_REQUEST*** ), которая будет вызвана сразу после формирования ответа от сервера и до закрытия [curlHandler](https://www.php.net/manual/ru/book.curl.php)
```php
use andy87\curl_requester\entity\Query

/** @var andy87\curl_requester\Curl $curl */

$request = $curl->post('www.vk.com/806034');

$request->setCallback(function ( Query $query, $curlHandler )
{
if ( $query->httpCode !== Query::OK )
{
$errors = curl_error( $curlHandler );

curl_close( $curlHandler );

exit( $errors );
}
});

$resp = $request->run()->response;
```


### Собственная реализация [cURL](https://www.php.net/manual/ru/book.curl.php) через Request
```php
use andy87\curl_requester\entity\Request

$ch = Request::createCurlHandler( 'www.vk.com/806034', [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => [ 'some headers' ],
CURLOPT_POSTFIELDS => http_build_query([ 'some params' ])
]);

$resp = curl_exec( $ch );

curl_close($ch);

// Аналог(кратная запись)
$resp = Request::send( 'www.vk.com/806034', [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => [ 'some headers' ],
CURLOPT_POSTFIELDS => http_build_query([ 'some params' ])
]);
```


# Установка

## Зависимости
- php ( >= 7.4 )
- ext-curl
- ext-json
- ext-mbstring

## composer.json
Установка с помощью [composer](https://getcomposer.org/download/)

Добавить в `composer.json`
require
```
"require": {
...
"andy87/curl-requester" : "dev-main"
},
```
repositories
```
"repositories": [
...,
{
"url": "[email protected]:andy87/curl-requester.git",
"type": "vcs"
}
]
```

Если **composer** не установлен локально, то скачать **composer.phar** с официального сайта в корневую дирекорию пргоекта.

Выполнить в консоле команду, если **composer** локально:

| установлен | не установлкн |
|-------------------|-----------------------------|
| `composer update` | `php composer.phar update` |
| `composer dump` | `php composer.phar dump` |

## Log
* ***1.3.5***
* Add: directory examples
* Update:
* `Request`
* edit: createCurlHandler()
* add: send()
* ReadME