eypsilon / manycurler
Many/Curler | 另一种将灰尘CURL起来的方法
v1.0.4
2023-03-10 08:00 UTC
Requires
- php: >=8.0
This package is auto-updated.
Last update: 2024-09-10 14:56:31 UTC
README
这个类是用链式方法和更易记的名称来简化PHP中CURL使用的。
我需要一个简单的方法来通过http和Bearer token认证方案探索Shopware API(v6.*),但未找到我想要的方法,所以我最终做出了这个。它没有任何新功能,没有任何令人兴奋之处,只是像您期望的那样简单地向URL和端点发送请求,但比CURL本身更美观。
请参阅 ./public/index.php 中的示例,或在 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;
使用方法
/** * @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', [/* ... */])
加载图片
要将图片自动转换为有效的字符串表示,请在 setConfig
中设置预期的图片类型(没有默认值定义)
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);
异常
捕获 AppCallbackException。如果发生任何错误,类还会发送额外的http_header。
use Many\Exception\AppCallbackException; Curler::setConfig([ 'exceptions' => true, ]); try { $get = (new Curler) ->callback('theImpossibleFunction') ->get('/app/endpoint'); } catch(AppCallbackException $e) { $failed = $e->getMessage(); }
跟踪请求的URL
要跟踪CURL请求,请在进行任何请求之前将 curl_trace
设置为 true。
Curler::setConfig([ 'curl_trace' => true, ]); /** @var array Get all CURL requests with timestamps in an array */ $curlGetTrace = Curler::getCurlTrace();
其他方法
/** @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' );