PHP Classes

Curler PHP HTTP Client Library: Send HTTP requests setup using a fluent interface

Recommend this page to a friend!
  Info   View files Documentation   Demos   View files View files (17)   DownloadInstall with Composer Download .zip   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2023-03-10 (24 days ago) RSS 2.0 feedNot yet rated by the usersTotal: 63 All time: 10,219 This week: 154Up
Version License PHP version Categories
eypsilon-curler 1.0.4MIT/X Consortium ...7.4HTTP, Utilities and Tools, PHP 7
Description 

Author

This package can send HTTP requests setup using a fluent interface.

It provides a set of functions that applications can chain to call an object of this class to configure several aspects of an HTTP request that the class will send using the PHP Curl extension.

Currently, it can:

- Set the URL of an HTTP request

- Set the parameters of an HTTP POST request

- Set the user name and password for requests that require HTTP Basic authentication

- Define what the class returns as the response to the HTTP request

- Etc.

The class can also set many HTTP request options using a single function call.

It can also execute the HTTP request and return the request-response when the server returns it.

Picture of Engin Ypsilon
Name: Engin Ypsilon <contact>
Classes: 5 packages by
Country: Germany Germany
Innovation award
Innovation award
Nominee: 1x

Details

MANY/CURLER | Another one CURLs the dust

This class is written to simplify the use of CURL in PHP using chained methods and more rememberable names.

I needed a simple way to explore the Shopware API (v6.*) via http and the Bearer token authentication scheme, but haven't found, what i was looking for to do it, so i ended up with this one. It does nothing new at all, nothing exciting, just simple Requests to URLs and Endpoints like you would expect, but a bit prettier than CURL itself.

See ./public/index.php for examples or check the livedemo on Vercel.

composer require eypsilon/curler

use Many\Http\Curler;

/
 * @var array Simple get
 */
$c = (new Curler)->get('https://example.com/');
print $c['response'];

/
 * @var string with Auth creds
 */
$xc = (new Curler)
    ->authAny('user', 'pass')
    ->post(
        json_encode([
            'lorem_ipsum' => 'Dolor Sit Amet',
        ])
    )
    ->responseOnly() // returns $xc['response']
    ->exec('/api/usr');
print $xc;

Usage

/
 * @var array Set Configs and Defaults
 */
Curler::setConfig([
    'response_only' => false, // returns the response content as is
    'curl_trace'    => false, // track requests, (GET) Curl::getCurlTrace()
    'exceptions'    => false, // enable Exceptions
    'meta'          => false, // enable meta data
    'request_info'  => false, // [getallheaders(), $_SERVER] in 'meta'
    'curl_info'     => false, // CURL generated infos about the request in 'meta'

    // Default URL, will be prefixed to each request URL, disable with: ->disableDefaultUrl()
    'default_url'   => null,  // 'https://example.com'
    'date_format'   => 'Y-m-d H:i:s.u',

    // Convert images to valid data strings (no defaults defined)
    'image_to_data' => [], // 'image/jpeg', 'image/png', 'image/webp', 'image/gif', 'image/x-icon', 'image/svg+xml', ...

    // Send default headers (no defaults defined)
    'default_header' => [], // 'x-powered-by' => 'Many/Curler',

    // Add/overwrite CURL default options, see Curl::getOptions()
    'default_options' => [
        CURLINFO_HEADER_OUT => false,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_NONE,
        CURLOPT_URL => null,
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_HEADER => false,
        CURLOPT_HTTPHEADER => [],
        CURLOPT_POST => false,
        CURLOPT_POSTFIELDS => null, // (string) http_build_query($str)
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_VERBOSE => true,
        CURLOPT_AUTOREFERER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_CONNECTTIMEOUT => 90,
        CURLOPT_TIMEOUT => 90,
        CURLOPT_ENCODING => 'gzip',
        CURLOPT_USERAGENT => 'Many/Curler',
    ],

    // Set a callback function, that gets fired after first curl_exec(), eg. for logging
    'default_callback' => [], // => ['print_r', true],
]);

/
 * @var mixed Extended example with available methods
 */
$curl = (new Curler)

    ->method('post')            // Set http method, default is "get"
    ->url('http://example.com') // Set target url or path, same as ->exec(URL)

    /
     Misc/
    ->disableDefaultUrl()       // If default_url is setted, disable for this instance
    ->responseOnly()            // Returns CURL response content only
    ->requestInfo()             // getallheaders(), $_SERVER
    ->curlInfo()                // curl_getinfo()


    /
     Set CURL Options/
    ->setOpt(CURLOPT_ENCODING, 'zip')
    ->setOpt(CURLOPT_USERAGENT, 'Many/Curler')
    ->setOpt(CURLOPT_AUTOREFERER, false)

    // array alternate
    ->setOptArray([
        CURLOPT_ENCODING => 'zip',
        CURLOPT_USERAGENT => 'Many/Curler',
        CURLOPT_AUTOREFERER => false,
    ])


    /
     Header/
    ->header([
        'Authentication' => 'Many pw.2345',      // 'Authentication: Many pw.2345'
        'Authentication' => ['Many', 'pw.2345'], // 'Authentication: Many pw.2345'
    ])


    /
     HTTP Auth/
    ->httpAuth(CURLAUTH_BASIC) // protection type
    ->userPwd('user', 'pass')  // or ('user:pass')

    // CURLAUTH_ANY (.htaccess, uses basic or digest)
    ->authAny('user', 'pass')

    // CURLAUTH_BASIC
    ->authBasic('user', 'pass')

    // CURLAUTH_DIGEST
    ->authDigest('user', 'pass')

    // CURLAUTH_BEARER (?user optional, not .htaccess)
    ->authBearer('token.lr.72.m', '?user')


    /
     * Sets CURLOPT_CUSTOMREQUEST=POST and CURLOPT_POST=true internally.
     Arrays will be converted to strings using http_build_query()/
    ->post([
        'lorem_ipsum' => 'dolor sit amet',
    ])

    /
     * Set postfields avoiding internally setted stuff to send data as body
     * content, eg PUT. This class uses http_build_query(), if an array is
     given. Convert to any string format that fits your needs/
    ->postFields(
        json_encode([
            'lorem_ipsum' => 'dolor sit amet',
        ])
    )


    /
     * Callback, run multiple callbacks through chaining in the given order.
     Each callback will use the resulting content from the previous one./
    ->callback('json_decode', true)             // any PHP internal function
    ->callback('curlCallback')                  // custom function

    // Custom class
    ->callback('CallbackClass::run')            // (static) class::run()
    ->callback('CallbackClass::class', 'init')  // (new class)->init() # init() could be any method
    ->callback(CallbackClass::class, 'init')    // (new class)->init()

    // Closure
    ->callback(function($response) {
        // Do stuff with $response here and
        return $response;
    })

    // Pre validated callbacks, set simple validator functions to pre-validate the content.
    // If Exceptions are enabled, throws Exceptions on fail, otherwise function gets ignored
    ->callbackIf(['\Many\Http\Curler::isJson'], 'json_decode', true)
    ->callbackIf(['\Many\Http\Curler::isJsonObj'], 'json_encode')
    ->callbackIf(['is_string'], 'json_decode')

    // Shorthands
    ->jsonDecode(true)                          // Shorty for json_decode()
    ->jsonEncode(JSON_PRETTY_PRINT)             // Shorty for json_encode()
    ->htmlChars()                               // Shorty for htmlspecialchars()
    ->htmlSpecialChars()                        // Shorty for ->htmlChars()


    /
     Final execs, getter/
    ->exec() // OR
    ->exec('/api/endpoint', [
        CURLOPT_USERAGENT => 'AwesomeCurler', // set any CURL option here
    ])

    /
     * Alternate exec aliases. They all sets their name as REQUEST_METHOD
     * internally. You can use ->postFields(json_encode([])) to send content
     additionally in the body./
    ->delete() // OR
    ->delete('/api/endpoint', [/.../])

    ->get()
    ->get('/api/endpoint', [/.../])

    ->patch()
    ->patch('/api/endpoint', [/.../])

    ->put()
    ->put('/api/endpoint', [/.../])

Loading images

To convert images automatically to their valid string representations, set expected image types in setConfig (no defaults defined)

Curler::setConfig([
    'image_to_data' => [
        'image/jpeg',
        // 'image/png',
        // 'image/webp',
        // 'image/gif',
        // 'image/x-icon',
        // 'image/svg+xml',
        // ...
    ]
]);

$img = 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Aurora_and_sunset.jpg/200px-Aurora_and_sunset.jpg';

if ($src = (new Curler)->responseOnly()->get($img))
    printf('<img src="%s" alt="%s" />', $src, $img);

Exceptions

Catch AppCallbackException. The Class sends also additional http_header, if any errors occures.

use Many\Exception\AppCallbackException;

Curler::setConfig([
    'exceptions' => true,
]);

try {
    $get = (new Curler)
        ->callback('theImpossibleFunction')
        ->get('/app/endpoint');
} catch(AppCallbackException $e) {
    $failed = $e->getMessage();
}

Track requested URLs

To track CURL requests, set curl_trace to true, before doing any request.

Curler::setConfig([
    'curl_trace' => true,
]);

/ @var array Get all CURL requests with timestamps in an array */
$curlGetTrace = Curler::getCurlTrace();

Misc methods

/ @var int Get total amount of requests done so far */
$curlsTotal = Curler::getCurlCount();

/ @var array Get Config */
$curlGetConfig = Curler::getConfig();

/ @var array Get curl_setopt(), (true) all available CURL constants */
$curlGetOptions = Curler::getOptions(true);

/ @var mixed Get body content, (true) parsed to array */
$curlGetBodyContent = Curler::getBodyContent(true);

/ @var bool Check if val is JSON format */
$isJson = Curler::isJson('{}', true); // (true) strict mode

/ @var bool Check if val is valid JSON Object (is_array or is_object) */
$isJsonObj = Curler::isJsonObj([]);

/ @var string Readable Bytes */
$memUsage = Curler::readableBytes(memory_get_usage());

/ @var string Datetime with microseconds (microtime(true), $_SERVER['REQUEST_TIME_FLOAT']) */
$microDate = Curler::dateMicroSeconds(null, 'Y-m-d H:i:s.u');

/ @var string Get difference between two Dates with microseconds */
$microDateDiff = Curler::dateMicroDiff(
    Curler::dateMicroSeconds($_SERVER['REQUEST_TIME_FLOAT']), // script started (microtime(true))
    Curler::dateMicroSeconds(),                               // current microtime(true)
    '%s.%f'
);
  LivedemoExternal page  
  Files folder image Files  
File Role Description
Files folder image.github (1 directory)
Files folder imageapi (1 file)
Files folder imagepublic (5 files)
Files folder imagesrc (3 directories)
Files folder imagetests (2 files)
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE Lic. License text
Accessible without login Plain text file README.md Doc. Documentation
Accessible without login Plain text file vercel.json Data Auxiliary data

  Files folder image Files  /  .github  
File Role Description
Files folder imageworkflows (1 file)

  Files folder image Files  /  .github  /  workflows  
File Role Description
  Accessible without login Plain text file php.yml Data Auxiliary data

  Files folder image Files  /  api  
File Role Description
  Accessible without login Plain text file index.php Aux. Auxiliary script

  Files folder image Files  /  public  
File Role Description
  Accessible without login Plain text file app.responder.receiver.php Example Example script
  Plain text file callback.functions.php Class Class source
  Plain text file index.php Class Class source
  Accessible without login Plain text file README.md Doc. Documentation
  Accessible without login Plain text file www.example.json Data Auxiliary data

  Files folder image Files  /  src  
File Role Description
Files folder imageException (2 files)
Files folder imageHttp (1 file)
Files folder imageTraits (1 file)

  Files folder image Files  /  src  /  Exception  
File Role Description
  Plain text file AppCallbackException.php Class Class source
  Plain text file CurlException.php Class Class source

  Files folder image Files  /  src  /  Http  
File Role Description
  Plain text file Curler.php Class Class source

  Files folder image Files  /  src  /  Traits  
File Role Description
  Plain text file AppCallback.php Class Class source

  Files folder image Files  /  tests  
File Role Description
  Plain text file callback.functions.php Class Class source
  Accessible without login Plain text file index.php Test Class source

 Version Control Unique User Downloads Download Rankings  
 82%
Total:63
This week:0
All time:10,219
This week:154Up