1、添加Header
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
//添加Log
httpClient.addNetworkInterceptor(getInterceptor(true));
//添加固定的header參數
httpClient.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
httpClient.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
httpClient.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
//針對不同的情況寫 Log
private HttpLoggingInterceptor getInterceptor(boolean debug) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); if (debug) { interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // 測試 } else { interceptor.setLevel(HttpLoggingInterceptor.Level.NONE); // 打包 } return interceptor; }
//添加動態的Header
httpClient.addInterceptor(new HttpHeadInterceptor());
private class HttpHeadInterceptor implements Interceptor { public HttpHeadInterceptor() { } @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request.Builder requestBuilder = originalRequest.newBuilder(); requestBuilder.addHeader("time", "時間");
//添加User-Agent String user = HttpHead.getUserAgent(); requestBuilder.addHeader("User-Agent", user); Request request = requestBuilder.build(); okhttp3.Response response = chain.proceed(request);
//獲取response的header String responseHeadTime = response.header("time").toString();return response; } }
2、生成Retrofit對象
Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://xxxxxxxxxxxxxxxxxxxx") .client(httpClient.build()) .addConverterFactory(GsonConverterFactory.create(date, httpHeadInfo)) .build();
GsonConverterFactory是附加器(按照設計模式,好像是AOP,面向切面編程)
3、body加密的時候,寫在GsonConverterFactory的 requestBodyConverter 裏
注意,相對於ASP.Net mvc來說,接口裏邊傳入@Body的話呢,在服務器端是接收不到的。你需要把這些東西通過 FormBody重新賦值一下
@Override public RequestBody convert(T value) throws IOException { if (value instanceof BaseSign) { String jsonstr = gson.toJson(value); String key = "android"; Logger.debug("xxx", "AES加密前:" + jsonstr + " key=" + key); key = Md5Util.parseStrToMd5L32(key); String newRequest = AESUtils.initEncode(jsonstr, key); return new FormBody.Builder().add("data", newRequest).build(); } else { //這裏是不加密的 return RequestBody.create(MEDIA_TYPE, ""); }