掌握 | 開發者 |
---|---|
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?