者:西嵐
轉發鏈接:https://juejin.im/post/5dadd0236fb9a04de04d968e
只需編寫簡單的云函數,就可以實現自己的業務邏輯,發布后就可以生成自己的接口給客戶端調用。
果創云支持對云函數進行在線接口編程,進入開放平臺我的接口 - 在線接口編程,設計一個新接口,設計和配置好接口參數、接口名稱、接口返回后,再把云函數源代碼填上,提交審核通過并發布后即可使用。
云函數編寫入口:在線接口編程。
云函數具有以下特點和優勢:
云函數由開發者自己編寫,發布后可生成自己的云接口,即MyAPI,而云函數底層則依賴于果創云提供的基礎服務。
因此,云函數整體架構如下:
整體架構分為四層:
當前只支持PHP云函數,開發者自定義的云函數,需要符合PHP語法。其云函數簽名和云函數模板如下:
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
// TODO
// 在這里編寫你的具體業務
return $result;
}
云函數參數說明:
如何獲取客戶端傳遞過來的接口參數?
在果創云開放接口參數配置,添加參數后,就可以在源代碼中獲取。如下:
假設,配置的接口參數名字為:abc,那么在PHP源代碼中,獲取接口參數的方式是從$params參數中獲取,如:
$abc=$params['abc'];
參數名稱和配置的接口名稱一致。并且,此時獲取的接口參數會根據配置的接口參數規則進行過濾、轉換和檢測。
溫馨提示:接口會自動對客戶端的參數進行校驗、核對和轉換,通過$params參數獲取的是最終可用的參數。
開頭不需要<?php標簽,結束不需要?>標簽。你可以在本地調試好PHP代碼函數,或者通過在線工具編寫和運行你的PHP代碼。
特別注意以下幾點:
如何進行本地調試? 在本地調試時,可以這樣執行你的PHP代碼。首先,創建一個PHP文件,例如:yesapi.php,然后在里面放置代碼:
<?php
$fun=function ($params, $di) {
// 函數內的代碼復制過來
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['sum']=$params['left'] + $params['right'];
return $result;
};
// 模擬一些測試數據
$params=array('left'=> 1, 'right'=> 2);
// 執行函數,輸出結果
var_dump($fun($params, array()));
// 輸出結果 1+2=3
array(3) {
["err_code"]=>
int(0)
["err_msg"]=>
string(0) ""
["sum"]=>
int(3)
}
即這樣執行,通過CLI方式運行。
$ php ~/tmp/test.php
array(3) {
["err_code"]=>
int(0)
["err_msg"]=>
string(0) ""
["sum"]=>
int(3)
}
溫馨提示:在本地沒有$di服務,可以使用空數組來代替,或進行模擬測試。
如何返回接口結果呢?
以下是一個返回示例:
return array('err_code'=> 0, 'err_msg'=> '', 'title'=> 'Hi, 歡迎使用果創云開放接口!');
注意,應該在函數的最后一行代碼通過return關鍵字返回結果。結果的類型是數組,且應包括:err_code、err_msg這兩個基本字段,以及其他需要自定義的返回字段。其中,約定err_code為0表示成功。
以下是一個簡單的例子,進行兩個數的相加。
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['sum']=$params['left'] + $params['right'];
return $result;
}
添加一個新接口,并進行編輯:
編寫接口時,設置接口參數、接口返回、云函數代碼等,如(局部截圖):
保存后,你可以看到類似這樣的在線接口文檔(部分截圖):
在完成接口設計和云函數開發后,就可以勾選“申請發布”。等審核通過后即可發布和使用。
。
發布通過后,你就可以生成了自己的云接口,以及在線接口文檔。
在線接口文檔,可以提供給客戶端開發人員查看和接入使用;云接口可以提供給客戶端進行調用。
生成的完整在線接口文檔類似:
接口文檔地址:
http://api.yesapi.cn/docs.php?service=SVIP.Sdogstar_MyApi.ATest&detail=1&type=fold
客戶端調用后,就可以得到云函數執行后的結果。
編寫好云函數后,會自動生成云接口,和接口文檔。如果需要,也可以自己手動編寫接口文檔。
溫馨提示:如果需要手動編寫API接口文檔,可以進入我的在線文檔編輯,保存后可發布接口文檔。
文檔編輯后臺:
保存后,外部查看的接口文檔效果:
如果需要支持多個客戶端調用API接口,可以【客戶端管理】,添加客戶端應用,然后分配app_key和密鑰。
以下通過代碼示例和模板,介紹云函數如何進行開發,大家可以把代碼復制過去,稍作修改。只需要簡短的幾行PHP代碼,或者一段代碼,你就實現自己的業務邏輯,無需管理服務器即可運行移動后端代碼。
在開始,以下是一些重要的知識點和注意事項。
再重復說明下,直連數據庫和我的模型數據庫操作一樣,區別在于:直連數據庫在使用前需要先配置接入你的數據庫,DI服務使用$di['db_super'],最后需要填寫完整的表名稱,不需要額外的_tbl后綴。
DI服務 功能說明 備注 $di['db'] 我的模型數據庫 可進行CURD數據庫操作,針對單表 $di['db_super'] 直連數據庫 可進行CURD數據庫操作,針對單表,使用前需要進行MySQL數據庫直連服務配置 $di['logger'] 日志服務 紀錄各種日志 $di['email'] 郵箱服務 發送郵件,使用前需要進行郵箱服務配置 $di['pinyin'] 拼音服務 將漢字轉成拼音 $di['curl'] CURL服務 請求遠程接口,僅支持80端口 $di['crypt'] 安全服務 對數據進行加密和解密 $di['sms_aliyun'] 阿里云短信 通過阿里云服務發送短信,使用前需要進行阿里云服務配置
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['sum']=$params['left'] + $params['right'];
return $result;
}
假設傳遞參數為:left=1&right=2,請求此云函數后,將會得到如下結果:
{
"ret": 200,
"data": {
"err_code": 0,
"err_msg": "",
"sum": 3
},
"msg": "V2.1.1 YesApi"
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['count']=$di['db']->article_tbl->count('id'); // 模型名稱后面須帶上_tbl后綴
return $result;
}
假設你有模型如下,有23條數據:
請求此云函數后,將會得到如下結果:
{
"ret": 200,
"data": {
"err_code": 0,
"err_msg": "",
"count": 23
},
"msg": "V2.1.1 YesApi"
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$article=$di['db']->article_tbl;
$article->insert($data);
$result['id']=$article->insert_id(); // 返回新增的ID
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['article']=$di['db']->article_tbl->where('id', 1)->fetchOne(); // 取出id=1的文章數據
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$data=array('title'=> '新文章標題', 'content'=> '文章內容'); // 待更新的數據
$result['update_row']=\$di['db']->article_tbl->where('id', 1)->update($data); // 更新id=1的文章數據,返回更新的數量
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['delete_row']=$di['db']->article_tbl->where('id', 1)->delete(); // 刪除數據,返回刪除的數量
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['list']=$di['db']->article_tbl->where('id > ?', 1)->where('id < ?', 10)->fetchAll(); // 取出id從1到10的全部數據
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['list']=$di['db']->article_tbl
->select('id, title, content')
->where('id', 1) // 精確區配
->where('name LIKE ?', '%小白%') // 模糊匹配
->where('id', array(1, 2, 3)) // 范圍枚舉
->where('id > ?', 1) // 范圍大于
->where('id < ?', 10) // 范圍小于
->where('id BETWEEN ? AND ?', array(1, 10)) // 范圍介于
->or('status', 1) // 或邏輯條件
->order('add_time DESC') // 按時間降序
->limit(0, 100) // 分頁,取出前面100條
->fetchAll(); // 取全部數據
return $result;
}
溫馨提示:獲取列表數據時,一定要使用limit限制分頁數量,否則會審核不通過。
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
// 第一個參數為網址,第二個參數表示超時時間(單位毫秒)
$result['res']=$di['curl']->get('http://demo.phalapi.net/?username=YesApi', 3000);
// 得到結果類似:{"ret":200,"data":{"title":"Hello YesApi","version":"2.13.3","time":1590764249},"msg":""}
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
// 第一個參數為網址,第二個參數是POST的參數,第三個參數表示超時時間(單位毫秒)
$result['res']=$di['curl']->post('http://demo.phalapi.net/', array('username'=> 'YesApi'), 3000);
// 得到結果類似:{"ret":200,"data":{"title":"Hello YesApi","version":"2.13.3","time":1590764249},"msg":""}
return $result;
}
溫馨提示:通過云函數以及CURL,可以對原有的API接口進行封裝,形成對外開放的接口API。
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$di['logger']->record('DEBUG', '調試日志,這里可放日志內容');
$di['logger']->record('INFO', '業務日志,這里可放日志內容');
$di['logger']->record('INFO', array('uuid'=> 'ABC', 'tip'=> '第二個參數還可以是數組'));
$di['logger']->record('NOTICE', '提醒日志,這里可放日志內容');
$di['logger']->record('WARNNING', '警告日志,這里可放日志內容');
$di['logger']->record('ERROR', '錯誤日志,這里可放日志內容');
return $result;
}
溫馨提示:日志紀錄后,可以到開放平臺查看日志。
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
// 第一個參數是收件人郵箱,第二個參數是郵件標題,第三個參數是郵件正文內容(HTML格式)
$result['is_send']=$di['email']->send('helper@yesapi.cn', '郵件標題', '郵件內容');
return $result;
}
溫馨提示:使用前請先配置郵箱服務配置。
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['encrypt_data']=$di['crypt']->encrypt('YesApi'); // 對數據進行加密
$result['decrypt_data']=$di['crypt']->decrypt($result['encrypt_data']); // 對數據進行解密
return $result;
}
溫馨提示:每個app_key加密的數據,只能由自己的app_key進行解密。
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$result['pinyin_1']=$di['pinyin']->convert('小白接口'); // 將一段漢字串內容轉成拼音,結果是:xiao bai jie kou
$result['pinyin_2']=$di['pinyin']->abbr('小白接口'); // 獲取拼音首字母,結果是:x b j k
$result['pinyin_3']=$di['pinyin']->name('張三'); // 姓名轉拼音,結果是:zhang san
return $result;
}
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
// 參數1:手機號,參數2:短信簽名,參數3:短信模板,參數3:更多數組參數(沒動態參數時可傳空數組)
$di['sms_aliyun']->aliyunSendSms('13800138000', '小白接口', 'SMS_153055065', array('code'=> '123456'));
return $result;
}
溫馨提示:使用前需要進行阿里云服務配置
function ($params, $di) {
$result=array('err_code'=> 0, 'err_msg'=> '');
$time=time(); // 當前時間戳,例如:1590561632
$datetime=date('Y-m-d H:i:s'); // 當前時間,例如:2020-05-20 00:00:00
$arr=json_decode('{"name":"YesApi"}', true); // json解析成數組
$json=json_encode($arr); // 數組轉json
$md5=md5('123456'); // md5操作
return $result;
}
更多示例,即將到來!
淺
說到發短信驗證碼接口,第一印象就是好貨不便宜,速度快、送達率高的通道各大短信接口廠商收費也好貴,小微個人不舍得接入,也不符合大部分大廠的準入門檻。
想著自己幾張手機卡面每月還有幾千條免費短信是不是能好好利用一下,做個能發送短信的app在后臺運行問題也不大,不過自己手機號還是不要亂搞的為好。
曙光
研發App過程中發現有幾個大平臺對App提供免費短信驗證碼,微博開放平臺、Mob,App上用完全免費,但Web Api都不免費,也許App內接入SDK可以讓他們收回成本吧(真實情況是:收益遠大于成本)。
雖然不直接提供免費Web Api,那我們是不是可以通過App來發驗證碼:手機打開App在后臺運行,只有有發驗證碼的需求時,App自動調用SDK發送驗證碼。
通過研究微博和Mob的文檔發現,理論上是可行的,除了符合國情的標準限制(單手機號每分鐘、每天限制)外,每個應用也有速率限制。但對小微網站來講(沒啥流量的博客啥的),遠遠夠用,一天撐死了發100條短信,一小時下來也發不了幾條。
注意:流量大的不能用本文這個方法,穩定性和安全性大幅下降,都有這么大流量了,應該不差錢接穩定的短信接口吧。本文只適用于學習、小流量網站之用。
說干就干
首先要有個App,并且接入了免費短信SDK,能正常發短信(沒有?寫一個App,然后嘗試申請一下)。有很多混合app開發平臺,會js+css就能開發出來,當然原生的最好。
流程圖:
流程分解
一、自研短信API網關
就是個普通REST API,提供3個接口:
二、一個手機+自研App(只要成功接入第三方就行)
當然是手機后臺跑著我們的App,然后定時拉取自研短信API網關的隊列數據,有發送請求數據就調用第三方SDK進行驗證碼發送,順帶保存回執。
三、網站使用
在需要發短信驗證碼的地方調用我們自己的短信API網關。
用戶提交短信驗證碼后調用第三方接口對驗證碼進行校驗(也許有第三方可以發自定義短信,驗證碼由我們自己生成,就不需要和第三方打交道了)。
注意要點
使用案例
由于我沒用5分錢的短信接口,用戶首次發送驗證碼走的是老東家App的SDK免費短信接口。比如:注冊、找回密碼、綁定支付寶賬號使用到此接口。
我用一個老手機來運行的App,15秒播報語音播報一次錯誤數量(報警用),一直放在那里不動,一直報0,效果還不錯。
后臺App
純javascript代碼實現的,截了個圖:
好了,喜歡自己動手的小伙伴可以去試一下了。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。