okhttp Retrofit统一处理返回请求 okhttp Retrofit统一处理返回数据

okhttp Retrofit统一处理返回请求 okhttp Retrofit统一处理返回数据  

   Gson gson = new GsonBuilder()
                .serializeNulls()
                .create();  
        //1.配置创建okhttp客户端
        OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder()
                .addInterceptor(getLogInterceptor())//
                .addInterceptor(getTimeIntercepter())
                .connectTimeout(CONNECT_TIME_OUT, TimeUnit.MILLISECONDS) //与服务器连接超时时 
 间
                .readTimeout(READ_TIME_OUT, TimeUnit.MILLISECONDS)
                .writeTimeout(WRITE_TIME_OUT, TimeUnit.MILLISECONDS)
                .retryOnConnectionFailure(true)//路由等失败自动重连
                .sslSocketFactory(sslSocketFactory)//https 绕过验证
                .hostnameVerifier(hostnameVerifier)
     //2.创建
    Retrofit retrofit = new Retrofit.Builder()
               .client(okHttpClient)
               .baseUrl(baseUrl)
               .addConverterFactory(ConverterFactory.create(gson))
               .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
               .build();

/**
 *自定义的转换器工厂类
 */
public class ConverterFactory extends Converter.Factory {

    private final Gson gson;

    public static ConverterFactory create() {
        return create(new Gson());
    }

    public static ConverterFactory create(Gson gson) {
        return new ConverterFactory(gson);
    }

    private ConverterFactory(Gson gson) {
        if (gson == null) throw new NullPointerException(ConverterFactory.class.getSimpleName()+":gson == null");
        this.gson = gson;
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        return new ResponseConverter<>(gson, type);
    }

/**
 * 自定义响应体的转换器
 */
public class ResponseConverter<T> implements Converter<ResponseBody, T> {


    public static final String TAG = "ResponseConverter";

    private final Gson gson;
    private final Type type;

    ResponseConverter(Gson gson, Type type) {
        this.gson = gson;
        this.type = type;
    }

    @Override
    public T convert(final ResponseBody value) throws IOException {
        ResBase base = null;
        String response = null;
        try {
            response = value.string();
        } catch (IOException e) {
            e.printStackTrace();
            TagLibUtil.showLogDebug("请求成功,获取返回值失败");
            return null;
        }
        Log.i("thread",Thread.currentThread().getName()) ;
        try {
            base = gson.fromJson(response, type);
            if (base != null&& !InvalidUtil.checkSign(base.sign, response) && ApiBox.getInstance().isVeriNgis()) {//校验错误
                throw new InvalidException(InvalidException.FLAG_ERROR_RESPONCE_CHECK,base.msg,base);
            }
            Major.duff = System.currentTimeMillis() - base.ts;
            if(base != null&&base._pdakey!=null&&base._pdakey.equals("")){
                ApiBox.REQUEST_KEY = base._pdakey;
                ApiBox.getInstance().resetPreferencesReqkey(ApiBox.getInstance().application,base._pdakey);
            }
   
            if (base != null && base.state != 1) {//非成功
                if (base != null && base.state == 0 && !TextUtils.isEmpty(base.msg) &&
                        (!TextUtils.isEmpty(base.msg) && base.msg.contains("0x04") || !TextUtils.isEmpty(base.msg) && base.msg.contains("0x02"))) {
                    TagLibUtil.showLogDebug("系统级错误 message出现");
                    //重新登录
                    throw new InvalidException(InvalidException.FLAG_ERROR_RELOGIN,base.msg,base);
                } else {//失败 -- 订阅者 自己在onNext做处理逻辑
//                    if(base==null&&!TextUtils.isEmpty(response)){
//                        base.jsonStr=response;
//                    }
//                    throw new UserException(base.code, base.msg,base);
                }
            }
        } finally {
            value.close();
        }
//        if(base!=null&&!TextUtils.isEmpty(response)){
//            base.jsonStr=response;
//        }
        return (T) base;
    }

    
}

以上三种方案 是在 Retrofit 处理,必须Retrofit和okhttp结合

还有另外一种方案是在okhttp 拦截器 处理。连接:https://blog.csdn.net/sun6223508/article/details/101352661

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要在项目中添加OkHttpRetrofit和RxJava的依赖。 在build.gradle文件中添加以下代码: ```groovy dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxjava:2.2.10' } ``` 然后在代码中创建Retrofit实例和API接口定义: ```java public interface ApiService { @GET("posts") Observable<List<Post>> getPosts(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://jsonplaceholder.typicode.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(new OkHttpClient()) .build(); ApiService apiService = retrofit.create(ApiService.class); ``` 最后在需要请求API接口的地方,使用RxJava的Observable来发起请求: ```java apiService.getPosts() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<Post>>() { @Override public void onSubscribe(Disposable d) { // 订阅事件 } @Override public void onNext(List<Post> posts) { // 请求成功,处理返回结果 } @Override public void onError(Throwable e) { // 请求失败,处理异常 } @Override public void onComplete() { // 请求完成 } }); ``` 其中,subscribeOn(Schedulers.io())表示在io线程中发起请求,observeOn(AndroidSchedulers.mainThread())表示在主线程中处理结果。具体的线程调度可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值