All Projects → Mp5A5 → Httprequest

Mp5A5 / Httprequest

Licence: apache-2.0
基于Retrofit2+RxJava2+OkHttp3的网络请求框架,可以完美的应用到组件化、MVP模式等项目中

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Httprequest

iMoney
iMoney 金融项目
Stars: ✭ 55 (-69.61%)
Mutual labels:  rxjava, rxjava2, retrofit2, okhttp3
RxHttp
基于RxJava2+Retrofit+OkHttp4.x封装的网络请求类库,亮点多多,完美兼容MVVM(ViewModel,LiveData),天生支持网络请求和生命周期绑定,天生支持多BaseUrl,支持文件上传下载进度监听,支持断点下载,支持Glide和网络请求公用一个OkHttpClient⭐⭐⭐
Stars: ✭ 25 (-86.19%)
Mutual labels:  rxjava, rxjava2, retrofit2, okhttp3
Androidproject
Android 技术中台,但愿人长久,搬砖不再有
Stars: ✭ 4,398 (+2329.83%)
Mutual labels:  rxjava, rxjava2, okhttp3, retrofit2
Bigbang
Android base project used by Xmartlabs team
Stars: ✭ 47 (-74.03%)
Mutual labels:  rxjava, rxjava2, retrofit2
Fcfrtmvp
🔥FcfrtMvp+RxHttp+RxJava(Kotlin和JAVA共用完美支持)支持一键创建MVP项目,框架简约风格及详细注释,欢迎 star or fork!
Stars: ✭ 23 (-87.29%)
Mutual labels:  rxjava, rxjava2, okhttp3
Todo List
待办事项APP
Stars: ✭ 45 (-75.14%)
Mutual labels:  rxjava2, okhttp3, retrofit2
Bilisoleil
An unofficial bilibili client for android --rxjava2+mvp+okhttp3+retrofit2+dagger2
Stars: ✭ 430 (+137.57%)
Mutual labels:  rxjava2, okhttp3, retrofit2
Mvpframes
整合大量主流开源项目并且可高度配置化的 Android MVP 快速集成框架,支持 AndroidX
Stars: ✭ 100 (-44.75%)
Mutual labels:  rxjava, rxjava2, retrofit2
Aiyagirl
🔥 爱吖妹纸(含 Kotlin 分支版本)——Retrofit + RxJava + MVP 架构 APP 体验代码家的干货集中营 Gank.io,福利多多,不容错过
Stars: ✭ 1,109 (+512.71%)
Mutual labels:  rxjava, rxjava2, retrofit2
Rxapp
Stars: ✭ 108 (-40.33%)
Mutual labels:  rxjava2, okhttp3, retrofit2
Bilisoleil Kotlin
An unofficial bilibili client for android --kotlin+rxjava2+mvp+okhttp3+retrofit2+dagger2
Stars: ✭ 139 (-23.2%)
Mutual labels:  rxjava2, okhttp3, retrofit2
Mvvmhabit
goldze: 本人喜欢尝试新的技术,以后发现有好用的东西,我将会在企业项目中实战,没有问题了就会把它引入到MVVMHabit中,一直维护着这套框架,谢谢各位朋友的支持。如果觉得这套框架不错的话,麻烦点个 star,你的支持则是我前进的动力!
Stars: ✭ 6,789 (+3650.83%)
Mutual labels:  rxjava, rxjava2, retrofit2
Ganhuoio
基于Gank.IO提供的API的第三方客户端(RxJava+Retrofit)
Stars: ✭ 727 (+301.66%)
Mutual labels:  rxjava, rxjava2, retrofit2
Graphql Retrofit Converter
A Retrofit 2 Converter.Factory for GraphQL.
Stars: ✭ 46 (-74.59%)
Mutual labels:  rxjava, rxjava2, retrofit2
Bilibili Android Client
An unofficial bilibili client for android http://www.jianshu.com/p/f69a55b94c05 -- 该项目已停止维护!
Stars: ✭ 4,430 (+2347.51%)
Mutual labels:  rxjava, okhttp3, retrofit2
Newspaper
An aggregated newspaper app containing news from 10+ local news publishers in Hong Kong. Made with ❤
Stars: ✭ 82 (-54.7%)
Mutual labels:  rxjava, okhttp3, retrofit2
Nice Knowledge System
📚不积跬步无以至千里,每天进步一点点,Passion,Self-regulation,Love and Share
Stars: ✭ 137 (-24.31%)
Mutual labels:  rxjava2, okhttp3, retrofit2
Fountain
Android Kotlin paged endpoints made easy
Stars: ✭ 175 (-3.31%)
Mutual labels:  rxjava, rxjava2, retrofit2
Dagger2
Kotlin Dagger2 example project
Stars: ✭ 145 (-19.89%)
Mutual labels:  rxjava, rxjava2, retrofit2
Mvvmarms
Android MVVM Architecture Components based on MVPArms and Android Architecture Components.
Stars: ✭ 425 (+134.81%)
Mutual labels:  rxjava2, okhttp3, retrofit2

基于Retrofit2+RxJava+OkHttp3的网络请求框架

添加依赖和配置

工程添加依赖仓库,Add the JitPack repository to your build file

allprojects {
   repositories {
   		...
   	    maven { url 'https://jitpack.io' }
   }
}
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
dependencies {
       implementation 'com.github.Mp5A5:HttpRequest:1.2.3'
}

如果项目使用RxLifecycle管理网络请求,则不需要添加rxjava和rxandroid依赖因为RxLifecycle本身包含这两个包:

  • 如果项目是用的support包则使用RxLifecycle2及对应的版本

  • 如果项目是用的androidx包则使用RxLifecycle3及对应的版本

  • 如果项目不使用RxLifecycle管理网络请求,而是通过手动管理,则不需要添加RxLifecycle对应的包

推荐依赖

    // okhttp
    implementation 'com.squareup.okhttp3:okhttp:latest-version'
    implementation 'com.squareup.okhttp3:logging-interceptor:latest-version'
    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:latest-version'
    implementation 'com.squareup.retrofit2:converter-gson:latest-version'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:latest-version'
    //RxLifecycle3
    implementation 'com.trello.rxlifecycle3:rxlifecycle:latest-version'
    implementation 'com.trello.rxlifecycle3:rxlifecycle-android:latest-version'
    implementation 'com.trello.rxlifecycle3:rxlifecycle-components:latest-version'

或者

    // rxandroid
    implementation 'io.reactivex.rxjava2:rxandroid:latest-version'
    // okhttp
    implementation 'com.squareup.okhttp3:okhttp:latest-version'
    implementation 'com.squareup.okhttp3:logging-interceptor:latest-version'
    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:latest-version'
    implementation 'com.squareup.retrofit2:converter-gson:latest-version'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:latest-version'

简单使用步骤

在Application类中进行初始化操作

@Override
    public void onCreate() {
        super.onCreate();

        String baseUrl = "http://op.juhe.cn/";
        ArrayMap<String, String> headMap = new ArrayMap<String, String>();
        headMap.put("key1", "value1");
        headMap.put("key2", "value2");
        headMap.put("key3", "value3");

        SslSocketConfigure sslSocketConfigure = new SslSocketConfigure.Builder()
                .setVerifyType(2)//单向双向验证 1单向  2 双向
                .setClientPriKey("client.bks")//客户端keystore名称
                .setTrustPubKey("truststore.bks")//受信任密钥库keystore名称
                .setClientBKSPassword("123456")//客户端密码
                .setTruststoreBKSPassword("123456")//受信任密钥库密码
                .setKeystoreType("BKS")//客户端密钥类型
                .setProtocolType("TLS")//协议类型
                .setCertificateType("X.509")//证书类型
                .build();


        ApiConfig build = new ApiConfig.Builder()
                .setBaseUrl(baseUrl)//BaseUrl,这个地方加入后项目中默认使用该url
                .setInvalidToken(10)//Token失效码
                .setSucceedCode(0)//成功返回码  NBA的测试返回成功code为0  上传图片返回code为200 由于是不同接口 请大家注意
                .setTokenInvalidFilter("com.mp5a5.quit.tokenInvalidBroadcastFilter")//失效广播Filter设置
                .setQuitCode(200)//退出app码
                .setTokenInvalidFilter("com.mp5a5.quit.quitAppBroadcastFilter")//失效广播Filter设置
                //.setDefaultTimeout(2000)//响应时间,可以不设置,默认为2000毫秒
                .setHeads(headMap)//动态添加的header,也可以在其他地方通过ApiConfig.setHeads()设置
                //.setOpenHttps(true)//开启HTTPS验证
                //.setSslSocketConfigure(sslSocketConfigure)//HTTPS认证配置
                .build();
        /*
         *     Token失效后发送动态广播的Filter,配合BaseObserver中的标识进行接收使用
         *     public static final String TOKEN_INVALID_TAG = "token_invalid"; ------------>>>>>>>>>>对应name
         *     public static final String REFRESH_TOKEN = "refresh_token"; ------------>>>>>>>>>>对应value
         *
         *
         *     oncreate()方法中初始化
         *     private void initReceiver() {
         *         mQuitAppReceiver = new QuitAppReceiver();
         *         IntentFilter filter = new IntentFilter();
         *         filter.addAction(ApiConfig.getTokenInvalidBroadcastFilter());
         *         registerReceiver(mQuitAppReceiver, filter);
         *     }
         *
         *
         *     private class QuitAppReceiver extends BroadcastReceiver {
         *
         *         @Override
         *         public void onReceive(Context context, Intent intent) {
         *             if (ApiConfig.getTokenInvalidBroadcastFilter().equals(intent.getAction())) {
         *
         *                 String msg = intent.getStringExtra(BaseObserver.TOKEN_INVALID_TAG);
         *                 if (!TextUtils.isEmpty(msg)) {
         *                     Toast.makeText(TestActivity.this, msg, Toast.LENGTH_SHORT).show();
         *                 }
         *             }
         *         }
         *     }
         *
         */

        build.init(this);
    }

定义请求接口

public interface NBAApiT {

    @GET("onebox/basketball/nba")
    Observable<NBAEntity> getNBAInfo(@QueryMap ArrayMap<String, Object> map);
}

创建请求实例

  • 单例模式创建Service(推荐使用这种)
public class NbaService {


    private NBAApiT nbaApiT;

    private NbaService() {
        nbaApiT = RetrofitFactory.getInstance().create(NBAApiT.class);
    }

    public static NbaService getInstance() {
        return NbaServiceHolder.S_INSTANCE;
    }

    private static class NbaServiceHolder {
        private static final NbaService S_INSTANCE = new NbaService();
    }


    public Observable<NBAEntity> getNBAInfo(String key) {
        ArrayMap<String, Object> arrayMap = new ArrayMap<String, Object>();
        arrayMap.put("key", key);
        return nbaApiT.getNBAInfo(arrayMap);
    }

}
  • 使用new Service创建Service,这中用来做动态切换BaseUrl测试等
public class NBAService {

    private NBAApi mNbaApi;

    public NBAServiceTT(String baseUrl) {
        //涉及到动态切换BaseUrl则用new Service(),不使用单例模式
        mNbaApi = RetrofitFactory.getInstance().create(baseUrl, NBAApi.class);
    }

    public Observable<NBAEntity> getNBAInfo(String key) {
        ArrayMap<String, Object> arrayMap = new ArrayMap<String, Object>();
        arrayMap.put("key", key);
        return mNbaApi.getNBAInfo(arrayMap);
    }
}

设置返回接收参数

实体类必须继承BaseResponseEntity

  • 返回的Json中,如果错误码和错误日志在最外层,则直接继承BaseResponseEntity
{"code":200,"msg":"success","response":"2018"}
  • 返回的Json中,如果错误码和错误码日志在最外层,并且错误码不叫code或者错误日志码不叫msg,则直接继承BaseResponseEntity,并且通过@SerializedName("value")起别名的方式重新赋值错误码或者错误日志码,然后重写success和tokenInvalid的方法
{"status":200,"msg":"success","response":"2018"}
public class XXEntity extends BaseResponseEntity {


    @SerializedName("status")
    private int code;

    @Override
    public boolean success() {
        return ApiConfig.getSucceedCode() == code;
    }

    @Override
    public boolean tokenInvalid() {
        return ApiConfig.getInvalidateToken() == code;
    }
    
    public String response;
}

// 或者使用泛型包装
public class XXEntity<T> extends BaseResponseEntity {


    @SerializedName("status")
    private int code;

    @Override
    public boolean success() {
        return ApiConfig.getSucceedCode() == code;
    }

    @Override
    public boolean tokenInvalid() {
        return ApiConfig.getInvalidateToken() == code;
    }
    
    public T response;
}

// kotlin也可以使用@SerializedName("value")然后选择重写code或者msg
data class XXEntity(
    @SerializedName("error_code") override var code: Int, @SerializedName("reason") override var msg: String, var result: ResultEntity?
) : BaseResponseEntity<NBAKTEntity>()

  • 返回的Json中,如果错误码和错误日志不在最外层,继承BaseResponseEntity,重写success和tokenInvalid方法
{"responseHeader":{"status":200,"msg":"success"},"response":"success"}
public class XXEntity<T> extends BaseResponseEntity {

    public T response;

    private ResponseHeader responseHeader;

    public class ResponseHeader {
        public int status;
        public String msg;
    }

    @Override
    public int getCode() {
        return responseHeader.status;
    }

    @NotNull
    @Override
    public String getMsg() {
        return responseHeader.msg;
    }

    @Override
    public boolean success() {
        return ApiConfig.getSucceedCode() == responseHeader.status;
    }

    @Override
    public boolean tokenInvalid() {
        return ApiConfig.getInvalidateToken() == responseHeader.status;
    }

}

发送请求,接收参数

NbaService.getInstance()
        .getNBAInfo("6949e822e6844ae6453fca0cf83379d3")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .compose(this.bindToLifecycle())
        .subscribe(new BaseObserver<NBAEntity>(){

            @Override
            public void onSuccess(NBAEntity response) {
                Toast.makeText(TestNBAActivity.this, response.result.title, Toast.LENGTH_SHORT).show();
            }

        });


  • 如果想使用系统提供的Dialog,但是重写了onError方法但是没有使用super.onError(e),那么必须调用onRequestEnd()方法,不然Dialog是不会消失的,至于原因自己参照Java多态机制;
UploadManager
            .getInstance()
            .uploadMultiPicList(list)
            .subscribe(parts -> {
                UploadService.getInstance()
                        .uploadPic(parts)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .compose(this.bindToLifecycle())
                        .subscribe(new BaseObserver<BaseResponseEntity>(this, true) {
                            @Override
                            public void onSuccess(BaseResponseEntity response) {
                                Toast.makeText(MainActivity.this, response.getMsg(), Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onError(Throwable e) {
                                //super.onError(e);
                                onRequestEnd();
                                Toast.makeText(MainActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
                            }
                        });


            });
  • 如果想使用自己自定义的dialog,则需要在需要重写onRequestStart()和onRequestEnd()两个方法,onRequestStart()用来开启加载动画,onRequestEnd()用来关闭加载动画;
UploadService.getInstance()
            .uploadPic(parts)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .compose(this.bindToLifecycle())
            .subscribe(new BaseObserver<BaseResponseEntity>() {
                
                @Override
                protected void onRequestStart() {
                  //super.onRequestStart();
                  // loadStart....
                  showLoading();
                }
                
                @Override
                protected void onRequestEnd() {
                   //super.onRequestEnd();
                   // loadEnd....
                   cancelLoading();
                }
                
                @Override
                public void onSuccess(BaseResponseEntity response) {
                    ...
                }
                
            });

效果展示

show.gif

参考资料请移交 https://www.jianshu.com/p/181227ca8a4d

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].