Android RetrofitUtils 工具类(支持get post请求、支持图片上传)(持续更新)

20240813 更新说明
新增OKHttp 插件监听器 在android studio 插件搜索OkHttpProfiler Plugin 可以在插件界面查看接口传参和回调

使用方式

        String headerKey = "token,type";
        String token= "";
        String type = "";
        String parameterKey = "";
        RetrofitUtils.getHttpUtils("主路径")
        .isOpenLog(true)//是否打开log
        .setClassName("名称标识")//主要判断从那个类调用此方法
        .doPost("绝对路径"
        //请求头集合
        , RetrofitUtils.header(headerKey, token,type)
        //也可以手动new HashMap<String,Object>
        //请求参数集合 同上
        , RetrofitUtils.parameter(parameterKey,value1,value2)
        , new RetrofitUtils.CallBack<"返回值对应的实体类">() {
@Override
public void onSuccess("返回值对应的实体类" bean) {
        Log.d(TAG, "onSuccess: " + bean.toString());
        }
        }

@Override
public void onError(String error) {
        Log.d(TAG, "onError: " + error);
        }
        });

全部源码

import android.annotation.SuppressLint;
import android.util.Log;

import com.google.gson.Gson;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import io.nerdythings.okhttp.profiler.OkHttpProfilerInterceptor;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HeaderMap;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;

//使用前 需要导入依赖
/*
  //retrofit
  implementation 'com.squareup.retrofit2:retrofit:2.9.0'
  //Gson converter
  implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  //RxJava2 Adapter
  implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
  //RxJava
  implementation 'io.reactivex.rxjava2:rxjava:2.2.7'
  implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
  implementation 'io.nerdythings:okhttp-profiler:1.1.1'
*/
public class RetrofitUtils {
   private static RetrofitUtils httpUtils = null;//单例获取对象
   private final API API;
   private final String TAG = RetrofitUtils.class.getName();
   private static final Gson gson = new Gson();
   private static final HashMap<String, Object> h = new HashMap<>();
   private static final HashMap<String,Object> p = new HashMap<>();
   private boolean isOpenLog = false;//是否打开log
   private String classname = "";
   private final MultipartBody.Builder builder;

   //初始化
   private RetrofitUtils(String url) {
       OkHttpClient build = new OkHttpClient.Builder()
               .addInterceptor(new LoggingInterceptor())
               .addInterceptor(new OkHttpProfilerInterceptor())
               .connectTimeout(1000 * 30, TimeUnit.MILLISECONDS)
               .writeTimeout(1000 * 30, TimeUnit.MILLISECONDS)
               .build();
       API = new Retrofit.Builder()
               .baseUrl(url)
               .client(build)
               .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
               .build().create(API.class);
       builder = new MultipartBody.Builder();
   }

   //单例获取对象
   public static RetrofitUtils getHttpUtils(String url) {
       if (httpUtils == null) {
           synchronized (RetrofitUtils.class) {
               if (httpUtils == null) {
                   httpUtils = new RetrofitUtils(url);
               }
           }
       }
       return httpUtils;
   }
   //get请求有参
   public <T> void doGet(String url, Map<String, Object> map, final CallBack<T> callBack) {
       API.doGet(url, map)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //get请求请求头 有参
   public <T> void doGet(String url, Map<String, Object> header, Map<String, Object> map, final CallBack<T> callBack) {
       API.doGet(url, header, map)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //get请求 返回值是集合
   public <T> void doGetArray(String url, final ArrayCallBack callBack) {
       API.doGetArray(url)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }
                           callBack.onSuccess(string);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //get请求 无参
   public <T> void doGet(String url, final CallBack<T> callBack) {
       API.doGet(url)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);

                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //post请求 有参
   public <T> void doPost(String url, Map<String, Object> map, final CallBack<T> callBack) {
       API.doPost(url, map)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);

                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //post请求 无参
   public <T> void doPost(String url, final CallBack<T> callBack) {
       API.doPost(url)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);

                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //post请求 请求头 有参
   public <T> void doPost(String url, Map<String, Object> header, Map<String, Object> map, final CallBack<T> callBack) {
       API.doPost(url, header, map)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //上传图片
   public <T> void doFile(String url, File file, final CallBack<T> callBack) {
       RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);//上传的文件
       List<MultipartBody.Part> parts = builder.setType(MultipartBody.FORM)
               //在这里添加服务器除了文件之外的其他参数
               .addFormDataPart("file", file.getName(), body).build().parts();
       final Observable<ResponseBody> upload = API.upload(url, parts);
       upload.subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }
                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType) genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];
                           T o = gson.fromJson(string, actualTypeArgument);
                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {


                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //上传图片 请求头
   public <T> void doFile(String url, Map<String, Object> header, File file, final CallBack<T> callBack) {
       RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);//上传的文件
       List<MultipartBody.Part> parts = builder.setType(MultipartBody.FORM)
               //在这里添加服务器除了文件之外的其他参数
               .addFormDataPart("file", file.getName(), body).build().parts();
       final Observable<ResponseBody> upload = API.upload(url, header, parts);
       upload.subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }

                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType)
                                   genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];

                           T o = gson.fromJson(string, actualTypeArgument);

                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {


                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //post请求 请求头 有参
   @SuppressLint("NewApi")
   public void doPostString(String url, Map<String, Object> header, Map<String, Object> map, final CallBack<String> callBack) {

       API.doPost(url, header, map)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {

                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       String string = null;
                       try {
                           string = responseBody.string();

                           callBack.onSuccess(string);
                       } catch (IOException e) {
                           Log.e(TAG, "onNext: " + classname + "\n" + e.toString() + "\n" + string);
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }
   //post请求 RequestBody 请求头
   @SuppressLint("NewApi")
   public <T> void doPost(String url,RequestBody body, Map<String, Object> header,final CallBack<T> callBack) {

       API.doPost(url,body, header)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {

                   @Override
                   public void onSubscribe(@NonNull Disposable d) {

                   }

                   @Override
                   public void onNext(@NonNull ResponseBody responseBody) {
                       try {
                           String string = responseBody.string();
                           if (isOpenLog) {
                               Log.e(TAG, "onNext: " + classname + "\n" + string);
                           }

                           Type[] genericInterfaces = callBack.getClass().getGenericInterfaces();
                           Type[] actualTypeArguments = ((ParameterizedType)
                                   genericInterfaces[0]).getActualTypeArguments();
                           Type actualTypeArgument = actualTypeArguments[0];

                           T o = gson.fromJson(string, actualTypeArgument);

                           callBack.onSuccess(o);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }

                   @Override
                   public void onError(@NonNull Throwable e) {
                       callBack.onError(e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
   }

   interface API {
       @POST
       @FormUrlEncoded
       Observable<ResponseBody> doPost(@Url String url, @FieldMap Map<String, Object> map);

       @GET
       Observable<ResponseBody> doGet(@Url String url, @QueryMap Map<String, Object> map);

       @GET
       Observable<ResponseBody> doGet(@Url String url);

       @GET
       Observable<ResponseBody> doGetArray(@Url String url);

       @POST
       @FormUrlEncoded
       Observable<ResponseBody> doPost(@Url String url, @HeaderMap Map<String, Object> headerMap, @FieldMap Map<String, Object> map);

       @GET
       Observable<ResponseBody> doGet(@Url String url, @HeaderMap Map<String, Object> headerMap, @QueryMap Map<String, Object> map);

       @Multipart
       @POST
       Observable<ResponseBody> upload(@Url String url, @Part List<MultipartBody.Part> partList);

       @Multipart
       @POST
       Observable<ResponseBody> upload(@Url String url, @HeaderMap Map<String, Object> headerMap, @Part List<MultipartBody.Part> partList);

       @POST
       Observable<ResponseBody> doPost(@Url String url, @Body RequestBody body, @HeaderMap Map<String, Object> header);

       @POST
       @FormUrlEncoded
       Observable<ResponseBody> doPost(@Url String url);

   }

   public RetrofitUtils setClassName(String name) {
       this.classname = name;
       return httpUtils;
   }
   //是否显示log
   public RetrofitUtils isOpenLog(boolean isOpenLog) {
       this.isOpenLog = isOpenLog;
       return httpUtils;
   }

   public static HashMap<String, Object> header(String appid, String version) {
       clearHMap();
       h.put("appid", appid);
       h.put("version", version);
       return h;
   }

   //请求头集合 key通过“,”拼接 如果是String以外的数据类型 需要手动添加对应方法 或者进行转换
   public static HashMap<String, Object> header(String key, String... parameter) {
       clearHMap();
       String[] split = key.split(",");
       for (int i = 0; i < split.length; i++) {
           h.put(split[i], parameter[i]);
       }
       return h;
   }

   //参数集合 key通过“,”拼接 如果是String以外的数据类型 需要手动添加对应方法 或者进行转换
   public static HashMap<String, Object> parameter(String key, String... parameter) {
       clearPMap();
       String[] split = key.split(",");
       for (int i = 0; i < split.length; i++) {
           p.put(split[i], parameter[i]);
       }
       return p;
   }

   //参数集合 手动添加
   public static HashMap<String, Object> parameter() {
       clearPMap();
       return p;
   }

   //数据返回回调方法
   public interface CallBack<T> {
       void onSuccess(T bean);

       void onError(String error);
   }

   //返回数据是数组,回调方法
   interface ArrayCallBack {
       void onSuccess(String responseBody);

       void onError(String error);
   }
   //清空参数集合
   private static void clearPMap() {
       if (p != null && p.size() > 0) {
           p.clear();
       }
   }
   //清空请求头集合
   private static void clearHMap() {
       if (h != null && h.size() > 0) {
           h.clear();
       }
   }
   //拦截器
   static class LoggingInterceptor implements Interceptor {
       private static final String TAG = "LoggingInterceptor";

       @NonNull
       @Override
       public Response intercept(Chain chain) throws IOException {
           Request request = chain.request();//获取请求数据
           //1.请求前--打印请求信息
           long startTime = System.nanoTime();
           Log.d(TAG, String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()));
           //2.网络请求
           Response response = chain.proceed(request);
           //3.网络响应后--打印响应信息
           long endTime = System.nanoTime();
           Log.d(TAG, String.format("Received response for %s in %.1fms%n%s", response.request().url(), (endTime - startTime) / 1e6d, response.headers()));
           return response;
       }
   }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值