Retrofit2学习使用

一、简介
我们这里所介绍的Retrofit均是指Retrofit2.0
Retrofit是Square公司开发的一个基于OKHttp的Restful API风格的网络请求库。
GitHub地址: https://github.com/square/retrofit

二、Retrofit工作原理
Retrofit的网络请求工作本质上是由OKHttp完成,而Retrofit是对网络请求接口的封装(请求头、请求方式、请求参数,url),
Retrofit是采用注解的方式来配置网络请求参数
Retrofit工作原理图

三、Retrofit使用
使用步骤:
-添加Retrofit依赖
-创建描述网络请求的接口
-创建Retrofit实例
-创建网络请求接口实例
-发送网络请求

步骤详解:
1.添加依赖

compile 'com.squareup.retrofit2:retrofit:2.3.0'

2.创建描述网络请求的接口
Retrofit将Http请求抽象成Java接口,采用注解描述和配置网络请求参数

public interface RetrofitRequestInterface {
       @FormUrlEncoded   
       @POST("index/userInfo.do")
       Call<String> getUserInfo(@FieldMap Map<String, String> params);
   }

注解说明:

-请求方式注解

(1)@Post、@Get分别代表POST和GET请求
此处说明一下URL的组成,Retrofit中的URL由两部分组成,一部分是在创建Retrofit实例的时候设置的BaseUrl,
一部分是在网络请求接口方法的注解中设置的,例如这里的
@POST(“index/userInfo.do”)

-请求参数注解
(1)@Field、@FieldMap
发送Post请求时、提交请求参数,@Field提交单个请求参数,@FieldMap以Map格式提交多个参数。
@Field和@FieldMap必须和@FormUrlEncode配合使用

(2)@Query、@QueryMap
Get请求时,携带请求参数,与@Field和@FieldMap相对应,分别提交单个和多个请求参数。
注意:如果服务端支持GET/POST两种类型的请求时,那么Post请求也可以使用@Query和@QueryMap携带请求参数。
只不过Post请求时所带的参数也会像Get请求一样以key=value&key1=value1等形式拼接在url后面

(3)@Path
动态拼接URL

  public interface RetrofitRequestInterface {
       @FormUrlEncoded   
       @POST("{headPath}/firstTimeLookMe.do")
       Call<String> getUserInfo(@Path("headPath") String headPath,@FieldMap Map<String, String> params);
   }

这里的headPath就是需要动态传入的

(4)@Url
传入一个URL变量,来动态指定URL

 public interface RetrofitRequestInterface {

       @FormUrlEncoded   
       @POST
       Call<String> getUserInfo(@Url String url,@FieldMap Map<String, String> params);
   }

3.创建Retrofit实例

Retrofit retrofit=new Retrofit()

                       .baseUrl("http://app.diewin.cn/ndyym/control/")

                       .addConvertFactory(ScalarsConverterFactory.create())

                       .build();

这里的baseUrl必须是要设置的,且baseUrl必须是以 ” / ” 结束
addConvertFactory ()是添加数据解析器,默认的响应数据都是Response< Body >格式的,我们希望这里的响应数据格式都是Response< String >类型的,所以设置ScalarsConvertFactory数据解析器。
数据解析器需要添加相应的依赖

compile 'com.squareup.retrofit2:converter-scalars:2.3.0'

4.创建请求接口实例

RetrofitRequestInterface retrofitPostInterface= retrofit.create(RetrofitRequestInterface.class)

5.发送网络请求

 Map<String,String> map=new HashMap<>();
     map.put("city","0");
     map.put("memberId","1");

     Call<String> call=retrofitPostInterface.getUserInfo(map)

     retrofitPostInterface.enqueue(new Callback<String>() {

            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.e(TAG, response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.e(TAG, t.getMessage());
            }
        });

以上就是Retrofit发送一个网络请求的基本步骤

四、Retrofit封装

Retrofit请求管理类

public class RetrofitManager {
    private Retrofit mRetrofit;
    private OkHttpClient mOkHttpClient;
    private String mBaseUrl;
    private long mConnectTimeout;
    private long mReadTimeout;
    private long mWriteTimeout;
    private static final long DEFAULT_TIMEOUT = 10000;

    private RetrofitManager(Builder builder) {
        this.mConnectTimeout = builder.mConnectTimeout;
        this.mReadTimeout = builder.mReadTimeout;
        this.mWriteTimeout = builder.mWriteTimeout;
        this.mBaseUrl = builder.mBaseUrl;
        initRetrofit();
    }

    private void initRetrofit() {

        mOkHttpClient = new OkHttpClient.Builder()
                .connectTimeout(mConnectTimeout, TimeUnit.SECONDS)
                .writeTimeout(mReadTimeout, TimeUnit.SECONDS)
                .readTimeout(mWriteTimeout, TimeUnit.SECONDS)
                .build();

        mRetrofit = new Retrofit.Builder()
                .baseUrl(mBaseUrl)
                .addConverterFactory(ScalarsConverterFactory.create())
                .client(mOkHttpClient)
                .build();
    }

    public <T> T createRequest(Class<T> requestClass) {
        return mRetrofit.create(requestClass);
    }

    public static final class Builder {
        private String mBaseUrl;
        private long mConnectTimeout;
        private long mReadTimeout;
        private long mWriteTimeout;

        public Builder() {
            mConnectTimeout = DEFAULT_TIMEOUT;
            mReadTimeout = DEFAULT_TIMEOUT;
            mWriteTimeout = DEFAULT_TIMEOUT;
        }

        public Builder baseUrl(String baseUrl) {
            mBaseUrl = baseUrl;
            return this;
        }

        public Builder connectTimeout(long timeout) {
            mConnectTimeout = timeout;
            return this;
        }

        public Builder readTimeout(long timeout) {
            mReadTimeout = timeout;
            return this;
        }

        public Builder writeTimeout(long timeout) {
            mWriteTimeout = timeout;
            return this;
        }

        public RetrofitManager build() {
            return new RetrofitManager(this);
        }
    }

}

自定义Retrofit请求回调接口

public abstract class RetrofitCallBack implements Callback<String> {

    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        if (response.code() == 200) {
            onSuccess(response.body());
        } else {
            try {
                onError(new Throwable(response.errorBody().string()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        onError(t);
    }

    public abstract void onSuccess(String response);

    public abstract void onError(Throwable t);

}

使用:
在Application中初始化Retrofit

    /**
     * 初始Retrofit
     */
    private void initRetrofit() {
        RequestManager.mRetrofitManager = new RetrofitManager.Builder()
                .baseUrl(RequestManager.mBaseUrl)
                .connectTimeout(20 * 1000)
                .readTimeout(20 * 1000)
                .writeTimeout(20 * 1000)
                .build();
    }

网络请求接口文件

public interface RetrofitRequestInterface {
     /**
     * 获取首页数据
     */
    @FormUrlEncoded
    @POST(RequestManager.mInterfacePrefix + "Homepage")
    Call<String> getHomepageData(@FieldMap Map<String, String> params);
}

网络请求实例:

        Map<String, String> map = new HashMap<>();
        map.put("now_lat", MainConstant.mLatitude + "");
        map.put("now_lng", MainConstant.mLongitude + "");
        RequestManager.mRetrofitManager
                .createRequest(RetrofitRequestInterface.class)
                .getHomepageData(RequestManager.encryptParams(map))
                .enqueue(new RetrofitCallBack() {
                    @Override
                    public void onSuccess(String response) {

                    }

                    @Override
                    public void onError(Throwable t) {

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值