鍍金池/ 問答/Python/ 資源分享WebAPP的API應(yīng)該如何設(shè)計?

資源分享WebAPP的API應(yīng)該如何設(shè)計?

在設(shè)計一個資源分享應(yīng)用。設(shè)計RESTful API時,在設(shè)計層面有些蒙圈了。特地求教各位。

物聯(lián)網(wǎng)設(shè)備通過設(shè)備云服務(wù)抽象成一個設(shè)備API。而我目前設(shè)計的Web APP則是通過與應(yīng)用業(yè)務(wù)的整合,將設(shè)備API封裝后,再次封發(fā)給第三方APP(比如其他合作平臺)和移動APP。

    DeviceAPI --> WebAPI -?-> Cloud|APK|APP

我現(xiàn)在有兩種選擇:

第一種來自Flask/Flask-RESTful的API設(shè)計,采用JSON格式。先采用API Key/Secret登陸,換取token,然后在后續(xù)訪問中采用token來訪問,也可以利用API Key/Secret繼續(xù)訪問。這是最常見的經(jīng)典方式。典型的URL風(fēng)格是:

http://host/api/version/resource/idx/

第二種來自Flask-appbuilder自帶的資源驅(qū)動的REST API,采用JSON格式。但是其鑒權(quán)方式采用經(jīng)典的username/password。換而言之,移動APP事實上是作為瀏覽器的替代物而存在的。唯一區(qū)別在于返回值采用JSON替代了XHTML。典型URL風(fēng)格是:

http://host/resource/api/idx

有些怪異,是吧?但URI字段順序并不是最重要的,我發(fā)現(xiàn)移動APP和第三方APP的需求是有差異的。

作為用戶,使用移動APP列出自己名下的設(shè)備列表,并通過設(shè)備ID來訪問特定設(shè)備的狀態(tài)讀取和指令下發(fā)。所以這種方式更加適合第二種方式。

作為合作方網(wǎng)站,需要訪問的范圍可能更加廣,雖然不能夠指令下發(fā),但是讀取特定設(shè)備的狀態(tài)也涉及到隱私權(quán)。這個似乎更加適合第一種方式。

必須依賴設(shè)備ID訪問特定設(shè)備,不同的用戶,不同的第三方平臺都需要單獨的設(shè)備密鑰。這兩種方式是否可以整合?

這個問題比較寬泛,歡迎指教和討論。

回答
編輯回答
避風(fēng)港

我發(fā)現(xiàn)flask-appbuilder的API URL其實是由sqlalchemy導(dǎo)出的,專為其后臺網(wǎng)頁的AJAX目的而設(shè)計。所以不完全符合RESTFul的架構(gòu)。而flask-restful則是根據(jù)RESTFul而設(shè)計導(dǎo)出的,其路徑可以有用戶自定義。

一般來說,針對Web、Mobile、前端的API,還是有所差異的。差異在于Web是固定IP的,而Mobile和瀏覽器前端IP不定,甚至是隱藏IP。這導(dǎo)致三者間鎖定和鑒權(quán)方式不一致。Web鎖定domain/IP,瀏覽器鎖定Referrer,Mobile無法鎖定。此外,對于apiKey/apiSecret/nouce/signature/TLS,以及登陸用戶的username/password等信息都通過session/cookie進行保存。

2017年2月18日 22:08
編輯回答
笨笨噠

我對你具體業(yè)務(wù)這一塊不是很了解啊。不過看你上面的問題,url是怎么樣的并不是那么重要,restful其實除了json,還有xml,form,url query等多種方式,flask-restful都是支持的。剩下主要問題就是鑒權(quán)方式,原理都差不多,無非是傳輸或存放的地方不一樣,可以是:session,cookie,url params,http header等等。

2018年1月23日 04:55