/* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package cn.wildfire.chat.kit.net; import android.content.Context; import android.content.SharedPreferences; import android.text.TextUtils; import cn.wildfire.chat.kit.net.base.*; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import okhttp3.*; import java.io.File; import java.io.IOException; import java.lang.ref.WeakReference; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.net.URLDecoder; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; /** * Created by imndx on 2017/12/15. */ public class OKHttpHelper { private static final String WFC_OKHTTP_COOKIE_CONFIG = "WFC_OK_HTTP_COOKIES"; private static final Map> cookieStore = new ConcurrentHashMap<>(); private static WeakReference AppContext; public static void init(Context context) { AppContext = new WeakReference<>(context); } private static OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .cookieJar(new CookieJar() { @Override public void saveFromResponse(HttpUrl url, List cookies) { if (cookies == null) { cookies = new ArrayList<>(); } cookieStore.put(url.host(), cookies); if (AppContext != null && AppContext.get() != null) { SharedPreferences sp = AppContext.get().getSharedPreferences(WFC_OKHTTP_COOKIE_CONFIG, 0); Set set = new HashSet<>(); for (Cookie k:cookies) { set.add(gson.toJson(k)); } sp.edit().putStringSet(url.host(), set).apply(); } } @Override public List loadForRequest(HttpUrl url) { List cookies = cookieStore.get(url.host()); if (cookies == null) { if (AppContext != null && AppContext.get() != null) { SharedPreferences sp = AppContext.get().getSharedPreferences(WFC_OKHTTP_COOKIE_CONFIG, 0); Set set = sp.getStringSet(url.host(), new HashSet<>()); cookies = new ArrayList<>(); for (String s:set) { Cookie cookie = gson.fromJson(s, Cookie.class); cookies.add(cookie); } cookieStore.put(url.host(), cookies); } } return cookies; } }) .build(); private static Gson gson = new Gson(); private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public static void get(final String url, Map params, final Callback callback) { HttpUrl httpUrl = HttpUrl.parse(url); if (params != null) { HttpUrl.Builder builder = httpUrl.newBuilder(); for (Map.Entry entry : params.entrySet()) { builder.addQueryParameter(entry.getKey(), entry.getValue()); } httpUrl = builder.build(); } final Request request = new Request.Builder() .url(httpUrl) .get() .build(); okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { callback.onFailure(-1, e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { handleResponse(url, call, response, callback); } }); } public static T syncGet(final String url, Map params, final Callback callback) { HttpUrl httpUrl = HttpUrl.parse(url); if (params != null) { HttpUrl.Builder builder = httpUrl.newBuilder(); for (Map.Entry entry : params.entrySet()) { builder.addQueryParameter(entry.getKey(), entry.getValue()); } httpUrl = builder.build(); } final Request request = new Request.Builder() .url(httpUrl) .get() .build(); try { Response response = okHttpClient.newCall(request).execute(); if (!response.isSuccessful()) { callback.onFailure(response.code(), response.message()); return null; } Type types = callback.getClass().getGenericSuperclass(); Type type = ((ParameterizedType) types).getActualTypeArguments()[0]; String bodyStr = response.body().string(); ResultInfos wrapper = gson.fromJson(bodyStr, ResultInfos.class); if (wrapper == null) { return null; } if (wrapper.isSuccess() && wrapper.data != null) { T t= gson.fromJson(gson.toJson(wrapper.data), type); return t; } else { return null; } } catch (IOException e) { e.printStackTrace(); return null; } } public static void post(final String url, Map param, Map header, final Callback callback) { RequestBody body = RequestBody.create(JSON, gson.toJson(param)); Request.Builder builder = new Request.Builder() .url(url) .post(body); Request request; if (header != null) { for (String key : header.keySet()) { String value = header.get(key); builder.addHeader(key,value); } } request = builder.build(); okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { callback.onFailure(-1, e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { handleResponse(url, call, response, callback); } }); } public static T syncPost(final String url, Map param, Map header, final Callback callback) { RequestBody body = RequestBody.create(JSON, gson.toJson(param)); Request.Builder builder = new Request.Builder() .url(url) .post(body); Request request; if (header != null) { for (String key : header.keySet()) { String value = header.get(key); builder.addHeader(key,value); } } request = builder.build(); try { Response response = okHttpClient.newCall(request).execute(); if (!response.isSuccessful()) { callback.onFailure(response.code(), response.message()); return null; } Type types = callback.getClass().getGenericSuperclass(); Type type = ((ParameterizedType) types).getActualTypeArguments()[0]; String bodyStr = response.body().string(); ResultInfos wrapper = gson.fromJson(bodyStr, ResultInfos.class); if (wrapper == null) { return null; } if (wrapper.isSuccess() && wrapper.data != null) { T t= gson.fromJson(gson.toJson(wrapper.data), type); return t; } else { return null; } } catch (IOException e) { e.printStackTrace(); return null; } } public static T syncPost(final String url, Object param, Map header, final Callback callback) { RequestBody body = RequestBody.create(JSON, gson.toJson(param)); Request.Builder builder = new Request.Builder() .url(url) .post(body); Request request; if (header != null) { for (String key : header.keySet()) { String value = header.get(key); builder.addHeader(key,value); } } request = builder.build(); try { Response response = okHttpClient.newCall(request).execute(); if (!response.isSuccessful()) { callback.onFailure(response.code(), response.message()); return null; } Type types = callback.getClass().getGenericSuperclass(); Type type = ((ParameterizedType) types).getActualTypeArguments()[0]; String bodyStr = response.body().string(); ResultInfos wrapper = gson.fromJson(bodyStr, ResultInfos.class); if (wrapper == null) { return null; } if (wrapper.isSuccess() && wrapper.data != null) { T t= gson.fromJson(gson.toJson(wrapper.data), type); return t; } else { return null; } } catch (IOException e) { e.printStackTrace(); return null; } } public static void post(final String url, Map param, final Callback callback) { RequestBody body = RequestBody.create(JSON, gson.toJson(param)); final Request request = new Request.Builder() .url(url) .post(body) .build(); okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { callback.onFailure(-1, e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { handleResponse(url, call, response, callback); } }); } public static void post(final String url, Object param, final Callback callback) { RequestBody body = RequestBody.create(JSON, gson.toJson(param)); final Request request = new Request.Builder() .url(url) .post(body) .build(); okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { callback.onFailure(-1, e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { handleResponse(url, call, response, callback); } }); } public static void put(final String url, Map param, final Callback callback) { RequestBody body = RequestBody.create(JSON, gson.toJson(param)); final Request request = new Request.Builder() .url(url) .put(body) .build(); okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { callback.onFailure(-1, e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { handleResponse(url, call, response, callback); } }); } public static void upload(String url, Map params, File file, MediaType mediaType, final Callback callback) { MultipartBody.Builder builder = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file)); if (params != null) { for (Map.Entry entry : params.entrySet()) { builder.addFormDataPart(entry.getKey(), entry.getValue()); } } RequestBody requestBody = builder.build(); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); okHttpClient.newCall(request).enqueue(new okhttp3.Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { callback.onFailure(-1, e.getMessage()); } } @Override public void onResponse(Call call, Response response) throws IOException { handleResponse(url, call, response, callback); } }); } public static void clearCookies(){ SharedPreferences sp = AppContext.get().getSharedPreferences(WFC_OKHTTP_COOKIE_CONFIG, 0); sp.edit().clear().apply(); cookieStore.clear(); } private static void handleResponse(String url, Call call, okhttp3.Response response, Callback callback) { if (callback != null) { if (!response.isSuccessful()) { callback.onFailure(response.code(), response.message()); return; } Type type; if (callback instanceof SimpleCallback) { Type types = callback.getClass().getGenericSuperclass(); type = ((ParameterizedType) types).getActualTypeArguments()[0]; } else if (callback instanceof BaseIMResultCallBack) { Type types = callback.getClass().getGenericSuperclass(); type = ((ParameterizedType) types).getActualTypeArguments()[0]; }else if (callback instanceof BaseResultCallBack) { Type types = callback.getClass().getGenericSuperclass(); type = ((ParameterizedType) types).getActualTypeArguments()[0]; }else if (callback instanceof RawResultCallBack) { type = JSONObject.class; } else { Type[] types = callback.getClass().getGenericInterfaces(); type = ((ParameterizedType) types[0]).getActualTypeArguments()[0]; } if (type.equals(Void.class)) { callback.onSuccess((T) null); return; } if (type.equals(String.class)) { try { callback.onSuccess((T) response.body().string()); } catch (IOException e) { e.printStackTrace(); } return; } try { StatusResult statusResult; if (type instanceof Class && type.equals(StatusResult.class)) { statusResult = gson.fromJson(response.body().string(), StatusResult.class); if (statusResult.isSuccess()) { callback.onSuccess((T) statusResult); } else { callback.onFailure(statusResult.getCode(), statusResult.getMessage()); } } else if(callback instanceof BaseResultCallBack) { String bodyStr = response.body().string(); ResultInfos wrapper = gson.fromJson(bodyStr, ResultInfos.class); if (wrapper == null) { callback.onFailure(-1, "response is null"); return; } if (wrapper.isSuccess() && wrapper.code == 0) { if (wrapper.data != null && wrapper.data.toString().equalsIgnoreCase("false")) { //添加特殊返回类型false wrapper.data = null; } T t= gson.fromJson(gson.toJson(wrapper.data), type); callback.onSuccess(t); } else { callback.onFailure(wrapper.code, wrapper.msg); } // if (wrapper.code != 0) { // callback.onFailure(wrapper.code, wrapper.msg); // return; // } // if (wrapper.isSuccess() && wrapper.data != null) { // // T t= gson.fromJson(gson.toJson(wrapper.data), type); // callback.onSuccess(t); // } else { // callback.onFailure(wrapper.code, wrapper.msg); // } } else if(callback instanceof BaseIMResultCallBack) { String bodyStr = response.body().string(); if (TextUtils.isEmpty(bodyStr)) { callback.onFailure(-1, "response is null"); return; } bodyStr = URLDecoder.decode(bodyStr, "UTF-8"); ResultIMInfos wrapper = gson.fromJson(bodyStr, ResultIMInfos.class); if (wrapper == null) { callback.onFailure(-1, "response is null"); return; } if (wrapper.isSuccess() && wrapper.code == 0) { if (wrapper.result != null && wrapper.result.toString().equalsIgnoreCase("false")) { //添加特殊返回类型false wrapper.result = null; } T t= gson.fromJson(gson.toJson(wrapper.result), type); callback.onSuccess(t); } else { callback.onFailure(wrapper.code, wrapper.message); } } else if (callback instanceof RawResultCallBack) { String bodyStr = response.body().string(); com.alibaba.fastjson.JSONObject wrapper = com.alibaba.fastjson.JSONObject.parseObject(bodyStr); if (wrapper == null) { callback.onFailure(-1, "response is null"); return; } callback.onSuccess((T) wrapper); } else { String bodyStr = response.body().string(); ResultWrapper wrapper = gson.fromJson(bodyStr, new ResultType(type)); if (wrapper == null) { callback.onFailure(-1, "response is null"); return; } if (wrapper.isSuccess() && wrapper.getResult() != null) { callback.onSuccess(wrapper.getResult()); } else { callback.onFailure(wrapper.getCode(), wrapper.getMessage()); } } } catch (JsonSyntaxException e) { e.printStackTrace(); callback.onFailure(-1, e.getMessage()); } catch (IOException e) { e.printStackTrace(); callback.onFailure(-1, e.getMessage()); } } } private static class ResultType implements ParameterizedType { private final Type type; public ResultType(Type type) { this.type = type; } @Override public Type[] getActualTypeArguments() { return new Type[]{type}; } @Override public Type getOwnerType() { return null; } @Override public Type getRawType() { return ResultWrapper.class; } } }