Newer
Older
Telegram / TMessagesProj / src / main / java / org / telegram / network / RetrofitClient.java
黄旋科 on 19 Nov 2017 3 KB 群聊功能优化:自动退出优化
package org.telegram.network;


import android.text.TextUtils;

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import org.telegram.network.log.LogInterceptor;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Retrofit
 */
public class RetrofitClient {


    private static Retrofit sRetrofit;

    private RetrofitClient() {
        OkHttpClient.Builder client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间
                .retryOnConnectionFailure(true)
//                .addInterceptor(HeadInterceptor.getDefaultFixedHeaderInterceptor())//设置头部信息
//                .addInterceptor(new BodyInterceptor())//添加统一的 body 和签名
                .addInterceptor(getDefaultFixedHeaderInterceptor())//统一添加类型
                .addInterceptor(LogInterceptor.getLogInterceptor())//打印 log
                ;

        sRetrofit = new Retrofit.Builder()
                .client(client.build())
                .baseUrl(UrlConfig.getInstance().BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//                .addConverterFactory(ErrorCodeConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static Interceptor genericClient() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                RequestBody body = chain.request().body();
                try {
                    if (body == null) {
                        FormBody.Builder builder = new FormBody.Builder();
                        body = builder.build();
                    }
                    MediaType mediaType = body.contentType();
                    Field field = mediaType.getClass().getDeclaredField("mediaType");
                    field.setAccessible(true);
                    field.set(mediaType, "application/json");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return chain.proceed(chain.request().newBuilder().post(body).build());
            }
        };
    }
    /**
     * 默认的固定请求参数的拦截器
     */
    public static Interceptor getDefaultFixedHeaderInterceptor() {
        return new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                Request.Builder builder = request.newBuilder();
                Map<String, String> fixedHeaders = new HashMap<>();
                fixedHeaders.put("Content-Type", "application/json");
                Iterator var5 = fixedHeaders.entrySet().iterator();
                while (var5.hasNext()) {
                    Map.Entry<String, String> entry = (Map.Entry) var5.next();
                    String key = entry.getKey();
                    String value = entry.getValue();
                    if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) {
                        builder.header(key, value);
                    }
                }
                return chain.proceed(builder.build());
            }
        };
    }

    private static class SingleInstance {
        static RetrofitClient sApiClient = new RetrofitClient();
    }

    public static RetrofitClient getInstance() {
        return SingleInstance.sApiClient;
    }

    public <T> T request(Class<T> tClass) {
        return sRetrofit.create(tClass);
    }
}