Retrofit已经升级到2.0版本了,之前在项目中一直使用Volley作为网络请求框架那么为什么我们要考虑替换到Retrofit呢。
compileSdkVersion 23
buildToolsVersion "23.0.2"
没错如果我们把我们app的编译版本修改成最新的时候Volley中的HttpClient类就会编译提示错误,还有一个原因是现在慢慢逐渐的RxAndroid+Retrofit的整合出现变成主线了基于这两个原因我们也跟上时代免得被out。
Retrofit是Square一个良心的企业开源的网络请求框架
https://github.com/square/retrofit
他是这么描述Retrofit:Type-safe HTTP client for Android and Java by Square,由于他的高性能以及使用简单慢慢变成了世面主流的Http网络请求框架了。
在Gradle中引入Retrofit:
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
我们使用一个例子来描述如何使用Retrofit然后我们再做定制让它完美的适应于自己的应用中去。
首先我们需要定义一个接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
然后我们需要需要创建一个Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.build();
GitHubService service = retrofit.create(GitHubService.class);
一切就绪之后在相对应的地方开启请求
Call<List<Repo>> call = service.listRepos("octocat");
call.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Response<List<Repo>> response) {
Log.w(TAG, "Retrofit success ...");
}
@Override
public void onFailure(Throwable t) {
Log.w(TAG, "Retrofit failed ...");
}
});
是不是觉得很方便的就完成了一次网络请求,到时候我们就只需要在onResponse这个方法中取出我们想要的数据显示到UI界面上即可了。
JSON数据解析
在Retrofit中为我们提供了很多的JSON数据解析库我们只需要进行compile到gradle中就能愉快的使用起来了。
Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
然后我们修改一下Retrofit的初始化设置
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
每次我们只需要修改addConverterFactory这个方法传入我们项目中使用的Json数据解析库即可。
自定义JSON数据解析
是不是你跟我一样那我项目中使用Fastjson作为Json数据解析库怎么自定义呢?首先我们需要自己定义一个类来实现Converter.Factory这个接口:
public class FastJsonConverterFactory extends Converter.Factory {
@Override
public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
return super.fromResponseBody(type, annotations);
}
}
可是到了这一步的时候好像懵了,下一步怎么做呢。所以我看了GsonConverterFactory的实现源码发现它在fromResponseBody中还自己定义一个GsonResponseBodyConverter来进行解析数据。所以我们如法炮制了一个出来:
final class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
@Override
public T convert(ResponseBody value) throws IOException {
return (T) JSON.parseObject(value.string(), NetMainResponse.class);
}
}
这里我直接将服务器返回的结果都封装到NetMainResponse这个类中让它统一都返回NetMainResponse对象给我们然后我们在Callback中取出数据再做相对应的处理即可了。
call.enqueue(new Callback<NetMainResponse>() {
@Override
public void onResponse(Response<NetMainResponse> response, Retrofit retrofit) {
Log.w(TAG, "retrofit success...");
Log.w(TAG, "response = " + response.body().toString());
}
@Override
public void onFailure(Throwable t) {
Log.w(TAG, "retrofit failed...");
}
});
就这样我们自定义ConverterFactory类就完成了
Retrofit.Builder builder = new Retrofit.Builder().baseUrl(API_URL)
.addConverterFactory(new FastJsonConverterFactory());// 添加FastJson来进行对数据解析
这样配置之后我们就能愉快的使用起Fastjson来进行数据解析了。
自定义Cookie
因为项目中有用到cookie这时候我又开始犹豫一个问题如何加入cookie呢?由于Retrofit嵌入OkHttpclient作为网络底层去请求网络,所以我们只要想办法在这方面入手即可了。
public class HttpHeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader("cookie", "cookie123456789");
return chain.proceed(builder.build());
}
}
实现Interceptor这个接口然后重新配置一下Retrofit这个对象就好了
public static void addOkHttpClientHeader() {
httpClient.interceptors().add(new HttpHeaderInterceptor());
retrofit = builder.client(httpClient).build();
}
差不多了,平时一个Http网络请求就封装好了:一个Retrofit框架网络请求并以Fastjson作为Json数据解析还有支持添加cookie就完成了,接下来就是愉快的Http GET/POST各种请求了。