Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码详见OkHttp Github。
怎么用
1导入包
// retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
2创造一个retrofit单例
创造一个单例是为了在代码中调用时不用每次都创建对象。
public class InitRetrofit {
private static Retrofit retrofitInstance ;
public static Retrofit getRetrofitInstance(){
if(retrofitInstance == null){
retrofitInstance = new Retrofit.Builder()
.baseUrl(ParamConfig.TEST_HOST)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofitInstance;
}
}
3定义接口api
public interface TaskService {
@FormUrlEncoded
@POST(ParamConfig.GET_TASK)
//Call<JsonObject> getTaskList(@Field("request")String requestParam);
Call<Response> getTaskList(@Field(ParamConfig.PARAM_KEY)String requestParam);
}
定义一个接口类,可以将有关接口都放在其中。 定义一个接口==@POST== @GET注解,括号内追加接口名就好,因为在实例化retrofit时 retrofitInstance = new Retrofit.Builder() .baseUrl(ParamConfig.TEST_HOST) baseUrl 这是host url。 在定义方法时,Call<JsonObject> 或者Call<T> 这是返回对象的类型,在方法定义参数时,@Field(String key)String paramValue 。
4 调用方法
// 实例化
TaskService taskService = InitRetrofit.getRetrofitInstance().create(TaskService.class);
// 调用Api
Call<Response> taskListCall = taskService.getTaskList(ParamConfig.buildParam(jsonParam));
// clone a object
Call<Response> clone = taskListCall.clone();
// 异步
clone.enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
// 返回数据体
Response rep = response.body();
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
}
});
这样就基本完成了一次post请求。之后会涉及到上传文件等方法的调用。
导入日志,查看具体的网络请求
首先需要导入:
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
其次需要添加如下代码:
public class InitRetrofit {
public static HttpLoggingInterceptor getHttpLoggingInterceptor() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(
new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.e("OkHttp", "log = " + message);
}
});
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return loggingInterceptor;
}
private static Retrofit retrofitInstance ;
static OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(getHttpLoggingInterceptor()).build();
public static Retrofit getRetrofitInstance(){
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.create();//使用 gson coverter,统一日期请求格式
if(retrofitInstance == null){
retrofitInstance = new Retrofit.Builder()
.baseUrl(ParamConfig.TEST_HOST)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(httpClient)
.build();
}
return retrofitInstance;
}
}
其中这段代码:
public static HttpLoggingInterceptor getHttpLoggingInterceptor() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(
new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.e("OkHttp", "log = " + message);
}
});
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return loggingInterceptor;
}
static OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(getHttpLoggingInterceptor()).build();
这部分写入即可看到log日志,主要还是要在retrofit实例化的时候写。