## 6.1.1 用一句話來描述接口請求
為了給客戶端統一接口請求調用的規范性、流暢性和簡單易懂,我們特別為此使用了內部領域特定語言: **接口查詢語言** (Api Structured Query Language) 。
###從外部DSL的角度來看待接口查詢的操作
```javascript
create
withHost host
withFilter filter
withParser parser
reset #特別注意:重復查詢時須重置請求狀態
withService service
withParams paramName1 paramValue1
withParams paramName2 paramValue2
withParams ... ...
withTimeout timeout
request
```
根據此設計理念,各客戶端語言都可以實現此接口請求的操作。
## 6.1.2 接口查詢語言設計理念與示例
### (1)文法:create -> with -> request
所用到的查詢文法如下(通常從上往下依次操作,順序不強制):
操作|參數|是否必須|是否可重復調用|作用說明
---|---|---|---|---
create|無|必須|可以,重復調用時新建一個實例,非單例模式|需要先調用此操作創建一個接口實例
withHost|接口域名|必須|可以,重復時會覆蓋|設置接口域名,如:http://demo.phalapi.net/
withFilter|過濾器|可選|可以,重復時會覆蓋|設置過濾器,與服務器的DI().filter對應,需要實現PhalApiClientFilter接口
withParser|解析器|可選|可以,重復時會覆蓋|設置結果解析器,僅當不是JSON返回格式時才需要設置,需要實現PhalApiClientParser接口
reset|無|通常必須|可以|重復查詢時須重置請求狀態,包括接口服務名稱、接口參數和超時時間
withService|接口服務名稱|通常必選|可以,重復時會覆蓋|設置將在調用的接口服務名稱,如:Default.Index
withParams|接口參數名、值|可選|可以,累加參數|設置接口參數,此方法是唯一一個可以多次調用并累加參數的操作
withTimeout|超時時間|可選|可以,重復時會覆蓋|設置超時時間,單位毫秒,默認3秒
request|無|必選|可以,重復發起接口請求|最后執行此操作,發起接口請求
### (2)JAVA示例
以JAVA版本為例,演示如何調用:
最簡單的調用,也就是默認接口的調用:
```javascript
PhalApiClientResponse response = PhalApiClient.create()
.withHost("http://demo.phalapi.net/") //接口域名
.request(); //發起請求
```
通常的調用,即有設置接口服務名稱、接口參數和超時:
```javascript
PhalApiClientResponse response = PhalApiClient.create()
.withHost("http://demo.phalapi.net/")
.withService("Default.Index") //接口服務
.withParams("username", "dogstar") //接口參數
.withTimeout(3000) //接口超時
.request();
```
高級復雜調用,即設置了過濾器、解析器的操作:
```javascript
PhalApiClientResponse response = PhalApiClient.create()
.withHost("http://demo.phalapi.net/")
.withService("Default.Index")
.withParser(new PhalApiClientParserJson()) //設置JSON解析,默認已經是此解析,這里僅作演示
.withParams("username", "dogstar")
.withTimeout(3000)
.request();
```
## 6.1.3 更好的建議
### (1)不支持面向對象的實現方式
此接口查詢的用法是屬于基礎的用法,其實現與宿主語言有強依賴關系,在不支持面向對象語言中,如javascript,可以使用函數序列的方式,如:
```javascript
create();
withHost('http://demo.phalapi.net/');
withService('Default.Index');
withParams('username', 'dogstar');
withTimeout(3000);
var rs = request();
```
### (2)封裝自己的接口實例
通常,在一個項目里面我們只需要一個接口實例即可,但此語言沒默認使用單例模式,是為了大家更好的自由度。
基于此,大家在項目開發時,可以再進行封裝:提供一個全局的接口查詢單例,并組裝基本的接口公共查詢屬性。
即分兩步:初始化接口實例,以及接口具體的查詢操作。
如第一步先初始化:
```javascript
PhalApiClient client = PhalApiClient.create()
.withHost("http://demo.phalapi.net/")
.withParser(new PhalApiClientParserJson());
```
第二步進行具體的接口請求:
```javascript
PhalApiClientResponse response = client.reset() #重復查詢時須重置
.withService("Default.Index")
.withParams("username", "dogstar")
.withTimeout(3000)
.request();
```
這樣,在其他業務場景下就不需要再重復設置這些共同的屬性(如過濾器、解析器)或者共同的接口參數。
### (3)超時重試
當接口請求超時時,統一返回 ret = 408,表示接口請求超時。此時可進行接口重試。
如:
```javascript
PhalApiClient client = PhalApiClient.create()
.withHost("http://demo.phalapi.net/")
PhalApiClientResponse response = client.request();
if (response.getRet() == 408) {
response = client.request(); //請求重試
}
```
- 歡迎使用PhalApi!
- 接口,從簡單開始!
- [1.1]-下載與安裝
- [1.2]-創建一個自己的項目
- [1.3]-在線體驗
- [1.4]-文檔、幫助和官網
- [1.10]-對PhalApi框架的抉擇
- [1.11]-快速入門(backup)
- [1.12]-參數規則:接口參數規則配置
- [1.13]-統一的接口請求方式:_sevice=XXX.XXX
- [1.14]-統一的返回格式和結構:ret-data-msg
- [1.15]-數據庫操作:基于NotORM的使用及優化
- [1.16]-配置讀取:內外網環境配置的完美切換
- [1.17]-日記紀錄:簡化版的日記接口
- [1.18]-快速函數:人性化的關懷
- [1.19]-DI服務速查:各資源服務一覽表
- [1.20]-DB操作:數據庫基本操作速查
- [1.21]-類的自動加載:遵循PEAR包的命名規范
- [1.22]-簽名驗證:自定義簽名規則
- [1.23]-請求和響應:GET和POST兩者皆可得及超越JSON格式返回
- [1.24]-緩存策略:更靈活地可配置化的多級緩存
- [1.25]-國際化翻譯:為走向國際化提前做好翻譯準備
- [1.26]-數據安全:數據對稱加密方案
- [1.27]-精益開發:更富表現力的Model層和重量級數據獲取的應對方案
- [1.28]-COOKIE:對COOKIE原生態的支持及記憶加密升級版
- [1.29]-開放與封閉:多入口和統一初始化
- [1.30]-保持的力量:接口開發最佳實踐
- [1.31]-新型計劃任務:以接口形式實現的計劃任務
- [2.11]-核心思想:DI依賴注入-讓資源更可控
- [2.12]-海量數據:可配置的分庫分表
- [2.13]-接口調試:在線SQL語句查看與性能優化
- [2.14]-測試驅動開發:意圖導向編程下的接口開發
- [2.15]-演進:新型計劃任務續篇
- [2.16]-領域驅動設計:應對復雜領域業務的Domain層
- [2.17]-微服務:Api接口服務層
- [2.18]-定制化:資源服務的再實現
- [2.19]-擴展庫:可重用的擴展類庫
- [2.20]-約定編程:架構明顯的編程風格
- [2.21]-服務器統一部署方案簡明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益項目和團隊建設
- [3.1]-擴展類庫:微信開發
- [3.2]-擴展類庫:代理模式下phprpc協議的輕松支持
- [3.3]-擴展類庫:基于PHPMailer的郵件發送
- [3.4]-擴展類庫:優酷開放平臺接口調用
- [3.5]-擴展類庫:七牛云存儲接口調用
- [3.6]-擴展類庫:新型計劃任務
- [3.8]-擴展類庫:用戶、會話和第三方登錄集成
- [3.9]-擴展類庫:swoole支持下的長鏈接和異步任務實現
- [3.11]-擴展類庫:基于FastRoute的快速路由
- [4.2]-開發實戰2:模擬優酷開放平臺接口項目開發
- [4.3]-開發實戰3:一個簡單的小型項目開發(奔跑吧兄弟投票活動)
- [5.1]-架構與思想:PhalApi核心設計和思想解讀
- [5.2]-雜談:扯一些PhalApi的前世和今生
- [5.3]-框架總結:術語表和PHP開發建議
- [5.4]-許可
- [5.5]-聯系和加入我們
- [5.6]-更新日記
- [5.8]-致框架貢獻者:加入PhalApi開源指南
- [6.1]-基于接口查詢語言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi視頻教程
- 附錄1:接口文檔參考模板