Retrofit2网络框架的使用

对于Retrofit2刚开始用的时候说真的很不习惯,感觉封装OKhttp之后反而更麻烦了,后来用到项目中就感觉这个框架很强大,请求网络变得更灵活了,而且易于维护,还可以和时下比较火热的RxJava进行完美融合,在Retrofit2中是用Gson解析数据的。这里只是简单的说下Retrofit2的使用,对于Retrofit2 + RxJava 本人也是在学习中,各位有好的资源还请分享,共同学习。好了,下面记录下本人在项目中对于Retrofit2的封装使用。

导库

这里我将Retrofit2和Gson的库同时导入,各位可以到GitHub查看最新版本,这里我将版本写到project的gradle中,在需要用的地方引用即可。

 ext{
    gsonVersion = '2.8.1'
    // retrofit2
    retrofitVersion ='2.3.0'
    }   
    // Gson解析
    compile "com.google.code.gson:gson:$rootProject.ext.gsonVersion"
    // Retorfit2
    compile "com.squareup.retrofit2:retrofit:$rootProject.ext.retrofitVersion"

贴代码

下面将我们需要使用的请求方式写到接口中,这里我就不一一举例了,就写了一些常用的请求。RetrofitService接口代码:

public interface RetrofitService {

    /**
     * 请求数据
     *
     * @param url
     * @param body
     * @return
     */
    @POST()
    Call<ResponseBody> postWithBody(@Url String url, @Body RequestBody body);

    /**
     * 单文件上传
     *
     * @param url
     * @param type
     * @param maskey
     * @param androidID
     * @param file
     * @return
     */
    @Multipart
    @POST()
    Call<ResponseBody> upload(@Url String url, @Part("type") RequestBody type, @Part("maskey") RequestBody maskey, @Part("androidID") RequestBody androidID, @Part("account") RequestBody account, @Part("isVisible") RequestBody isVisible, @Part("binder") RequestBody binder, @Part MultipartBody.Part file);

    /**
     * 多文件上传
     *下面是我需要的参数,你可以更具需求改变
     * @param url
     * @param type
     * @param maskey
     * @param androidID
     * @param parts
     * @return
     */
    @Multipart
    @POST()
    Call<ResponseBody> multUpload(@Url String url, @Part("type") RequestBody type, @Part("maskey") RequestBody maskey, @Part("androidID") RequestBody androidID, @Part("binder") RequestBody binder, @Part() List<MultipartBody.Part> parts);

下面是网络请求的接口
IHttpData:

public interface IHttpData {
void getHttpData(String url, Map parameter, HttpData.OnResponseListener responseListener);

    void upload(String url, String type, String maskey, String androidID, String binder, String fileUri, HttpData.OnResponseListener responseListener);

    void multUpload(String url, String type, String maskey, String androidID ,String binder, List<String> filePaths, HttpData.OnResponseListener responseListener);
}

定义好接口之后就要实现我们的接口的方法的,访问网络的请求,及状态返回的处理,HttpData代码如下:

public class HttpData implements IHttpData {

    private static final String TAG = HttpData.class.getSimpleName();
    private static Retrofit retrofit;
    private static RetrofitService retrofitService;
    OkHttpClient client;

    public HttpData() {
        if (retrofit == null) {
        // 这里是设置网络超时,文件上传或下载可能比较慢
//            client = new OkHttpClient.Builder()
//                    .connectTimeout(1, TimeUnit.DAYS)
//                    .writeTimeout(1, TimeUnit.DAYS)
//                    .readTimeout(1, TimeUnit.DAYS)
//                    .build();
            retrofit = new Retrofit.Builder().baseUrl(HttpUrl.BASE_HTTP).client(client).build();
            retrofitService = retrofit.create(RetrofitService.class);
        }
    }

    @Override
    public void getHttpData(String url, Map parameter, final OnResponseListener responseListener) {
        //网络请求,获取数据
        RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new JSONObject(parameter).toString());
        //启动请求
        Call<ResponseBody> call = retrofitService.postWithBody(url, body);
        call.enqueue(new Callback<ResponseBody>() {

            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String json =response.body().string();                
                    responseListener.responseSuccess(json);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                responseListener.responseFailed();
            }
        });
    }

    /**
     * 上传单个文件
     *
     * @param url
     * @param type
     * @param fileUri
     * @param responseListener
     */
    @Override
    public void upload(String url, String type, String maskey, String androidID, String binder, String fileUri, final OnResponseListener responseListener) {
        File file = new File(fileUri);
        RequestBody typeRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), type);
        RequestBody maskeyRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), maskey);
        RequestBody androidIDRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), androidID);     
        RequestBody binderRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), binder);
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part fileBody = MultipartBody.Part.createFormData("media", file.getName(), requestFile);
        Call<ResponseBody> call = retrofitService.upload(url, typeRequestBody, maskeyRequestBody, androidIDRequestBody, binderRequestBody, fileBody);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String json = response.body().string();
                    responseListener.responseSuccess(json);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                responseListener.responseFailed();
            }
        });
    }

    /**
     * 多文件上传
     *
     * @param url
     * @param type
     * @param filePaths
     * @param responseListener
     */
    @Override
    public void multUpload(String url, String type, String maskey, String androidID, String binder, List<String> filePaths, final OnResponseListener responseListener) {
        RequestBody typeRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), type);
        RequestBody maskeyRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), maskey);
        RequestBody androidIDRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), androidID);
        RequestBody binderRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), binder);
        List<MultipartBody.Part> parts = new ArrayList<>(filePaths.size());
        for (int i = 0; i < filePaths.size(); i++) {
            File file = new File(filePaths.get(i));
            RequestBody fileBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), fileBody);
            parts.add(part);
        }
        Call<ResponseBody> call = retrofitService.multUpload(url, typeRequestBody, maskeyRequestBody, androidIDRequestBody, binderRequestBody, parts);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String json = response.body().string();
                    responseListener.responseSuccess(json);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                responseListener.responseFailed();
            }
        });

    //这个接口是为了告诉调用者该网络请求的状态
  public interface OnResponseListener {
        void responseSuccess(String json);

        void responseFailed();
    }
    }

这样就将Retrofit2的网络请求都封装好了,这样封装是为了使用方便,易于维护,不用修改每一个有网络请求的地方,只需要修改我们的接口和方法即可,使用就更简单了,直接实例化我们的HttpData 就好了,调用需要的请求。

        //实例化网络的请求类
        HttpData httpData = new HttpData();
        //map存储我们的访问参数
        Map map = new HashMap();
        //url 即我们的接口
        httpData.getHttpData(url, map, new HttpData.OnResponseListener() {
            @Override
            public void responseSuccess(String json) {
               //这里表示访问成功,处理服务端返回的json,用Gson转换即可
            }

            @Override
            public void responseFailed() {
                //这里表示访问出错了
            }
        });

对于Retrofit2的理解不深,文档写的不好,勿喷,让各位见笑了,希望能帮助到刚学习的人,记录下来也是为了让自己对与Retrofit2的理解更深刻一些,大神们有更好的封装使用方法还请赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值