public class OKHttpUtils {
private static volatile OKHttpUtils okHttpUtils;
private OkHttpClient okHttpClient;
private Handler handler = new Handler();
private OKHttpUtils(){
okHttpClient = new OkHttpClient();
//B.okhttp添加公共参数到拦截器中
Map<String, String> map = new HashMap<>();
map.put("source", "android");
PublicParamInterceptor publicParamInterceptor = new PublicParamInterceptor(map);
//创建一个主线程的handler
handler = new Handler(Looper.getMainLooper());
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(5000, TimeUnit.MILLISECONDS)
.readTimeout(5000, TimeUnit.MILLISECONDS)
.writeTimeout(5000, TimeUnit.MILLISECONDS)
//B.添加okhttp的拦截器
.addInterceptor(publicParamInterceptor)
.build();
}
public static OKHttpUtils getOkHttpUtils(){
if (okHttpUtils==null){
synchronized (OKHttpUtils.class){
if (okHttpUtils==null){
okHttpUtils=new OKHttpUtils();
}
}
}
return okHttpUtils;
}
public void doGet(String url, final MyCallBack myCallBack, final Type type){
Request request = new Request.Builder()
.get()
.url(url)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
myCallBack.OnFailure(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(string, type);
handler.post(new Runnable() {
@Override
public void run() {
myCallBack.OnSuccess(o);
}
});
}
});
}
public void doPost(String url, HashMap<String, String> map, final MyCallBack myCallBack, final Type type) {
//创建FormBody的对象,把表单添加到formBody中
FormBody.Builder builder = new FormBody.Builder();
if (map != null) {
for (String key : map.keySet()) {
builder.add(key, map.get(key));
}
}
FormBody formBody = builder.build();
//创建Request对象
Request request = new Request.Builder().post(formBody).url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
if (myCallBack != null) {
handler.post(new Runnable() {
@Override
public void run() {
myCallBack.OnFailure(e);
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
if (response != null && response.isSuccessful()) {
final String json = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(json, type);
handler.post(new Runnable() {
@Override
public void run() {
if (myCallBack != null) {
myCallBack.OnSuccess(o);
}
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
if (myCallBack != null) {
myCallBack.OnFailure(new Exception("网络异常"));
}
}
});
}
}
//自定义一个拦截器,封装公共请求参数
public class PublicParamInterceptor implements Interceptor {
//初始化Map对象
Map<String, String> paramMap;
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 urlBuilder = new StringBuilder(url);
//拼接公共请求参数
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
urlBuilder.append("&" + entry.getKey() + "=" + entry.getValue());
}
url = urlBuilder.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;
//1.把原来的的body里面的参数添加到新的body中
FormBody.Builder builder = new FormBody.Builder();
//为了防止重复添加相同的key和value
Map<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));
}
//2.把公共请求参数添加到新的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 newRequest = oldRequest.newBuilder()
.post(newFormBody)
.build();
return chain.proceed(newRequest);
}
}
}
return chain.proceed(oldRequest);
}
}