Rtrofit+Rxjava网络请求封装

好几年前封装的框架一直没上传,趁现在升级写下。

     简介Retrofit是android的网络请求库,是一个RESTful的HTTP网络请求框架的封装(基于okhttp)。它内部网络请求的工作,本质上是通过OkHttp完成,而Retrofit仅负责网络请求接口的封装。

目录

一、引包

二、网络请求分为三个包分别为data、httptool、request三个pakage包。

三、pakage包分析

       3.1.data

              3.1.1HttpBaseResponse

   3.1.2.HttpDisposable

        3.1.3.HttpResponseInterface

3.2.httptool 为http工具类的封装

    3.2.1 添加cookie拦截

  3.2.2.HttpException自定义异常抛出

  3.2.3 HttpInterceptor请求拦截器

3.2.4.ResponseConverterFactory处理服务器返回数据将数据转换成对象

 3.2.5 UploadUtils 文件上传

3.3 request

3.3.1.ApiAddress网络请求接口地址

3.3.2.HttpFactory网络请求

3.3.3HttpRequest

3.3.4ServerAddress

四、使用

4.1.在应用的applacation中初始化

4.2.请求示例


一、引包

    //    retrofit2
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    //    RxJava
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.12'

二、网络请求分为三个包分别为data、httptool、request三个pakage包。

      data:数据处理封装类

      httptool:网络请求工具

      request:请求处理

三、pakage包分析

       3.1.data

              data中有三个对象,分别对应  HttpBaseResponse(http响应处理)、HttpDisposable(与rxjava请求回调处理)、HttpResponseInterface(获取处理掉code和msg后的信息)。

              3.1.1HttpBaseResponse

/**
 * @author shizhiyin
 */
public interface HttpResponseInterface {

    /**
     * 获取处理掉code和msg后的信息
     *
     * @param gson
     * @param response
     * @return
     */
    String getResponseData(Gson gson, String response);

}

   3.1.2.HttpDisposable


/**
 * @author shizhiyin
 * 返回数据
 */
public abstract class HttpDisposable<T> extends DisposableObserver<T> {

    public HttpDisposable() {
    }

    @Override
    protected void onStart() {
    }

    @Override
    public void onNext(T value) {
        success(value);
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }

    public abstract void success(T t);
}

        3.1.3.HttpResponseInterface

/**
 * @author shizhiyin
 */
public interface HttpResponseInterface {

    /**
     * 获取处理掉code和msg后的信息
     *
     * @param gson
     * @param response
     * @return
     */
    String getResponseData(Gson gson, String response);

}

3.2.httptool 为http工具类的封装

    3.2.1 添加cookie拦截


public class AddCookiesInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {

        if (!NetworkUtils.isConnected()) {
            throw new HttpException("网络连接异常,请检查网络后重试");
        }
        Request.Builder builder = chain.request().newBuilder();
        HashSet<String> preferences = Hawk.get(Constants.HawkCode.COOKIE);
        if (preferences != null) {
            for (String cookie : preferences) {
                builder.addHeader("Cookie", cookie);
                Log.v("OkHttp", "Adding Header: " + cookie);
                // This is done so I know which headers are being added; this interceptor is used after the normal logging of OkHttp

            }
        }
        return chain.proceed(builder.build());
    }
}

  3.2.2.HttpException自定义异常抛出

    


/**
 * 自定义异常抛出
 *
 * @author shizhiyin
 */
public class HttpException extends RuntimeException {

    public HttpException(String message) {
        this.message = message;
    }

    public HttpException(int code, String message) {
        this.message = message;
        this.code = code;
    }

    @Override
    public String getMessage() {
        return TextUtils.isEmpty(message) ? "" : message;
    }


    public int getCode() {
        return code;
    }

    private int code;
    private String message;

}

  3.2.3 HttpInterceptor请求拦截器


/**
 * 自定义
 * 请求拦截器
 *
 * @author shizhiyin
 */

public class HttpInterceptor implements Interceptor {

    private static final Charset UTF8 = Charset.forName("UTF-8");
    private static String REQUEST_TAG = "请求";

    /**
     * 通过拦截器
     * 添加请求头
     * 及
     * 打印请求结果
     */
    @Override
    public Response intercept(Chain chain) throws IOException {
        if (!NetworkUtils.isConnected()) {
            throw new HttpException("网络连接异常,请检查网络后重试");
        }

        Request request = chain.request();
        request = getHeaderRequest(request);
        //打印请求
        logRequest(request);

        Response response = chain.proceed(request);
        //
//        if (!response.headers("Set-Cookie").isEmpty()) {
//            HashSet<String> cookies = new HashSet<>();
//            for (String header : response.headers("Set-Cookie")) {
//                cookies.add(header);
//            }
//            Hawk.put(Constants.HawkCode.COOKIE, cookies);
//        }
        //
        //打印响应
        logResponse(response);
        return response;
    }

    /**
     * 添加header
     */
    public Request getHeaderRequest(Request request) {

//        LoginRequestBean loginData =null;
        LoginRequestBean loginData = Hawk.get(Constants.HawkCode.LOGIN_TOKEN_INFO);

        Request headRequest;
        if (loginData != null) {
//            Logger.d("===缓存获取token=="+loginData.getToken());
            headRequest = request
                    .newBuilder()
                    .addHeader("Content-Type", "application/json")
                    .addHeader("terminal", "doctor")
                    .addHeader("Authorization", loginData.getToken())
                    .build();
        } else {
            headRequest = request
                    .newBuilder()
                    .addHeader("Content-Type", "application/json")
                    .addHeader("terminal", "doctor")
                    .build();
        }
        return headRequest;
    }

    /**
     * 打印请求信息
     *
     * @param request
     */
    private void logRequest(Request request) {
        Log.d(REQUEST_TAG + "method", request.method());
        Log.d(REQUEST_TAG + "url", request.url().toString());
        Log.d(REQUEST_TAG + "header", request.headers().toString());
        if (request.method().equals("GET")) {
            return;
        }
        try {
            RequestBody requestBody = request.body();
            String parameter = null;
            Buffer buffer = new Buffer();
            requestBody.writeTo(buffer);
            parameter = buffer.readString(UTF8);
            buffer.flush();
            buffer.close();
            Log.d(REQUEST_TAG + "参数", parameter);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 打印返回结果
     *
     * @param response
     */
    private void logResponse(Response response) {

        try {
            ResponseBody responseBody = response.body();

            String rBody = null;
            BufferedSource source = responseBody.source();
            source.request(Long.MAX_VALUE);
            Buffer buffer = source.buffer();
            Charset charset = UTF8;
            MediaType contentType = responseBody.contentType();
            if (contentType != null) {
                try {
                    charset = contentType.charset(UTF8);
                } catch (UnsupportedCharsetException e) {
                    e.printStackTrace();
                }
            }
            rBody = buffer.clone().readString(charset);
//            Logger.d("===business==响应体==="+rBody);
            Log.d(REQUEST_TAG + "返回值", rBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2.4.ResponseConverterFactory处理服务器返回数据将数据转换成对象


/**
 * 处理服务器返回数据
 * 将数据转换成对象
 *
 * @author shizhiyin
 */
public class ResponseConverterFactory extends Converter.Factory {

    private final Gson mGson;

    public ResponseConverterFactory(Gson gson) {
        this.mGson = gson;
    }

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

    public static ResponseConverterFactory create(Gson gson) {
        if (gson == null) throw new NullPointerException("gson == null");
        return new ResponseConverterFactory(gson);
    }

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

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        return GsonConverterFactory.create().requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit);
    }

    private class BaseResponseBodyConverter<T> implements Converter<ResponseBody, T> {
        private Type mType;

        private BaseResponseBodyConverter(Type mType) {
            this.mType = mType;
        }

        @Override
        public T convert(ResponseBody response) {
            Object object;
            try {
                String strResponse = response.string();

                if (TextUtils.isEmpty(strResponse)) {
                    throw new HttpException("返回值是空的—-—");
                }

                if (HttpFactory.httpResponseInterface == null) {
                    throw new HttpException("请实现接口HttpResponseInterface—-—");
                } else {
//                    String strData = HttpFactory.httpResponseInterface.getResponseData(mGson, strResponse);
//                    Logger.d("==login返回值是=="+strData.toString());
                    // strResponse 保留接口返回的全部数据
                    // strData 只保留接口返回的data数据
                    object = mGson.fromJson(strResponse, mType);
                }
            } catch (Exception e) {
                throw new HttpException(e.getMessage());
            } finally {
                response.close();
            }

            return (T) object;
        }
    }
}

 3.2.5 UploadUtils 文件上传


/**
 * Created by shizhiyin.
 * Time:2023年10月16日.
 * Retrofit文件上传
 */

public class UploadUtils {
  private static final String FILE_NOT_NULL = "文件不能为空";
  private static final String FILE_PATH_NOT_NULL = "文件路径不能为空";

  public static MultipartBody.Part getMultipartBody(String path) {
    if (TextUtils.isEmpty(path)) throw new NullPointerException(FILE_PATH_NOT_NULL);
    File file = new File(path);
    if (file.exists()) {
      RequestBody requestFile =
          RequestBody.create(MediaType.parse("application/octet-stream"), file);
      MultipartBody.Part body =
          MultipartBody.Part.createFormData("imgFile", file.getName(), requestFile);
      return body;
    } else {
//      throw new NullPointerException(FILE_NOT_NULL);
      return null;
    }
  }

  public static MultipartBody.Part getMultipartBody(File file) {
    if (file.exists()) {
      RequestBody requestFile =
          RequestBody.create(MediaType.parse("application/octet-stream"), file);
      MultipartBody.Part body =
          MultipartBody.Part.createFormData("file", file.getName(), requestFile);
      return body;
    } else {
      throw new NullPointerException(FILE_NOT_NULL);
    }
  }

  public static List<MultipartBody.Part> getMultipartBodysForFile(List<File> files) {
    if (files.isEmpty()) throw new NullPointerException(FILE_NOT_NULL);
    MultipartBody.Builder builder = new MultipartBody.Builder();
    for (File file : files) {
      if (file.exists()) {
        RequestBody requestFile =
            RequestBody.create(MediaType.parse("application/octet-stream"), file);
        builder.addFormDataPart("file", file.getName(), requestFile);
      } else {
        throw new NullPointerException(FILE_NOT_NULL);
      }
    }
    return builder.build().parts();
  }

  public static List<MultipartBody.Part> getMultipartBodysForPath(List<String> paths) {
    if (paths.isEmpty()) throw new NullPointerException(FILE_PATH_NOT_NULL);
    MultipartBody.Builder builder = new MultipartBody.Builder();
    for (String path : paths) {
      File file = new File(path);
      if (file.exists()) {
        RequestBody requestFile =
            RequestBody.create(MediaType.parse("application/octet-stream"), file);
        builder.addFormDataPart("file", file.getName(), requestFile);
      } else {
        throw new NullPointerException(FILE_NOT_NULL);
      }
    }
    return builder.build().parts();
  }
}

3.3 request

3.3.1.ApiAddress网络请求接口地址


public interface ApiAddress {


    /**
     * 新增原生登录接口
     * LogingResponseBean
     */
    @POST("auth/login")
    Observable<LogingResponseBean> LoginPost(@Body JSONObject parmas);
}

3.3.2.HttpFactory网络请求


/**
 * @author shizhiyin
 * 网络请求
 */
public class HttpFactory {

    public static String HTTP_HOST_URL = "";
    public static HttpResponseInterface httpResponseInterface = null;

    private HttpFactory() {
    }

    /**
     * 设置HttpClient
     */
    private static OkHttpClient HTTP_CLIENT =
            new Builder()
                    //添加自定义拦截器
                    .addInterceptor(new HttpInterceptor())
                    .addInterceptor(new AddCookiesInterceptor())
                    //设置超时时间
                    .connectTimeout(60, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .build();

    private static Retrofit retrofit = null;

    public static <T> T getChangeUrlInstance(String url, Class<T> service) {
        return new Retrofit.Builder().baseUrl(url)
                .addConverterFactory(ResponseConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(HTTP_CLIENT)
                .build()
                .create(service);
    }

    public static <T> T getInstance(Class<T> service) {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder().baseUrl(HTTP_HOST_URL)
                    .addConverterFactory(ResponseConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(HTTP_CLIENT)
                    .build();
        }
        return retrofit.create(service);
    }


    @SuppressWarnings("unchecked")
    public static <T> ObservableTransformer<T, T> schedulers() {
        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(Observable<T> upstream) {
                return upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
            }
        };
    }
}

3.3.3HttpRequest


/**
 * @author shizhiyin
 */
public class HttpRequest {

    private static ApiAddress Instance;

    public static ApiAddress getInstance() {
        if (Instance == null) {
            synchronized (HttpRequest.class) {
                if (Instance == null) {
                    Instance = HttpFactory.getInstance(ApiAddress.class);
                }
            }
        }
        return Instance;
    }

    public static ApiAddress getInstance(String url) {
        return HttpFactory.getChangeUrlInstance(url, ApiAddress.class);
    }

}

3.3.4ServerAddress


/**
 * 服务器地址
 *
 * @author shizhiyin
 */
public class ServerAddress {

    public static final String API_DEFAULT_HOST = "https://........com/";
}

四、使用

4.1.在应用的applacation中初始化

/**
     * 请求配置
     */
    public static void setHttpConfig() {

        HttpFactory.HTTP_HOST_URL = ServerAddress.getApiDefaultHost();
        HttpFactory.httpResponseInterface = (gson, response) -> {

            if (firstOpen) {
                firstOpen = false;
                return response;
            }

            HttpBaseResponse httpResponse = gson.fromJson(response, HttpBaseResponse.class);
            if (httpResponse.errorCode != 0) {
                throw new HttpException(httpResponse.errorCode, httpResponse.errorMsg);
            }
            return gson.toJson(httpResponse.data);
        };
    }

4.2.请求示例

 private void login(String name, String pwd) {

        LoginRequestBean loginRequestBean = new LoginRequestBean(name, pwd);

          HttpRequest.getInstance(ServerAddress.BASE_URL)
                .LoginPost((JSONObject) JSON.toJSON(loginRequestBean))
                .compose(HttpFactory.schedulers())
                .subscribe(new HttpDisposable<LogingResponseBean>() {
            @Override
            public void success(LogingResponseBean bean) {


            }

            @Override
            public void onError(Throwable e) {
                super.onError(e);
                Logger.d("====login=登录onError==" + e.toString());
            }
        });

    }

最后要感谢玩Android开源平台提供的参考。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Android项目中的网络请求RxJava、Retrofit和MVP是常用的框架组合。下面是一个简单的网络框架封装示例: 首先,在项目中引入RxJava和Retrofit的依赖。 ``` implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' ``` 然后,创建一个Retrofit的单例类,用于进行网络请求的初始化和配置。 ```java public class RetrofitClient { private static Retrofit retrofit; private static final String BASE_URL = "https://api.example.com/"; public static Retrofit getClient() { if (retrofit == null) { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } return retrofit; } } ``` 接下来,创建一个ApiService接口,定义网络请求的方法。 ```java public interface ApiService { @GET("users") Observable<List<User>> getUsers(); } ``` 然后,创建一个DataManager类,用于管理网络请求。 ```java public class DataManager { private ApiService apiService; public DataManager() { apiService = RetrofitClient.getClient().create(ApiService.class); } public Observable<List<User>> getUsers() { return apiService.getUsers(); } } ``` 最后,在MVP的Presenter中调用DataManager类进行网络请求。 ```java public class UserPresenter { private UserView userView; private DataManager dataManager; public UserPresenter(UserView userView) { this.userView = userView; dataManager = new DataManager(); } public void getUsers() { dataManager.getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<User>>() { @Override public void onSubscribe(Disposable d) { // 在请求开始时的操作 } @Override public void onNext(List<User> users) { // 请求成功返回数据时的操作 userView.showUsers(users); } @Override public void onError(Throwable e) { // 请求失败时的操作 userView.showError(e.getMessage()); } @Override public void onComplete() { // 请求完成时的操作 } }); } } ``` 这样,就完成了一个简单的Android RxJava + Retrofit + MVP网络框架封装。你可以根据自己的需要,进行进一步的封装和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值