okhttp通过拦截器输出html源码内容

来源:互联网 发布:linux停机命令 编辑:程序博客网 时间:2024/06/11 07:58

使用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.csdn.net/ethanco/article/details/51908479
http://www.jianshu.com/p/d836271b1ae4

原创粉丝点击