andy87/curl-requester

该包最新版本(dev-main)没有可用的许可证信息。

cURL请求的装饰器/构建器

dev-main 2022-12-13 22:27 UTC

This package is auto-updated.

Last update: 2024-09-30 01:43:38 UTC


README

curl-requester

一个用于通过cURL函数发送请求的多功能类。

可解决的问题/目标
1. 发送请求的统一入口点
2. 易于使用(简单的接口和配置)

使用示例代码。

/** @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;

映射

代码示例中的变量

  • $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 - 请求参数 (非必需)
/** @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' ]);
  1. 响应(response)。
    可以通过多种方式获取响应
  • 将响应转换为对象( object )
/** @var andy87\curl_requester\Curl $curl */

$respObject = $curl->get('www.andy87.ru/data')->asObject(); // object
  • 将响应转换为数组( array )
/** @var andy87\curl_requester\Curl $curl */

$respArray = $curl->get('www.andy87.ru/data')->asArray(); // array
  • 文本 ( string )
/** @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 - 请求的响应代码
/** @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 - 请求的响应代码
/** @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)
/** @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 ) - 添加的头部
/** @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() 处理,它们被认为是已经准备好用于请求的
/** @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();

使用基本认证

  • setBasicAuth( string $token ) - 添加到头部
    Authorization: Basic eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9
/** @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()
/** @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
/** @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
/** @var andy87\curl_requester\Curl $curl */

$resp = $curl->post( 'www.crm.ru/get-user', ['id' => 123])
    ->disableSSL()
    ->response();

允许重定向

  • enableRedirect() - 如果服务器响应需要重定向,允许重定向。设置
    CURLOPT_FOLLOWLOCATION => true
/** @var andy87\curl_requester\Curl $curl */

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

获取请求的扩展信息。

  • addCurlInfo( array $curl_info ) - 补充要获取的请求信息列表
/** @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 ]; //Получение информации 

设置事件函数

  • setEvent( string $event, callable $function ) - 事件中的回调函数将被调用
    • string $event - 事件键。可用
      • Request::EVENT_RUN - 在请求之前和初始化cURL resource之前
      • 请求::EVENT_BEFORE_REQUEST - 在请求前,初始化 cURL 资源之后
      • 请求::EVENT_AFTER_REQUEST - 在请求后,初始化 cURL 资源之后
    • 可调用 $function - 被调用的函数
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;

设置回调函数

  • setCallback( 可调用 $callback ) - 在收到服务器响应后立即调用,并在关闭 curlHandler 之前执行的功能( 请求::EVENT_AFTER_REQUEST )
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;

通过 Request 实现自定义 cURL

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 安装

composer.json 中添加
require

"require": {
    ...
    "andy87/curl-requester" : "dev-main"
},

repositories

"repositories": [
    ...,
    {
      "url": "git@github.com:andy87/curl-requester.git",
      "type": "vcs"
    }
]

如果本地未安装 composer,则从 官方网站 下载 composer.phar 到项目根目录。

在控制台执行以下命令,如果本地已安装 composer

日志

  • 1.3.5
    • 添加:examples 目录
    • 更新
      • 请求
        • 编辑:createCurlHandler()
        • 添加:send()
      • README