使用Retrofit加okhttp,如果返回失败的话,callback中response中不能看到失败的网页源码
为此我们有两种方法,通过okhttp拦截器或者retrofit自定义ResponseConvertFactory实现
public class ApiUtil {
private static final int DEFAULT_TIMEOUT = 5;
private Retrofit retrofit;
private EnergySavingService energySavingService;
private static final boolean DEBUG = true;
private ApiUtil(){
OkHttpClient.Builder builder = new OkHttpClient.Builder();
// 添加自定义的拦截器
builder.addInterceptor(new ResponseInterceptor());
builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
builder.cookieJar(new CookieJar() {
private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url.host(), cookies);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
return cookies != null ? cookies : new ArrayList<Cookie>();
}
});
retrofit = new Retrofit.Builder()
.client(builder.build())
//这里使用的是自定义的ResponseConvertFactory
.addConverterFactory(ResponseConvertFactory.create())
.baseUrl(EnergySavingService.BASE_URL)
.build();
以下略
}
private static class SingletonHolder{
private static final ApiUtil INSTANCE = new ApiUtil();
}
public static ApiUtil getInstance(){
return SingletonHolder.INSTANCE;
}
方法一
ResponseInterceptor .java
public class ResponseInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
// 以下两句还有点问题
MediaType mediaType = response.body().contentType();
// 获取网页源码
String content = response.body().string();
try{
Log.d("flag--","intercept(ResponseInterceptor.java:39)-->>"+content);
check(response);
}catch (Exception e){
e.printStackTrace();
}
return response.newBuilder()
.body(ResponseBody.create(mediaType, content))
.build();
}
}
方法二
ResponseConvertFactory.java
public class ResponseConvertFactory extends Converter.Factory{
public static ResponseConvertFactory create() {
return create(new Gson());
}
public static ResponseConvertFactory create(Gson gson) {
return new ResponseConvertFactory(gson);
}
private final Gson gson;
private ResponseConvertFactory(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
this.gson = gson;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
return new GsonResponseBodyConverter<>(gson,type);
}
}
package com.huanke.cisl.energysaving.util;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import java.lang.reflect.Type;
import okhttp3.ResponseBody;
import retrofit2.Converter;
class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final Type type;
GsonResponseBodyConverter(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}
@Override
public T convert(ResponseBody value) throws IOException {
String response = value.string();
// 在这里可以打印出网页源码
Log.d("flag--","convert(GsonResponseBodyConverter.java:26)-->>"+response);
return gson.fromJson(response, type);
}
}
最终效果
参考:
http://blog.youkuaiyun.com/ethanco/article/details/51908479
http://www.jianshu.com/p/d836271b1ae4