網頁抓包例項---校園助手app
由於最近的博文一直在講抓包和MVP模式的東西,所以決定自己寫一個關於學校校園網成績抓包的專案,可是實現app登入校園網並對校園網資料進行抓取展示
軟體截圖
包結構
設計思路
MVP模式
模式是從傳統的mvc模式改進為MVC模式,關於MVP模式的說明可以參考我之前寫過的關於MVP模式的介紹
presenter:資料控制中心,負責為每個ui介面適配資料
model:負責呼叫各個服務進行資料適配
Serviceapi:服務,也就是負責底層的訪問瀏覽器網頁並解析的行為
ui:ui層
Model層
model層分工比較明確,如下圖:
引擎和服務組成了Model層,打個比方,例如說我要獲取成績,就必須要由引擎呼叫登入服務,然後再呼叫獲取成績服務,這樣一來,每個模組各自都有各自要做的事,程式碼結構非常清晰,相對於單元測試來說也比較方便。
M與P的互動
model與presenter之間的互動採用RxJava,可以讓每一步的邏輯線性化從而更加清晰,還是拿上面的例子來說,登入後獲取成績,如果沒有使用RxJava,可能就得陷入至少2此回撥中。
上面都只是舉個簡單的例子,在實際應用中,遠遠比上面說的要難地多,可以看看下面的邏輯圖:
不難看出,在這裡資料邏輯和ui邏輯多重互動,如果只在一個Activity裡面寫這些邏輯,程式碼量和複雜程度可想而知,所以使用RxJava+MVP模式是一個很明智的選擇,資料邏輯在P中寫,ui邏輯在view中寫,然後P與M的互動則使用RxJava讓複雜的邏輯顯得更加清晰
錯誤處理
在上面展示的邏輯圖中還有一個很重要的點沒提出來,就是當遇到錯誤發生時怎麼辦?在做app的 過程經常遇到的錯誤有:
- 網頁引數編碼錯誤導致訪問網頁失敗
- 賬號密碼錯誤等
- 網頁伺服器無響應
- 客戶端網路斷開等
解決這些錯誤讓lz頭疼了好幾天,因為view層與資料控制層的分開,所以你並不能在activity裡面判斷具體的錯誤原因然後作出響應。規範的做法是在presenter中判斷錯誤,並控制view作出響應。所以這也是我在Presenter和Model層之間使用RxJava的一個重要原因,RxJava的一個重要特性就是如果在被觀察者執行的過程中跑出異常,則會中斷流程,直接呼叫觀察者的onError函式,並傳出異常;
model.Login(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Html_Main>() {
@Override
public void onCompleted() {
view.hideLoadingDialog();
}
@Override
public void onError(Throwable e) {
view.showErrorDialog(((MyException) e).getViewErrorInfo());
}
@Override
public void onNext(Html_Main html_main) {
Glo.html_main = html_main;
ConstantValue.isOfficeLogin = true;
view.hideLoadingDialog();
view.runMainAct();
}
})
;
當然在onError裡面要對Exception進行判斷是哪種錯誤