public class OkHttpUtils {
private static final String TAG = "OkHttpUtils----";
private static OkHttpUtils okHttpUtils;
private final OkHttpClient okHttpClient;
private final Handler handler;
private OkHttpUtils() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
HashMap<String, String> map = new HashMap<>();
PublicParamInterceptor paramInterceptor = new PublicParamInterceptor(map);
handler = new Handler(Looper.getMainLooper());
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(3000, TimeUnit.MILLISECONDS)
.readTimeout(3000, TimeUnit.MILLISECONDS)
.writeTimeout(3000, TimeUnit.MILLISECONDS)
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(paramInterceptor)
.build();
}
public static OkHttpUtils getInstance() {
if (okHttpUtils == null) {
synchronized (OkHttpUtils.class) {
if (okHttpUtils == null) {
return okHttpUtils = new OkHttpUtils();
}
}
}
return okHttpUtils;
}
public void doGet(String url, final OkHttpCallBack okCallBack) {
final Request request = new Request.Builder()
.get()
.url(url)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
if (okCallBack != null) {
Log.d(TAG, "失败----- ");
okCallBack.Error(new Exception("网络异常"));
}
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
handler.post(new Runnable() {
@Override
public void run() {
try {
if (response != null && response.isSuccessful()) {
String json = response.body().string();
if (okCallBack != null) {
Log.d(TAG, "成功----- ");
okCallBack.Success(json);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
}
public void doPost(String url, Map<String, String> map, final OkHttpCallBack callBack) {
FormBody.Builder builder = new FormBody.Builder();
for (String key : map.keySet()) {
builder.add(key, map.get(key));
}
FormBody formBody = builder.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
Log.d(TAG, "失败----- ");
callBack.Error(new Exception("网络异常"));
}
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
handler.post(new Runnable() {
@Override
public void run() {
try {
if (response != null && response.isSuccessful()) {
String json = response.body().string();
if (callBack != null) {
Log.d(TAG, "成功----- ");
callBack.Success(json);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
}
public class PublicParamInterceptor implements Interceptor {
Map<String, String> paramMap = new HashMap<>();
public PublicParamInterceptor(Map<String, String> paramMap) {
this.paramMap = paramMap;
}
@Override
public Response intercept(Chain chain) throws IOException {
//拿到原来的request
Request oldRequest = chain.request();
//拿到请求的url地址
String url = oldRequest.url().toString();
//判断是get还是post请求
if (oldRequest.method().equalsIgnoreCase("GET")) {
if (paramMap != null && paramMap.size() > 0) {
StringBuilder builder = new StringBuilder(url);
//接收公共的请求参数
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
builder.append("&" + entry.getKey() + "="+entry.getValue());
}
url = builder.toString();
//如果之前的url没有?,我们需要手动给添加一个?
if (!url.contains("?")) {
url = url.replaceFirst("&", "?");
}
//根据原来的request构造一个新的request
Request request = oldRequest.newBuilder()
.url(url)
.build();
return chain.proceed(request);
}
} else {
if (paramMap != null && paramMap.size() > 0) {
RequestBody body = oldRequest.body();
if (body != null && body instanceof FormBody) {
FormBody formBody = (FormBody) body;
//把原来body里面的参数添加到新的body中
FormBody.Builder builder = new FormBody.Builder();
//为了防止添加相同的key和value
HashMap<String, String> temMap = new HashMap<>();
for (int i = 0; i < formBody.size(); i++) {
builder.add(formBody.encodedName(i), formBody.encodedValue(i));
temMap.put(formBody.encodedName(i), formBody.encodedValue(i));
}
//把公共请求的参数添加到新的body中
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
if (!temMap.containsKey(entry.getKey())) {
builder.add(entry.getKey(), entry.getValue());
}
}
FormBody newformBody = builder.build();
//依据原来的request构造一个新的request
Request request = oldRequest.newBuilder()
.post(newformBody)
.build();
return chain.proceed(request);
}
}
}
return chain.proceed(oldRequest);
}
}
public interface OkHttpCallBack {
void Success(String json);
void Error(Exception e);
}
}