基于Rxjava+Retrofit+Okhttp的webservices訪問

之所以寫這篇文章是最近我們自己的項目打算實現mvp模式的功能重構,而我們的項目數據接口全部是基于webservices接口實現的,查閱了下資料發現Rxjava+retrofit的框架不是一般的火,內心不免躁動起來,經過一天半的時間總結摸索出一個登陸的demo。整體框架是RXjava+retrofit+okhttp 的mvp模式。廢話不少了開始吧

開始之前就是小白一枚,準備工作如下:


1、什么是mvp

2、什么是RXjava+retrofit+okhttp

3、應該放在最后的之前寫的demo(包括單純webservices訪問;mvp模式的練習;rxjava練習)


先看看框架的樣子,上圖,包名對應的意思簡單解釋下

api:和明顯了在里邊放了一個登錄用的接口

convert:很重要,自定義的Retrofit convert,主要作用是自定義retrofit發送和接收的數據格式,特別是當前要發送的數據是xml格式,而我們返回的數據又要求截取其中的json要求

ksoap2,kxml2:這兩個包存儲了從ksoap的源碼中copy過來的源碼,目的是借用其中拼接xm,和請求頭的實現

model:模型

presenter:主要的邏輯代碼,控制view的顯示

view:也就是activity了

曰:授人以魚不如授人以漁

? ? 文章想從自己的問題解決思路出發,講講如何是實現webservices訪問的,首先不得不說一下我們之前拋棄所有的框架、思路僅僅借助ksoap2的jar包是如何實現webservices訪問的(相信看這篇文章的同學都是對webservices訪問有所了解的人,真是不明白的請自行度娘):

webservices是如何發送請求的

通過soapUI工具我們可以很清楚的看到,其本質就是將參數組裝在一個xml格式的數據中發送,發送和結果接收均是以xml的格式存在的,看看通過soapUI請求的格式就明白了:


webservces請求和返回的數據格式

ksoap2實現訪問webservices

看下訪問的關鍵代碼:


t通過ksoap2訪問webservices

41-46將參數通過map的方式傳入

48-54查看源碼也就是組裝xml和請求頭的過程

56-64調用http的請求,發送接口請求

65-66獲取請求結果,當然查看源碼我們知道這個地方對返回的結果(原始的訪問返回為xml格式的)進行的解析

因為我們自己的接口返回的數據格式都是嚴格的json,所以最后的返回數據處理還包括

?SoapObject resultsRequestSOAP = (SoapObject)envelope.bodyIn;

Object obj = resultsRequestSOAP.getProperty(0);

String jsonStr = obj.toString();

來獲取json字符串

注:掛上ksoap2訪問webservices的demo

通過以上,就很明白了要想實現webservices的訪問無非就是(1)想辦法組裝xml(2)如何將返回xml中的json數據提取出來,結合我們現在要整合RXjava+retrofit+okhttp那么我們還需要考慮(自定義的convert)

RXjava-----mvp

1.添加需要依賴的庫

compile'com.squareup.retrofit2:retrofit:2.1.0'

compile'com.squareup.okhttp3:okhttp:3.4.2'

compilegroup:'com.squareup.okhttp3',name:'okhttp-urlconnection',version:'3.3.0'

compile'com.squareup.retrofit2:converter-gson:2.1.0'

//適配器

compile'com.squareup.retrofit2:adapter-rxjava:2.1.0'

//RxJava

compile'io.reactivex:rxjava:1.1.6'

//RxAndroid

compile'io.reactivex:rxandroid:1.2.1'

//用來自定義的轉換器(關鍵詞:retrofit請求字符串,非json)

compile'com.squareup.retrofit2:converter-gson:2.1.0'

2、建立各個包,就像我在開頭貼出來的樣子,主要是為了mvp模式的調理準備的

3、采用ksoap中的源碼,我們不使用ksoap中網絡訪問的代碼,這部分代碼請自行裁剪,只保留其中的組拼裝xml部分。

我們在使用ksoap2的方法中,最后的數據調用使用的是HttpTransportSE.call(“”,enveloap),找到代碼中call方法,我們可以看到其中組裝xml的代碼

call方法的代碼量還時挺大的這里為了避免篇幅過長(已經很長了),就不在張貼,我們通過看其中的call方法我們發現

(1)包括了http的請求頭 beader

(2)包括了使用byte[] requestData = createRequestData(envelope,"UTF-8");將envelope轉成xml

(3)建立http的鏈接并發起請求

偶然發現一個地方,call方法在設置http請求的時候設置了connection.setRequestMethod("POST");post的請求方法,媽媽再也不用擔心我在定義api接口的時候糾結使用get還是post了。當然就算沒發現post也應該有意識明白使用post才對

4、翻過頭來繼續看看我們的目錄結構

創建api接口

public interfaceILoginApi {

@POST("/services/loginService")

rx.ObservableloginForMobile(@HeaderMapMap headerMap,@BodyString body);

}

毅然決然的使用了post,設置好url(請求的url都是拼接的,這個地方直接寫除baseurl以外的部分就可以了),登錄接口定義的參數需要設置請求的header,和請求的字符串(這里是組裝后的xml)

創建model

因為我們接口返回的數據統一json格式必包含{“message”:"","statuscode":200},所以創建一個基類BaseEnty作為其他實體的父類

public abstract classbaseEntity {

privateStringmessage;

privateStringstatuscode;

publicStringgetStatuscode() {returnstatuscode;}

public voidsetStatuscode(Stringstatuscode) {this.statuscode= statuscode;}

publicStringgetMessage() {returnmessage;}

public voidsetMessage(Stringmessage) {this.message= message;}

}

prestener接口

定義的很簡單就是在主頁面顯示登錄后返回的信息

public interfaceILoginPresenter {

voidlogin(Stringusername,Stringpwd);

}

view頁面省去不寫

這里描述下presenter的實現


prestener的構造方法

soapHelpers是一個單例,里邊包含了傳輸參數后返回xml請求body和請求header的方法

至此調用api的方法就本應該可以實現網路的訪問了

loginApi.loginForMobile(soapHeaderMap,mBody)

.subscribeOn(Schedulers.io())

//指定回調在哪執行

.observeOn(AndroidSchedulers.mainThread())

.subscribe(newAction1() {

@Override

public voidcall(User responseBody) {

String respone = responseBody.getMessage();

Log.v(TAG,"respone:"+ respone);

iLoginView.displayLoginMessage(respone);

}

}, newAction1() {

@Override

public voidcall(Throwable throwable) {

Log.v(TAG,"error:"+ throwable.toString());

}

});

細心的同學會發現,如果直接使用的是addConverterFactory(GsonConverterFactory.create())轉換器,那么一個問題是我們如何才能將返回的數據按照我們想要的格式返回呢??我們定義的api接口中返回的user對象怎么樣才能生效呢,我么返回的數據可是赤裸裸的xml啊!我們可什么也沒做呢。。。。。。細思極恐,抓緊查了下自定義retrofit 的convert,然后我們將自定義的轉換conver實現


自定義convert

數據的request按照教程直接寫就ok,思想就是保證我們的retrofit能夠發送自定義的字符串(也就是xml),重點是解析返回數據,得到我們想要的json

想到這里呦呦呦去看了一眼soap的源碼

SoapObject resultsRequestSOAP = (SoapObject)envelope.bodyIn;

Object obj = resultsRequestSOAP.getProperty(0);

String jsonStr = obj.toString();


轉換返回的數據為json

最后將我們自定義的轉換器配置到retrofit中SoapConverterFactory.create()

retrofit=newRetrofit.Builder().baseUrl(baseUrl)

.addConverterFactory(SoapConverterFactory.create())

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.build();

運行ok


沒有忘記上源碼:https://github.com/sunfengqi8023/LoginForSoapAndRxjava


#### 歡迎訪問我的CSDN [熊貓卓Sun博客](http://blog.csdn.net/sfq19881224)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容