提交 6d9193b2 编写于 作者: J jessyan

improve RequestInterceptor

上级 ea698bbf
......@@ -61,8 +61,8 @@ dependencies {
annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
compile rootProject.ext.dependencies["paginate"]
//arms
// compile project(':arms')
compile 'me.jessyan:arms:1.2.5'
compile project(':arms')
// compile 'me.jessyan:arms:1.2.5'
//test
testCompile rootProject.ext.dependencies["junit"]
debugCompile rootProject.ext.dependencies["canary-debug"]
......
......@@ -112,7 +112,7 @@ public class WEApplication extends BaseApplication {
JSONObject object = (JSONObject) array.get(0);
String login = object.getString("login");
String avatar_url = object.getString("avatar_url");
Timber.tag(TAG).w("result ------>" + login + " || avatar_url------>" + avatar_url);
Timber.tag(TAG).w("Result ------> " + login + " || Avatar_url------> " + avatar_url);
}
} catch (JSONException e) {
......@@ -135,10 +135,10 @@ public class WEApplication extends BaseApplication {
return response;
}
// 这里可以在请求服务器之前可以拿到request,做一些操作比如给request统一添加token或者header
// 这里可以在请求服务器之前可以拿到request,做一些操作比如给request统一添加token或者header以及数据加密等操作
@Override
public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) {
//如果需要再请求服务器之前做一些操作,则重新返回一个做过操作的的requeat如增加header,不做操作则返回request
//如果需要再请求服务器之前做一些操作,则重新返回一个做过操作的的requeat如增加header,不做操作则直接返回request参数
//return chain.request().newBuilder().header("token", tokenId)
// .build();
......
......@@ -3,7 +3,8 @@ package com.jess.arms.di.module;
import android.app.Application;
import com.jess.arms.base.AppManager;
import com.jess.arms.http.RequestIntercept;
import com.jess.arms.http.GlobeHttpHandler;
import com.jess.arms.http.RequestInterceptor;
import com.jess.arms.utils.DataHelper;
import java.io.File;
......@@ -68,15 +69,14 @@ public class ClientModule {
@Singleton
@Provides
OkHttpClient provideClient(OkHttpClient.Builder okHttpClient, Interceptor intercept
, List<Interceptor> interceptors) {
, List<Interceptor> interceptors, GlobeHttpHandler handler) {
OkHttpClient.Builder builder = okHttpClient
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.addInterceptor(chain -> chain.proceed(handler.onHttpRequestBefore(chain, chain.request())))
.addNetworkInterceptor(intercept);
if (interceptors != null && interceptors.size() > 0) {//如果外部提供了interceptor的数组则遍历添加
for (Interceptor interceptor : interceptors) {
builder.addInterceptor(interceptor);
}
interceptors.forEach(builder::addInterceptor);
}
return builder
.build();
......@@ -97,11 +97,9 @@ public class ClientModule {
}
@Singleton
@Provides
Interceptor provideIntercept(RequestIntercept intercept) {
Interceptor provideInterceptor(RequestInterceptor intercept) {
return intercept;//打印请求信息的拦截器
}
......
......@@ -71,9 +71,8 @@ public class GlobeConfigModule {
/**
* 提供缓存地址
* 提供缓存文件
*/
@Singleton
@Provides
File provideCacheFile(Application application) {
......
......@@ -2,6 +2,7 @@ package com.jess.arms.http;
import android.support.annotation.NonNull;
import com.jess.arms.utils.CharactorHandler;
import com.jess.arms.utils.ZipHelper;
import java.io.IOException;
......@@ -22,18 +23,16 @@ import okio.Buffer;
import okio.BufferedSource;
import timber.log.Timber;
import static com.jess.arms.utils.CharactorHandler.jsonFormat;
/**
* Created by jess on 7/1/16.
*/
@Singleton
public class RequestIntercept implements Interceptor {
public class RequestInterceptor implements Interceptor {
private GlobeHttpHandler mHandler;
@Inject
public RequestIntercept(GlobeHttpHandler handler) {
public RequestInterceptor(GlobeHttpHandler handler) {
this.mHandler = handler;
}
......@@ -41,21 +40,14 @@ public class RequestIntercept implements Interceptor {
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (mHandler != null)//在请求服务器之前可以拿到request,做一些操作比如给request添加header,如果不做操作则返回参数中的request
request = mHandler.onHttpRequestBefore(chain, request);
Buffer requestbuffer = new Buffer();
if (request.body() != null) {
request.body().writeTo(requestbuffer);
} else {
Timber.tag("Request").w("request.body() == null");
}
//打印url信息
Timber.tag("Request").w("Sending Request %s on %n Params ---> %s%n Connection ---> %s%n Headers ---> %s", request.url()
Timber.tag(getTag(request, "Request_Info")).w("Params : 「 %s 」%nConnection : 「 %s 」%nHeaders : %n「 %s 」"
, request.body() != null ? parseParams(request.body(), requestbuffer) : "null"
, chain.connection()
, request.headers());
......@@ -64,43 +56,66 @@ public class RequestIntercept implements Interceptor {
Response originalResponse = chain.proceed(request);
long t2 = System.nanoTime();
//打印响应时间
Timber.tag("Response").w("Received response in %.1fms%n%s", (t2 - t1) / 1e6d, originalResponse.headers());
Timber.tag(getTag(request, "Response_Info")).w("Received response in [ %.1fms ]%n%s", (t2 - t1) / 1e6d, originalResponse.headers());
//读取服务器返回的结果
ResponseBody responseBody = originalResponse.body();
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
String bodyString = null;
if (isJson(responseBody)) {
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE); // Buffer the entire body.
Buffer buffer = source.buffer();
//获取content的压缩类型
String encoding = originalResponse
.headers()
.get("Content-Encoding");
Buffer clone = buffer.clone();
//获取content的压缩类型
String encoding = originalResponse
.headers()
.get("Content-Encoding");
//解析response content
bodyString = parseContent(responseBody, encoding, clone);
Buffer clone = buffer.clone();
String bodyString;
Timber.tag(getTag(request, "Response_Result")).w(CharactorHandler.jsonFormat(bodyString));
//解析response content
} else {
Timber.tag(getTag(request, "Response_Result")).w("The result isn't json");
}
if (mHandler != null)//这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
return mHandler.onHttpResultResponse(bodyString, chain, originalResponse);
return originalResponse;
}
public String getTag(Request request, String tag) {
return "「 " + request.url() + " 」" + tag;
}
/**
* 解析服务器响应的内容
*
* @param responseBody
* @param encoding
* @param clone
* @return
*/
private String parseContent(ResponseBody responseBody, String encoding, Buffer clone) {
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {//content使用gzip压缩
bodyString = ZipHelper.decompressForGzip(clone.readByteArray());//解压
return ZipHelper.decompressForGzip(clone.readByteArray());//解压
} else if (encoding != null && encoding.equalsIgnoreCase("zlib")) {//content使用zlib压缩
bodyString = ZipHelper.decompressToStringForZlib(clone.readByteArray());//解压
return ZipHelper.decompressToStringForZlib(clone.readByteArray());//解压
} else {//content没有被压缩
Charset charset = Charset.forName("UTF-8");
MediaType contentType = responseBody.contentType();
if (contentType != null) {
charset = contentType.charset(charset);
}
bodyString = clone.readString(charset);
return clone.readString(charset);
}
Timber.tag("Result").w(jsonFormat(bodyString));
if (mHandler != null)//这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
return mHandler.onHttpResultResponse(bodyString, chain, originalResponse);
return originalResponse;
}
@NonNull
......@@ -111,4 +126,7 @@ public class RequestIntercept implements Interceptor {
return "null";
}
public boolean isJson(ResponseBody responseBody) {
return responseBody.contentType().toString().contains("json");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册