pilskalns / f3-wcurl
cURL 的 F3 封装库,用于与外部 REST API 通信
Requires
- ext-curl: *
- bcosca/fatfree: ^3.6
README
目前,此插件未维护,并且很可能将继续这样。
依赖此插件的项目要么已经过时,要么已经找到其他形式,例如作为 Lambda 函数。
感谢 F3 开发者提供的框架,学习它并构建运行多年的自动化工具很愉快。一旦最后一个运行的项目下线,我将归档此存储库。请随意进行分支。
F3-wcurl
Fat Free Framework 插件:您的代码与外部 REST API 之间的桥梁。F3-wcurl 作为 cURL 的逻辑抽象层,处理身份验证和成功响应缓存。
F3 内置的 Web
插件非常出色且易于处理单个 HTTP 请求。F3-wcurl 在您的代码中构建了整个远程 API 的实现。
前言
随着时间的推移,我需要快速构建工具和脚本,它们具有一个基本但重复的任务:处理 cURL 请求、设置、对象、响应等。最终,我一直在复制相同的函数,修改它们并调试相同的问题 为什么几个月前的东西不工作。
尽管您可以对 cURL 选项进行很好的控制和访问,但 F3-wcurl 不会强迫您这样做。它让您专注于请求本身,它改变了什么,并接收什么回报。作为 F3 生态系统中的插件,它自然拥有一些酷炫的依赖项 - Prefab
、Cache
和 Web
(不针对 cURL 请求本身)。
初始化类
F3 类是由关联数组的相关设置构建的。数组可以直接从代码中传递,或者从 INI 文件(在构建 F3-wcurl 之前导入 F3)中传递,并存储在 F3 集群 中。
F3-wcurl 使用 F3 的 Prefab 和 Cache,这使得相同的 wcurl 对象可以从代码的任何地方调用,并快速响应。
默认情况下,F3-wcurl 将在 F3 集群中搜索 wcurl
键,但 INI 可以方便地存储多个不同 REST API 实现的设置。
$wcurl = \wcurl::instance([$iniName = 'wcurl' | $optionsArray]);
选项数组
这个相当简单的数组结构定义了 wcurl 的内部工作方式
更新选项
setOptions
要设置上表中任何选项,请传递包含一个或多个选项的 key => val
数组。
$wcurl->setOptions( [ 'useragent' = > 'F3-wcurl API integration', 'encodeJSON' = > false, 'ttl' = > 300, // etc ] );
只有您传递的选项将被更新,其他一切都将保持之前/默认状态。
clearOptions
要清除一个或多个选项,请传递名称或您希望重置为默认值的键的数组列表
$wcurl->clearOptions([ 'useragent', 'ttl' /*, ... etc */ ]);
getOptions
要获取表示 wcurl 类当前状态的完整选项数组
$wcurl->clearOptions();
返回的多维数组应与创建的数组兼容,以创建完全相同的类。
getStats
将返回自类创建以来执行的请求数量统计、接收的 http 响应数量以及从缓存中服务了多少个响应。
$wcurl->getStats();
HTTP 函数
目前支持的功能有 GET、POST、PUT、PATCH 和 DELETE。尽管如此,随着需要实现它们的需求,将添加更多功能。
GET
$response = $wcurl->get( string $url [, array $fill = null [, array $options = null ]] );
我这样记住参数。
UFO
- Url - 正确来说应该是 URL 的 PATH,或来自 rests 表的标识符(见下文)。
- Fill - 填充 rests 路径的值数组
- Options - 强制为此次请求特别设置任何选项
POST
$response = $wcurl->post( string $url, array $body = null [, array $fill = null [, array $options = null ]] );
UFBO - Url, Fill, Body, Options
PUT
$response = $wcurl->put( string $url, array $body = null [, array $fill = null [, array $options = null ]] );
UFBO - Url, Fill, Body, Options
PATCH
$response = $wcurl->patch( string $url, array $body = null [, array $fill = null [, array $options = null ]] );
UFBO - Url, Fill, Body, Options
DELETE
$response = $wcurl->delete( string $url, array $body = null [, array $fill = null [, array $options = null ]] );
UFBO - Url, Fill, Body, Options
使用REST点(REST points)表
REST点表有两个同等重要的用途
- 为了简化API路径,避免长字符串的拼写错误
- 填充这些字符串的部分,构建动态API调用路径
在构造长的远程URL路径时,通过简短的关键词更容易记住它们,尤其是如果它们从多个地方调用。例如,使用allmembers
而不是/lists/members/all/pages
。有时这些还包含独特的参数,每个请求都需要填充。这个概念是此插件存在的主要原因之一。
继续阅读。
设置命名路径
最好的方法是将远程路径存储在.ini
配置文件中。要填充的URL变量被两个%
包裹。
待办事项:使这个包裹字符可配置。
[wcurl.rests] allmembers=/lists/members/all/pages withVariable=/lists/members/%%memberID%%/pages
或者动态传递简单的key => value
数组 - 它将被合并到之前的配置中
$wcurl->setOptions( 'rests' => [ 'allmembers' => '/lists/members/all/pages', 'withVariable' => '/lists/members/%%memberID%%/pages', 'updateEmail' => '/lists/members/%%memberID%%/update' ] );
使用命名路径
要使用命名路由,传递其名称而不是完整路径
$response = $wcurl->get( 'allmembers' );
这将解析为/lists/members/all/pages
使用带变量的命名路径
$response = $wcurl->get( 'withVariable', array('memberID' => 'abc123ID') );
这将解析为/lists/members/abc123ID/pages
或者在POST请求中我们知道必须传递以下UFBO参数
$wcurl->post('updateEmail', // path shorthand to resolve name [ 'memberID' =>'abc123ID' ], // fill this in the path [ 'email'=>'andzs@pilskalns.lv' ] // body to send );
使用INI配置
如果您将所有配置放入主ini
文件中,则类只能在首次需要使用它时初始化。也就是说,当您的代码决定发送get()时。在那个时刻,如果类未在Prefab中注册,则将从INI配置中精确构建所需的内容。
有关选项数组的完整列表,请参阅上方几个滚动选项表。
[wcurl] root=http://mysite.api/v1 ttl=3600 cb_login=yourClass::cb_do_login useragent = Zeus was here headers = "Header: value", "Another-Header: Value" [wcurl.rests] allmembers=/lists/members/all/pages withVariable=/lists/members/%%memberID%%/pages ; Using with multiple API's [apitwo] root=http://yoursite.io/v2 ttl=60 useragent = Big Falcon Rocket [apitwo.rests] getUsers=/lists/members/all/pages getOneUser=/lists/members/%%memberID%%/pages
示例
cb_login
$wcurl->setLogin( callback 'yourClass::cb_do_login' );
如果任何请求导致HTTP 401或403代码,wcurl
调用登录回调函数,然后重复原始请求。如果再次出错,它将返回到原始函数的结果。wcurl
将cookie存储在API根的唯一临时文件中。此cookie文件包含在每个请求中。
回调必须返回true,如果登录成功,否则在认证成功后无法自动重复请求。
注意!如果登录失败,但仍然返回true
,它可能导致request->login->request->login...
无限循环
登录函数示例
static function cb_do_login(){ $wcurl = \wcurl::instance(); $login = $wcurl->post("/login", array( 'login'=> 'my_user', 'password'=> 'covfefe' ) ); if($login['status']['http_code']==200){ return true; } // or $wcurl->setOptions( [ 'basicauth' => "$user:$password"]); }
与多个API一起使用
调用\wcurl::instance()
时,它返回单例类,因此在代码的任何地方都使用相同的对象。要强制从类获取新实例,请使用类似的方法
$apiTwo = new wcurl([$iniName | $optionsArray]);
然后可以将$apiTwo
存储在F3蜂房中。
还有很多可以改进的地方,但目前将创建我需要的功能。如果您的情况中无法实现某些功能,请提交问题或甚至是PR。感谢F3开发者为这个出色的框架。如果您正在寻找像F3-wcurl这样的东西,但尚未使用它,那么请三思——为什么您还没有开始使用F3?