一、简介
我们这里所介绍的Retrofit均是指Retrofit2.0
Retrofit是Square公司开发的一个基于OKHttp的Restful API风格的网络请求库。
GitHub地址: https://github.com/square/retrofit
二、Retrofit工作原理
Retrofit的网络请求工作本质上是由OKHttp完成,而Retrofit是对网络请求接口的封装(请求头、请求方式、请求参数,url),
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) {
}
});