姓名:怕嶙觯康 ?學(xué)號(hào):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ì)的時(shí)候需要考慮三方面的問題
【嵌牛鼻子】:通信協(xié)議、接口協(xié)議贺归、會(huì)話管理
【嵌牛提問】:手機(jī)端是怎么訪問網(wǎng)絡(luò)的呢淆两?
【嵌牛正文】:
【通信協(xié)議】
其實(shí)很簡單, 最常見的方法就是利用Http協(xié)議拂酣, 服務(wù)器端對(duì)外提供Http的接口秋冰;客戶端向服務(wù)器發(fā)出GET, POST請(qǐng)求, 調(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。
絕對(duì)是又臟又累的活商蕴,還很容易出錯(cuò)叠萍。
還好現(xiàn)在不少開源的代碼已經(jīng)替你把這些臟活累活已經(jīng)干了,可以直接使用绪商, 例如大名鼎鼎HttpClient 苛谷, 使用這些代碼你完全不用考慮Http實(shí)現(xiàn)的細(xì)節(jié), 只需要知道服務(wù)器端接口的協(xié)議即可格郁。
【 接口協(xié)議】
主要包括三個(gè)部分
(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, ?這個(gè)API用起來有一口氣寫到底的感覺, 讀起來很舒服树瞭。
這里能找到Fluent API的細(xì)節(jié)拇厢, 這里再強(qiáng)調(diào)一下, 開源軟件自帶的例子和教程是非常好的學(xué)習(xí)資料晒喷, 網(wǎng)上很多的文章其實(shí)就是對(duì)這些東西的破碎的翻譯孝偎,最好是練好英文, 閱讀最權(quán)威的凉敲,原汁原味的資料衣盾。
【 會(huì)話管理】
我們知道寺旺,用戶通過瀏覽器登錄網(wǎng)站以后, ?服務(wù)器可以產(chǎn)生session (會(huì)話), 這個(gè)session 通常會(huì)以cookie的方式(在Http協(xié)議的Header 中)發(fā)送給瀏覽器势决, 瀏覽器需要保存起來迅涮, 再次訪問網(wǎng)站的時(shí)候, 會(huì)把cookie帶過去徽龟, 這樣服務(wù)器就知道用戶是誰了叮姑。
session 一般有個(gè)過期時(shí)間,例如30分鐘据悔, 超過這個(gè)時(shí)間如果瀏覽器不再訪問的話传透, 這個(gè)session 就過時(shí)了, 需要重新登錄极颓。
手機(jī)端應(yīng)用當(dāng)然也可以模擬瀏覽器朱盐, 以同樣的方式處理, ?登錄以后菠隆,就把服務(wù)器發(fā)的session ID 保存起來兵琳, 下次訪問其他接口時(shí)把這個(gè)session 發(fā)過去就可以了。
但是你仔細(xì)想一下骇径,手機(jī)和瀏覽器是不一樣的: 手機(jī)端經(jīng)常是登錄以后躯肌, 可以長時(shí)間不操作(例如7天), session 也不會(huì)過期破衔。
很多手機(jī)端應(yīng)用可以保持很長時(shí)間的會(huì)話狀態(tài)榄笙, 例如7天以內(nèi)不操作都不會(huì)過期驯遇, 7天以后才會(huì)要求重新登錄。
這樣服務(wù)器針對(duì)瀏覽器搞的Cookie 超時(shí)時(shí)間 30分鐘就太短了础淤。
換句話說吁津,手機(jī)端應(yīng)用由于操作的特性授艰, 需要保持一個(gè)長會(huì)話(3天胶哲, 7天纲岭。。)怜瞒, 傳統(tǒng)的session機(jī)制不合適父泳。
這時(shí)候需要我們自己來設(shè)計(jì)實(shí)現(xiàn)一個(gè)會(huì)話的管理機(jī)制:
1. 手機(jī)端應(yīng)用調(diào)用服務(wù)器端的登錄接口。
2. 服務(wù)器生成一個(gè)token 盼砍, token 可以通過算法設(shè)計(jì)成一個(gè)隨機(jī)的字符串尘吗, 讓黑客無法猜出。 服務(wù)器把token 放到緩存或者數(shù)據(jù)庫中浇坐, 設(shè)置一個(gè)過期時(shí)間,例如7天
3. 服務(wù)器把token 發(fā)回給手機(jī)端
4. 手機(jī)端保存該token , ?每次訪問其他接口的時(shí)候需要把token 也發(fā)到服務(wù)器端做認(rèn)證黔宛, 如果服務(wù)器端發(fā)現(xiàn)token 過期近刘, 就會(huì)要求手機(jī)端重新登錄
這樣就實(shí)現(xiàn)了一個(gè)長時(shí)間的會(huì)話管理。