掌握 | 开发者 |
---|---|
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 hive 中搜索wcurl
键,但 INI 可以方便地保存多个不同 REST API 实现的设置。
$ wcurl = wcurl:: instance ([ $ iniName = ' wcurl ' | $ optionsArray ]);
这个相当简单的数组结构定义了 wcurl 的内部工作原理:
姓名 | 类型 | 默认 | 描述 |
---|---|---|---|
根 | 细绳 | 无效的 | 远程 API 根,用于构建请求 URI。 |
CB_登录 | 细绳 | 无效的 | 从代码中设置回调函数,该函数可以执行身份验证,这应该是call_user_func() 的有效回调 |
TTL | 整数 | 60 | 秒,缓存 GET 响应多长时间 |
标头 | 大批 | [ ] | cURL 有效的字符串数组 ["Header: value", "Another-Header: Value"] |
用户代理 | 细绳 | F3-wcurl版本 | 用户代理字符串 |
基本认证 | 细绳 | 无效的 | 发送基本身份验证标头,使用格式为username:password |
查询令牌 | 细绳 | 无效的 | 为每个请求附加 URL 令牌 |
编码JSON | 布尔值 | 真的 | 天气将 POST 正文序列化为 JSON,设置false 会将正文作为常规 HTML 表单发送 |
卷曲 | 大批 | [ ] | RAW cURL 设置 用于完全控制的 RAW cURL 设置数组,其中key => val ,其中 key 可以是常量或其字符串名称 |
休息 | 大批 | [ ] | key => val 表(参见示例部分) |
要设置上表中的任何选项,请传递带有一个或多个选项的key => val
数组。
$ wcurl -> setOptions (
[
' useragent ' = > ' F3-wcurl API integration ' ,
' encodeJSON ' = > false ,
' ttl ' = > 300 ,
// etc
]
);
只有您传递的选项才会更新,其他所有内容都将保持先前/默认状态。
要清除一个或多个选项,请传递您希望重置为默认值的键的名称或数组列表:
$ wcurl -> clearOptions ([ ' useragent ' , ' ttl ' /*, ... etc */ ]);
要获取代表 wcurl 类当前状态的完整选项数组:
$ wcurl -> clearOptions ();
返回的多维数组应该兼容,以创建与从中提取的类完全相同的类。
将返回统计信息,自创建类以来执行了多少个请求、收到了多少个 http 响应以及从缓存中提供了多少个响应。
$ wcurl -> getStats ();
目前支持的函数有 GET、POST、PUT、PATCH 和 DELETE。不过,当我意识到需要实施它们时,我会添加更多内容。
$ response = $ wcurl -> get ( string $ url [, array $ fill = null [, array $ options = null ]] );
我记得这样的争论。
飞碟:
$ response = $ wcurl ->post( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - 网址、填充、正文、选项
$ response = $ wcurl ->put( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - 网址、填充、正文、选项
$ response = $ wcurl ->patch( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - 网址、填充、正文、选项
$ response = $ wcurl ->delete( string $ url , array $ body = null [, array $ fill = null [, array $ options = null ]] );
UFBO - 网址、填充、正文、选项
休息表有两个同样重要的目的:
构建长远程 URL 路径时,通过短关键字更容易记住它们,尤其是从多个位置调用它们时。像allmembers
而不是/lists/members/all/pages
。有时,这些还包含独特的参数,需要根据每个请求填写。这个概念是这个插件存在的主要原因之一。
继续阅读。
最好的方法是将远程路径存储在.ini
配置中。用于填充的 URL 变量包裹在两侧的两个%
中。
TODO:使该换行字符可配置。
[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 ' => ' [email protected] ' ] // body to send
);
如果将所有配置放在主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
$ wcurl -> setLogin ( callback ' yourClass::cb_do_login ' );
如果任何请求导致 HTTP 401 或 403 代码, wcurl
会调用登录回调函数,然后重复原始请求。如果再次出现错误,则返回原始函数结果。 wcurl
将 cookie 存储在 API 根特有的临时文件中。此 cookie 文件包含在每个请求中。
如果登录成功,回调必须返回true,否则验证成功后将无法自动重复请求。
注意!如果登录不起作用,但仍然return 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 " ]);
}
当调用wcurl::instance()
时,它像单例类一样返回,因此在代码中的任何位置,都使用相同的对象。要从类中强制使用新实例,请使用类似
$ apiTwo = new wcurl ([ $ iniName | $ optionsArray ]);
然后$apiTwo
可以存储在 F3 hive 中。
还有很多需要改进的地方,但目前正在制作我需要的功能。如果您的用例无法实现某些功能,请提交问题甚至 PR。感谢 F3 开发人员提供了这个出色的框架。如果您正在寻找 F3-wcurl 之类的东西,但不使用它,那么请三思 - 为什么您还没有使用 F3?