KnockKnock - , PHP, cURL. , API .
: .
P.S. : Guzzle, Client ( Yii2), . "" , , nullWarningStyle - , : , , . _, , - _
composer require andy87/knockknock
php composer.phar require andy87/knockknock
: composer update
composer.json
, require
"andy87/knockknock": "*"
: composer update
, , :
require_once '////autoload.php';
:
use andy87\knock_knock\lib\Method;
use andy87\knock_knock\lib\ContentType;
use andy87\knock_knock\core\Operator;
use andy87\knock_knock\core\Response;
//
$operator = new Operator( $_ENV['API_HOST'] )->disableSSL();
/**
* ( )
*/
$content = $operator->send( $operator->constructRequest(Method::GET, 'info/me') )->content;
/**
*
*/
$request = $operator->constructRequest(Method::GET, 'info/me'); //
$request->setCurlInfo([ CURLINFO_CONTENT_TYPE ]); // cURL
$response = $operator->send($request); //
$content = $response->content; //
$curlOptions = $response->request->curlOptions; // cURL
$output = ( $curlOptions[CURLINFO_CONTENT_TYPE] === ContentType::JSON ) ? json_decode( $content ) : $content;
print_r( $output );
use andy87\knock_knock\core\Operator;
PHP \ ext cURL
CURL_OPTIONS
! , , .:
$operator = new Operator( $_ENV['API_HOST'], $commonRequestParams );
, Singleton:
$operator = Operator::getInstance( $_ENV['API_HOST'], $commonRequestParams );
( Operator
), :
string $host
-
array $operatorConfig
- .
Operator
init()
, .
init()
EVENT_AFTER_CONSTRUCT
:
//
$commonRequestParams = [
Request::SETUP_PROTOCO => $_ENV['API_PROTOCOL'],
Request::SETUP_CONTENT_TYPE => Request::CONTENT_TYPE_JSON,
Request::SETUP_CURL_OPTIONS => [
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true
]
];
//
$operator = new Operator( $_ENV['API_HOST'], $commonRequestParams );
//, Singleton:
$operator = Operator::getInstance( $_ENV['API_HOST'], $commonRequestParams );
( Request
):
SETUP_PROTOCOL
SETUP_HOST
SETUP_METHOD
SETUP_HEADERS
SETUP_CONTENT_TYPE
SETUP_DATA
SETUP_CURL_OPTIONS
SETUP_CURL_INFO
EVENT_AFTER_CONSTRUCT
knockKnockEVENT_CREATE_REQUEST
EVENT_BEFORE_SEND
EVENT_CURL_Operator
curlEVENT_CREATE_RESPONSE
EVENT_AFTER_SEND
$operator->setupEventHandlers([
Operator::EVENT_AFTER_CONSTRUCT => function( Operator $operator ) {
// ...
},
Operator::EVENT_CREATE_REQUEST => function( Operator $operator, Request $request ) {
// ...
},
Operator::EVENT_BEFORE_SEND => function( Operator $operator, Request $request ) {
// ...
},
Operator::EVENT_CURL_HANDLER => function( Operator $operator, resource $ch ) {
// ...
},
Operator::EVENT_CREATE_RESPONSE => function( Operator $operator, Response $response ) {
// ...
},
Operator::EVENT_AFTER_SEND => function( Operator $operator, Response $response ) {
// ...
}
]);
callback / Operaotr
.
/ :
Request
- EVENT_CREATE_REQUEST
, EVENT_BEFORE_SEND
Response
- EVENT_CREATE_RESPONSE
, EVENT_AFTER_SEND
use andy87\knock_knock\core\Request;
, .
:
$request = new Request( 'info/me', [
Request::METHOD => Method::POST,
Request::DATA => [ 'client_id' => 34 ],
Request::HEADERS => [ 'api-secret-key' => $_ENV['API_SECRET_KEY'] ],
Request::CURL_OPTIONS => [ CURLOPT_TIMEOUT => 10 ],
Request::CURL_INFO => [
CURLINFO_CONTENT_TYPE,
CURLINFO_HEADER_SIZE,
CURLINFO_TOTAL_TIME
],
Request::CONTENT_TYPE => ContentType::FORM_DATA,
]);
, callback , EVENT_CREATE_REQUEST
$request = $operator->constructRequest(Method::GET, 'info/me', [
Request::METHOD => Method::POST,
Request::DATA => [ 'client_id' => 45 ],
Request::HEADERS => [ 'api-secret-key' => $_ENV['API_SECRET_KEY'] ],
Request::CURL_OPTIONS => [ CURLOPT_TIMEOUT => 10 ],
Request::CURL_INFO => [
CURLINFO_CONTENT_TYPE,
CURLINFO_HEADER_SIZE,
CURLINFO_TOTAL_TIME
],
Request::CONTENT_TYPE => ContentType::FORM_DATA,
]);
:
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->send($request);
// ( )
$cloneRequest = $request->clone();
//
$response = $operator->setupRequest( $cloneRequest )->send();
set/get
setProtocol( string $protocol ) | getProtocol(): string | ||
setHost( string $host ) | getHost(): string | --- | |
Endpoint | setEndpoint( string $url ) | getEndpoint(): string | --- |
setMethod( string $method ) | getMethod(): string | ||
setHeaders( array $headers ) | getHeaders(): array | ||
setContentType( string $contentType ) | getContentType(): string | ||
setData( mixed $data ) | getData(): mixed | --- | |
cURL | setCurlOptions( array $curlOptions ) | getCurlOptions(): array | cURL |
cURL | setCurlInfo( array $curlInfo ) | getCurlInfo(): array | cURL |
setFakeResponse( array $response ) | getFakeResponse(): array |
$request = $operator->constructRequest(Method::GET, 'info/me');
$request->setMethod( Method::GET );
$request->setData(['client_id' => 67]);
$request->setHeaders(['api-secret-key' => 'secretKey67']);
$request->setCurlOptions([
CURLOPT_TIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true
]);
$request->setCurlInfo([
CURLINFO_CONTENT_TYPE,
CURLINFO_HEADER_SIZE,
CURLINFO_TOTAL_TIME
]);
$request->setContentType( ContentType::JSON );
$protocol = $request->getPrococol(); // String
$host = $request->getHost(); // String
// ...
$operator->setupRequest( $request, [
Request::SETUP_HOST => $_ENV['API_HOST'],
Request::SETUP_HEADERS => [
'api-secret' => $_ENV['API_SECRET_KEY']
],
]);
setupRequest( Request $request, array $options = [] ): self
$request = $operator->constructRequest(Method::GET, 'info/me');
$request->addError('!');
use andy87\knock_knock\core\Response;
, .
:
$response = new Response('{"id" => 806034, "name" => "and_y87"}', 200 );
, callback , EVENT_CREATE_RESPONSE
$response = $operator->constructResponse([
Response::CONTENT => [
'id' => 806034,
'name' => 'and_y87'
],
Response::HTTP_CODE => 400,
], $request );
constructResponse( array $responseParams, ?Request $request = null ): Response
send( ?Request $request = null ): Response
/ Response
.
callback , :
EVENT_AFTER_SEND
EVENT_CREATE_RESPONSE
EVENT_BEFORE_SEND
EVENT_CURL_HANDLER
$operator = new Operator( $_ENV['API_HOST'] );
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->send($request);
//
$operator = new Operator( $_ENV['API_HOST'] );
$response = $operator->send( $operator->constructRequest(Method::GET, 'info/me') );
, RequestCompleteException
.
, :
$operator = new Operator( $_ENV['API_HOST'] );
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->send($request);
//
$response = $operator->send($request->clone());
//
$fakeResponse = [
Response::HTTP_CODE => 200,
Response::CONTENT => '{"id" => 8060345, "nickName" => "and_y87"}'
];
$request->setFakeResponse( $fakeResponse );
$response = $operator->send( $request );
$response
content
, httpCode
$fakeResponse
Response
, , , set
.
$response = $operator->send($request);
$response
->setHttpCode(200)
->setContent('{"id" => 8060345, "nickName" => "and_y87"}');
! , ParamUpdateException
.
, replace( string $key, mixed $value )
.
$response = $operator->send($request);
$response
->replace( Response::HTTP_CODE, 200 )
->replace( Response::CONTENT, '{"id" => 8060345, "nickName" => "and_y87"}' );
`Response` , ReadOnly `request`
`Request`
$operator = new Operator( $_ENV['API_HOST'] );
$response = $operator->setRequest( $operator->constructRequest(Method::GET, 'info/me') )->send();
//
$request = $response->request;
$method = $request->method; //
cURL
$operator = new Operator( $_ENV['API_HOST'] );
$response = $operator->setRequest( $operator->constructRequest(Method::GET, 'info/me') )->send();
$response->request;
//
$curlOptions = $response->request->curlOption;
$curlInfo = $response->request->curlInfo;
//
$curlOptions = $response->curlOption;
$curlInfo = $response->curlInfo;
.
`asArray()`
`asArray(true)`
$response = $operator->send($request)->asArray(); // $response
$array = $response->content; // Array$response
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->send($request);
$response->addError('!');
/ SSL Operaotr
& Request
.
curlOptions
CURLOPT_SSL_VERIFYPEER
CURLOPT_SSL_VERIFYHOST
.
->disableSSL( bool $verifyPeer = false, int $verifyHost = 0 );
->enableSSL( bool $verifyPeer = true, int $verifyHost = 2 );
Operaotr
-
$operator = new Operator( $_ENV['API_HOST'] );
$operator->disableSSL();
$request = $operator->constructRequest(Method::GET, 'info/me');
$response = $operator->setupRequest( $request )->send();
Request
-
$operator = new Operator( $_ENV['API_HOST'] )->disableSSL();
$request = $operator->constructRequest(Method::GET, 'info/me');
$request->enableSSL();
$response = $operator->setupRequest( $request )->send();
Operaotr
cookie.
Operaotr
-
$operator = new Operator( $_ENV['API_HOST'] );
$cookie = $_ENV['COOKIE'];
$jar = $_ENV['COOKIE_JAR'];
$operator->useCookie( $cookie, $jar );
$operator->useCookie( string $cookie, string $jar, ?string $file = null )
$file = null
$file
$jar
`logs`
$operator = new Operator( $_ENV['API_HOST'] );
$operator->addLog( ' ' );
$operator->addLog( string $message )
get() | post() | put() | patch() | delete() | head() | options() | trace() |
---|
$endpoint | string | URL ( ) | |
$params | array | ||
_P.S. host _ |
$knockKnockOctopus = new KnockKnockOctopus($_ENV['API_URL']);
$knockKnockOctopus->get( '/profile', [ 'id' => 806034 ] ); //GET
$knockKnockOctopus->post( '/new', [ //POST
'name' => ' ',
'content' => ' '
]);
KnockKnockOctopus, , .
$knockKnockSecurity = new KnockKnockSecurity($_ENV['API_URL']);
//
$knockKnockSecurity
->disableSSL()
->setupAuthorization( KnockKnockSecurity::TOKEN_BEARER, 'token' )
->setupHeaders([ 'X-Api-Key' => $_ENV['X_API_KEY'] ])
->setupContentType( ContentType::JSON )
->on( Operator::EVENT_AFTER_SEND, function( Operator $operator, Response $response ) =>
{
$logFilePath = $_SERVER['DOCUMENT_ROOT'] . '/api_log.txt';
file_put_contents( $logFilePath, $response->content, FILE_APPEND );
});
// `patch`
$responsePatch = $knockKnockSecurity->patch( 'product', [
'price' => 1000
]);
$product = $responsePatch->asArray();
$price = $product['price'];
// `application/json`,
$knockKnockSecurity->useContentType( ContentType::JSON );
// POST
$responsePost = $knockKnockSecurity->post( 'category', [
'name' => ''
]);
$response = json_decode( $responsePost->content );
$category_id = $response->id;
Custom , " "
class KnockKnockYandex extends Operator
{
private const LOGGER = 'logger';
private string $host = 'https://api.yandex.ru/'
private string $contentType = ContentType::JSON
private YandexLogger $logger;
/**
* @return void
*/
public function init(): void
{
$this->setupYandexLoggerEventHandlers();
}
/**
* @param array $callbacks
*
* @return self
*/
private function setupYandexLoggerEventHandlers( array $callbacks ): self
{
$this->on( self::AFTER_CREATE_REQUEST, function( Request $request ) =>
{
$logData = $this->getLogDataByRequest( $request );
$this->addYandexLog( $logData );
};
$this->on(self::EVENT_AFTER_SEND, function( Response $response ) =>
{
$logData = $this->getLogDataByRequest( $response->request );
$this->addYandexLog( $logData );
};
}
/**
* @param Request $request
*
* @return array
*/
private function getLogDataByRequest( Request $request ): array
{
return $request->getParams();
}
/**
* @param array $logData
*
* @return void
*/
private function addYandexLog( array $logData ): bool
{
return $logger->log( $logData );
}
}
$knockKnockYandex = KnockKnockYandex::getInstane( $_ENV['API_HOST'], [
KnockKnockYandex::LOGGER => new YandexLogger(),
]);
$response = $knockKnockYandex->setupRequest( 'profile', [
Request::METHOD => Method::PATCH,
Request::DATA => [ 'city' => 'Moscow' ],
]); // `afterCreateRequest`
$response = $knockKnockYandex->send(); // `afterSend`
vendor/bin/phpunit
vendor/bin/phpunit --testdox
vendor/bin/phpunit --log-junit "tests/logs/phpunit.xml"
https://github.com/andy87/KnockKnock CC BY-SA 4.0 http://creativecommons.org/licenses/by-sa/4.0/