IoT Studio建立公開API
開發内容
公開API由IoT Studio的服務編排建立,以HTTP請求與HTTP傳回的方式提供調用端口。與直接建立的“HTTP請求/傳回”對相比,公開API不需要鑒權的AppKey與AppSecret,支援公網通路。
開發過程
STEP1 使用模闆建立
在IoT Studio的項目管理頁面中,選擇從模闆建立業務服務,如圖下圖所示。

如下圖所示,右上角單擊展開更多模闆,找到最後一個模闆:公開API。
業務邏輯名稱随意,模闆資訊中可以看到,使用該模闆建立的業務服務包含三個節點:HTTP請求、腳本節點和HTTP傳回。單擊使用該模闆建立。
STEP2 配置節點
建立完成後會自動跳轉到服務編輯器頁面。依次對節點進行配置。
- HTTP請求節點:
節點配置如下圖所示,配置Action參數為:public_api
- Node.js腳本節點:
節點配置如下圖所示,将傳回的payload内容修改為:"hello Saxon"
HTTP傳回節點不需要進行修改,保持預設配置即可。
單擊右上角的儲存後部署并釋出業務服務。
STEP3 擷取API域名
在服務清單中右鍵單擊建立的服務,選擇服務調用幫助。
彈出服務詳情頁面如下圖所示:
API Path即調用API的域名,單擊行末的複制。
注意
在釋出->域名管理頁面下也可以找到一個域名位址,如下圖所示。
顯示為預設API通路域名,但這個域名并不是調用API的域名!
筆者就是誤認為這個域名是調用API的域名,測試的請求結果為400,浪費了很久的時間。
STEP4 擷取參數
在STEP2 配置節點中,我們沒有對HTTP請求節點進行添加入參的操作,但這并不意味着對這個API的請求不需要參數。
向下滾動服務詳情頁面,找到請求示例,這裡提供了調用的API的示例代碼。切換比較直覺的Python版本,如下圖所示:
代碼中bodyMap和Headers的聲明,分别代表了請求主體資訊和請求頭資訊。
- bodyMap的内容如下:
{
'id': str(uuid.uuid4()),
'version': "1.0",
'request': {
'iotToken': "xxxx",
'apiVer': "1.0.0"
},
'params': {
# 接口參數
'action':"public_api",
}
}
其中uuid子產品用于根據使用的網卡和時間資訊生成一個随機的字元串。此處我們要根據樣例代碼獲知需要提供的參數資訊,是以可以以随機字元串代替。去除換行符與注釋,整理如下:
{'id':'random_id','version': "1.0",'request': {'iotToken': "xxxx",'apiVer': "1.0.0"},'params': {'action':"public_api"}}
- header的内容如下:
{
'accept': 'application/json'
}
也就是說,我們要在頭資訊中添加一條這樣的鍵值: 'accept': 'application/json'。
另一種參數
根據幫助文檔:
公開API,與貔閣同學提供的參考截圖:
我們需要在HTTP請求的Body中加入參數如下:
{'params':{'action':'public_api'},'request':{'apiVer':'1.0.0'},'version':'1.0','id': 12}
并且要在請求頭資訊中注明主體資訊的編碼方式為application/json
STEP5 使用POSTMAN測試請求
一切準備就緒,下面可以使用POSTMAN來實際測試API了。
啟動POSTMAN,建立HTTP請求如下圖所示:
請求方式為POST,域名使用STEP3中擷取的域名。由于貔閣提供的請求參數有成功的前車之鑒,先來測試他的方法:
貔閣的請求參數
在Header中添加body内容格式的資訊,如下圖所示:
由于application/json不屬于POSTMAN預設的主體資訊格式。body頁籤中,選擇資訊的格式為raw,并粘貼STEP4中擷取的參數到主體資訊中。如下圖所示。
一切準備就緒,單擊Send,傳回結果如下圖:
傳回的資料為"hello Saxon",與我們在服務開發中節點配置的内容一緻。請求成功。
請求示例的參數
同樣的步驟,建立一條請求如圖:
這次Header中鍵名輸入accept,鍵值不變。
填寫body内容如圖所示:
單擊Send,傳回成功資訊如下圖所示:
以上,兩種參數填寫方法都是可行的。
非公開API
前面的内容,我們基于公開API模闆進行的服務建立。下面來探讨,如果是不使用模闆,搭建完全相同的節點。會有什麼不同。
項目下直接建立業務服務如圖:
參考公開API模闆,添加節點:HTTP請求、Node.js腳本、HTTP傳回。将三者連接配接并配置HTTP請求如下圖所示:
Action參數為:api_test
同理,複制模闆中Node.js腳本的代碼,配置節點如圖:
HTTP傳回節點不需要修改,保持預設。
儲存,部署并釋出服務。打開服務調用幫助,這裡的頁面出現了差別:
相比公開API模闆建立的服務,這裡多出了項目AppKey與AppSecret。
向下滾動頁面,檢視Python的示例代碼:
這裡也出現了不同,需要在用戶端初始化時進行鑒權過程。
是以這裡建立的并不是公開API,公網可以通路,但是要經過鑒權。
猜想
注意到bodyMap中包含了iotToken項,鍵值為無意義的xxxx。而iotToken常用于物聯網裝置HTTP連接配接的鑒權。猜想在非公開API的調用過程中,sdk根據appKey與appSecret建立連接配接得到iotToken。接着替換bodyMap中的對應項,在實際API調用過程中,起到鑒權作用的隻是iotToken。換言之,如果得到了正确的iotToken,僅使用POSTMAN也可以完成非公開API的調用。
測試内容待補充。
Saxon
2020-3-8 15:25