Retrofit+OkHttp+RxJava的封裝

MarvelNetwork



如何使用

app gradle 中添加以下代碼

apply plugin: 'com.android.application'

android {
    // 略...
}

repositories {
    maven { url "https://github.com/ywqln/marvel-network/raw/master" }
}

dependencies {
    // 略...
    implementation 'com.marvel:network:1.0.1'
}




認(rèn)識 marvel network

項(xiàng)目中難免會有多方接口,那就意味著多種baseUrl,多種Header,多種數(shù)據(jù)結(jié)構(gòu)。而我們在使用過程中對Retrofit切換baseUrl,Header頻繁起來,會覺得不那么舒服,所以這方面需要設(shè)計(jì)下

marvel network使用注解的方式來描述接口的interface聲明文件,統(tǒng)一來管理一個interface下的所有接口都使用同一個baseUrl,同一個Header。

在項(xiàng)目中,baseUrl也可能是從一個接口中獲取到的,注解上要求字符串的值是常量,考慮到這種情況,marvel network提供了動態(tài)的baseUrl設(shè)置,設(shè)置方式如下:

@BaseUrl(dynamic = NewsBaseUrlInterceptor.class)
public interface NewsApi {
    // 略...
}

NewsBaseUrlInterceptor文件,NewsBaseUrlInterceptor必須是一個實(shí)現(xiàn)BaseUrlInterceptor接口的類,并實(shí)現(xiàn)void getBaseUrl()方法

public class NewsBaseUrlInterceptor implements BaseUrlInterceptor {
    @Override
    public String getBaseUrl() {
        return "http://toutiao-ali.juheapi.com";
    }
}

如果你想直接設(shè)置baseUrl,不需要動態(tài),可以按以下方式設(shè)置:

@BaseUrl("http://toutiao-ali.juheapi.com")
public interface NewsApi {
    // 略...
}

默認(rèn)提供的一些工具

  • ApiThreadTransformer線程切換,在io線程發(fā)起請求,在main線程處理數(shù)據(jù)。
  • ResponseObserver繼承Observer后重寫了onError,對錯誤做了重新定義,通過網(wǎng)絡(luò)狀態(tài)碼來轉(zhuǎn)為中文消息,且不吞沒狀態(tài)碼。對于成功響應(yīng)定義為數(shù)據(jù)返回且業(yè)務(wù)處理正常,失敗定義為網(wǎng)絡(luò)層出錯或服務(wù)器處理出錯。
  • SimpleObserver繼承自ResponseObserver,但無需實(shí)現(xiàn)onSubscribeonComplete。當(dāng)無需在發(fā)起請求和完成請求時處理的時候,可選擇。




如何定義一個api

@BaseUrl用在整個interface,表示但凡是在整個interface中聲明的接口,他們的baseUrl都是一樣的。同理,@Interceptors也是一樣。

/**
 * 描述:新聞相關(guān)接口.
 * <p>
 *
 * @author yanwenqiang.
 * @date 2019/1/21
 */
@BaseUrl(value = "http://toutiao-ali.juheapi.com")
@Interceptors(NewsHeaderInterceptor.class)
public interface NewsApi {

    /**
     * 獲取新聞列表
     *
     * @param type 可選參數(shù):top(頭條,默認(rèn)),shehui(社會),guonei(國內(nèi)),guoji(國際),yule(娛樂),
     *             tiyu(體育)junshi(軍事),keji(科技),caijing(財(cái)經(jīng)),shishang(時尚)
     */
    @GET("/toutiao/index")
    Observable<NewsResp<NewsResult>> getNews(@Query("type") String type);
}




如何發(fā)起網(wǎng)絡(luò)請求

Requestor.instance()
                .getApi(NewsApi.class)
                .getNews("yule")
                .compose(new ApiThreadTransformer<>())
                .compose(new NewsTransformer<>())
                .subscribe(new ResponseObserver<NewsResult>() {
                    @Override
                    protected void onSuccess(NewsResult result) {
                        NetLog.json(new Gson().toJson(result.getData()));
                    }

                    @Override
                    protected void onFail(ResponseException responseException) {
                        NetLog.e(responseException.message);
                    }

                    @Override
                    public void onSubscribe(Disposable d) {
                        NetLog.p("開始發(fā)送請求...");
                    }

                    @Override
                    public void onComplete() {
                        NetLog.p("請求處理完成...");
                    }
                });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容