久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Android項(xiàng)目多服務(wù)端接口適配(超簡(jiǎn)單)

瀏覽:53日期:2022-09-23 08:40:33

現(xiàn)狀

Android項(xiàng)目如果是多服務(wù)端接口時(shí),一般怎么弄呢?

方法1:服務(wù)器地址放在Header中

把服務(wù)器地址放在接口Header中,然后通過(guò)攔截器來(lái)動(dòng)態(tài)修改請(qǐng)求地址而實(shí)現(xiàn)的。除了默認(rèn)服務(wù)器的接口,其它都要加一個(gè)Header,有點(diǎn)麻煩。看起來(lái)也不爽,不簡(jiǎn)潔。

interface ApiHeaderCase { /************************** server A ****************************/ @Headers('host:$SERVER_HOST_A') @GET('user/loginWithScanCode') fun aMethod1(@Query('id') id: Int): Observable<ResponseBody> /************************** server B ****************************/ @Headers('host:$SERVER_HOST_B') @GET('user/loginWithScanCode') fun bMethod1(@Query('id') id: Int): Observable<ResponseBody>}

方法2:多套服務(wù)類,實(shí)例化為多個(gè)對(duì)象,準(zhǔn)確查找接口歸屬服務(wù)

定義多個(gè)類,每個(gè)類定義一套服務(wù)接口。然后分別實(shí)例化為多個(gè)對(duì)象,再使用準(zhǔn)確的對(duì)象來(lái)調(diào)用接口。這種方法運(yùn)行效率是最高的,但是在開(kāi)發(fā)時(shí),可能無(wú)法快速知道接口歸屬與哪個(gè)服務(wù),需要查看代碼才能準(zhǔn)確知曉,可以說(shuō)是少了代碼提示能力。

interface ApiA { @GET('user/loginWithScanCode') fun methodA(@Query('id') id: Int): Observable<ResponseBody>}interface ApiB { @GET('user/loginWithScanCode') fun methodB(@Query('id') id: Int): Observable<ResponseBody>}

方法3:全寫(xiě)在一起,實(shí)例化為多個(gè)對(duì)象,準(zhǔn)確調(diào)用方法

把所有接口都寫(xiě)在一個(gè)類中,然后根據(jù)服務(wù)地址分別實(shí)例化為多個(gè)對(duì)象。再準(zhǔn)確調(diào)用方法,為了保證準(zhǔn)確調(diào)用方法,可以給每個(gè)接口加個(gè)服務(wù)名的前綴,以減少方法調(diào)錯(cuò)的問(wèn)題。

interface ApiAllInOne { /************************** server A ****************************/ @GET('user/loginWithScanCode') fun aMethod1(@Query('id') id: Int): Observable<ResponseBody> /************************** server B ****************************/ @GET('user/loginWithScanCode') fun bMethod1(@Query('id') id: Int): Observable<ResponseBody>}const val SERVER_HOST_A = 'https://www.a.com/'const val SERVER_HOST_B = 'https://www.b.com/'fun getApi(retrofit: Retrofit, host: String): ApiAllInOne { return retrofit.newBuilder() .baseUrl(host).build() .create(ApiAllInOne::class.java)}fun showNomalUseCase(retrofit: Retrofit) { val apiA = getApi(retrofit, SERVER_HOST_A)//save as single instance for repeated usage apiA.aMethod1(1).subscribe() apiA.bMethod1(1).subscribe()//invalid usage, but no compile error val apiB = getApi(retrofit, SERVER_HOST_B) apiB.bMethod1(1).subscribe() apiB.aMethod1(1).subscribe()//invalid usage, but no compile error}

有更簡(jiǎn)單的方法嗎?

當(dāng)然有了,而且超方便!

定義接口

(建議)在一個(gè)KT文件中定義所有接口,方便查找和維護(hù)。

interface ApiHolder : ApiA, ApiB @BaseUrl('https://www.a.com/') interface ApiA { @GET('user/loginWithScanCode') fun methodA(@Query('id') id: Int): Observable<ResponseBody> } @BaseUrl('https://www.b.com/') interface ApiB { @GET('user/loginWithScanCode') fun methodB(@Query('id') id: Int): Observable<ResponseBody> }

建工具類

一般都需要個(gè)工具類的,方便配置攔截器等。如果沒(méi)有自定義的需求,也可以直接實(shí)例化來(lái)用。

可以重寫(xiě)invokeApi方法,全局給每個(gè)Observable設(shè)定線程。

class ApiUtil : ApiHolderUtil<ApiHolder>(ApiHolder::class) { companion object { val apiUtil = ApiUtil() val api = apiUtil.api } override fun invokeApi(api: Any, method: Method, args: Array<*>?): Any { val observable = super.invokeApi(api, method, args) as Observable<*> return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) }}

動(dòng)態(tài)更新服務(wù)地址

還可以動(dòng)態(tài)更新服務(wù)地址,比如實(shí)現(xiàn)測(cè)試服務(wù)和正式服務(wù)間切換。

//update api baseUrl when needed apiUtil.updateApi(ApiA::class, https://www.a2.com/)

調(diào)用接口

api.methodA(1).subscribe() api.methodB(1).subscribe()

引入依賴

dependencies { implementation ’com.github.DonaldDu:ApiHolder:x.x.x’//JitPack version}

該項(xiàng)目使用的三方庫(kù)

OkHttp3 Retrofit2 rxjava3(可以修改為rxjava2)

api ’com.squareup.okhttp3:okhttp:4.7.2’ api 'com.squareup.retrofit2:retrofit:2.9.0' api 'com.squareup.retrofit2:converter-gson:2.9.0' api 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' api ’io.reactivex.rxjava3:rxandroid:3.0.0’

其它說(shuō)明

rxjava3 ->rxjava2

可以根據(jù)需要調(diào)整為rxjava2,建議用最新的。

//重寫(xiě)ApiHolderUtil如下方法,RxJava3CallAdapterFactory ->RxJava2CallAdapterFactory即可。 protected open fun getRetrofit(client: OkHttpClient): Retrofit { return Retrofit.Builder().validateEagerly(validateEagerly).addConverterFactory(getGsonConverterFactory()).addCallAdapterFactory(RxJava3CallAdapterFactory.create()).baseUrl('http://www.demo.com/').client(client).build() }

Timeout

可以給每套服務(wù)設(shè)置不同的超時(shí)

@BaseUrl('https://www.b.com/')@Timeout(read = 100, timeUnit = TimeUnit.SECONDS)interface ApiB { @GET('user/loginWithScanCode') fun methodB(@Query('id') id: Int): Observable<ResponseBody>}

到此這篇關(guān)于詳解Android項(xiàng)目多服務(wù)端接口適配(超簡(jiǎn)單)的文章就介紹到這了,更多相關(guān)Android多服務(wù)端接口適配 內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 国产一二三视频 | 玖玖国产精品视频 | 亚洲日韩欧美一区二区在线 | 久久免费视频观看 | 欧美一区二区三区在线视频观看 | 亚洲男人天堂2024 | 国产高清视频一区 | 亚洲午夜精品一区二区三区 | 一级色视频 | 日韩不卡一区二区三区 | 精品国产一区二区三区高潮视 | 69性欧美高清影院 | 欧美亚洲国产日韩 | av在线毛片| 欧美一区二区三区 | 精品久久一二三区 | 91色爱| 久久久久久亚洲 | 99pao成人国产永久免费视频 | 欧美精品久久久 | 日韩精品一区二区三区视频播放 | 日本久久二区 | 日韩av电影网 | 精品免费av | 国产一区二区三区免费在线 | 一级电影免费看 | 一区二区三区日韩 | 精品久久一区二区三区 | 99这里只有精品视频 | 国产精品a久久久久 | 中文字幕在线播放一区 | 91日日| 国产精品视频一二 | 97久久久久久久久久久久 | 一区二区三区精品视频 | 在线免费观看成年人视频 | 9191在线| 国产成人精品一区 | 日本午夜电影 | 成人欧美 | 99精品欧美一区二区三区 |