姓名:????學(xué)號:17101223416
轉(zhuǎn)載自:https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=407211054&idx=1&sn=ef7e3518a8c26e40abd90332048e0888&scene=38#wechat_redirect
【嵌牛導(dǎo)讀】:現(xiàn)在的手機(jī)端應(yīng)用,不管是iOS還是Android, 不聯(lián)網(wǎng)的幾乎寥寥無幾。那手機(jī)的的應(yīng)用怎么調(diào)用服務(wù)器提供的接口,來實(shí)現(xiàn)業(yè)務(wù)功能呢? ? 在設(shè)計(jì)的時候需要考慮三方面的問題
【嵌牛鼻子】:通信協(xié)議、接口協(xié)議、會話管理
【嵌牛提問】:手機(jī)端是怎么訪問網(wǎng)絡(luò)的呢?
【嵌牛正文】:
【通信協(xié)議】
其實(shí)很簡單, 最常見的方法就是利用Http協(xié)議, 服務(wù)器端對外提供Http的接口;客戶端向服務(wù)器發(fā)出GET, POST請求, 調(diào)用接口,從服務(wù)器的響應(yīng)中獲取數(shù)據(jù)。
當(dāng)然寫Http底層的代碼也很累, 你得把數(shù)據(jù)組織成Http協(xié)議的header ,body ,通過網(wǎng)絡(luò)發(fā)送出去。
還得解析服務(wù)器的響應(yīng), response code (像200, 500 ), response body 等;
如果要遇到發(fā)送文件,還得支持MultiPart。
絕對是又臟又累的活,還很容易出錯。
還好現(xiàn)在不少開源的代碼已經(jīng)替你把這些臟活累活已經(jīng)干了,可以直接使用, 例如大名鼎鼎HttpClient , 使用這些代碼你完全不用考慮Http實(shí)現(xiàn)的細(xì)節(jié), 只需要知道服務(wù)器端接口的協(xié)議即可。
【 接口協(xié)議】
主要包括三個部分
(1) 接口的url : ? ?例如https://www.mybank.com/interface/login
(2) 是GET 還是 POST ??
(3) 參數(shù) , 例如 username=xxxx , password=xxxx
(4) 響應(yīng)的數(shù)據(jù) ?, 可以是xml , 也可以是json , ?json 現(xiàn)在的使用比較廣泛。
知道了這些東西, 可以輕松的寫一段HttpClient 代碼來調(diào)用了, 下面的代碼就是通過Post的方式來向服務(wù)器端發(fā)送用戶名和密碼, 做登錄操作
Request.Post("https://www.mybank.com/interface/login")
.bodyForm(Form.form().add("username",??"vip").add("password",??"secret").build())
.execute().returnContent();
注意上面的代碼用了HttpClient 的Fluent API, ?這個API用起來有一口氣寫到底的感覺, 讀起來很舒服。
這里能找到Fluent API的細(xì)節(jié), 這里再強(qiáng)調(diào)一下, 開源軟件自帶的例子和教程是非常好的學(xué)習(xí)資料, 網(wǎng)上很多的文章其實(shí)就是對這些東西的破碎的翻譯,最好是練好英文, 閱讀最權(quán)威的,原汁原味的資料。
【 會話管理】
我們知道,用戶通過瀏覽器登錄網(wǎng)站以后, ?服務(wù)器可以產(chǎn)生session (會話), 這個session 通常會以cookie的方式(在Http協(xié)議的Header 中)發(fā)送給瀏覽器, 瀏覽器需要保存起來, 再次訪問網(wǎng)站的時候, 會把cookie帶過去, 這樣服務(wù)器就知道用戶是誰了。
session 一般有個過期時間,例如30分鐘, 超過這個時間如果瀏覽器不再訪問的話, 這個session 就過時了, 需要重新登錄。
手機(jī)端應(yīng)用當(dāng)然也可以模擬瀏覽器, 以同樣的方式處理, ?登錄以后,就把服務(wù)器發(fā)的session ID 保存起來, 下次訪問其他接口時把這個session 發(fā)過去就可以了。
但是你仔細(xì)想一下,手機(jī)和瀏覽器是不一樣的: 手機(jī)端經(jīng)常是登錄以后, 可以長時間不操作(例如7天), session 也不會過期。
很多手機(jī)端應(yīng)用可以保持很長時間的會話狀態(tài), 例如7天以內(nèi)不操作都不會過期, 7天以后才會要求重新登錄。
這樣服務(wù)器針對瀏覽器搞的Cookie 超時時間 30分鐘就太短了。
換句話說,手機(jī)端應(yīng)用由于操作的特性, 需要保持一個長會話(3天, 7天。。), 傳統(tǒng)的session機(jī)制不合適。
這時候需要我們自己來設(shè)計(jì)實(shí)現(xiàn)一個會話的管理機(jī)制:
1. 手機(jī)端應(yīng)用調(diào)用服務(wù)器端的登錄接口。
2. 服務(wù)器生成一個token , token 可以通過算法設(shè)計(jì)成一個隨機(jī)的字符串, 讓黑客無法猜出。 服務(wù)器把token 放到緩存或者數(shù)據(jù)庫中, 設(shè)置一個過期時間,例如7天
3. 服務(wù)器把token 發(fā)回給手機(jī)端
4. 手機(jī)端保存該token , ?每次訪問其他接口的時候需要把token 也發(fā)到服務(wù)器端做認(rèn)證, 如果服務(wù)器端發(fā)現(xiàn)token 過期, 就會要求手機(jī)端重新登錄
這樣就實(shí)現(xiàn)了一個長時間的會話管理。