package com.demo.app.utils.api; import android.content.Context; import android.content.SharedPreferences; import android.widget.Toast; import com.demo.app.utils.Constant; import com.demo.lib.common.util.ManifestDataUtil; import com.demo.lib.common.util.common.PackageUtils2; import com.demo.lib.common.util.common.StringUtils; import com.demo.lib.common.util.device.DeviceInfoUtil; import com.demo.lib.common.util.device.MobileUtil; import com.demo.lib.common.util.security.MD5Utils; import org.apache.http.Header; import org.json.JSONObject; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import static android.content.Context.MODE_PRIVATE; public class HttpApiUtil { public static final boolean isDebug = false; private static final String TAG = "HttpApiUtil"; public static String BASE_URL = Constant.HOST + "/fanli/api/v1/"; public static OkHttpClient mOkHttpClient;//okHttpClient 实例 public static OkHttpClient mOkHttpClientSoon;//okHttpClient 实例 static { mOkHttpClient = new OkHttpClient.Builder() .connectTimeout(10 * 1000, TimeUnit.MILLISECONDS) .readTimeout(5 * 60 * 1000, TimeUnit.MILLISECONDS) .writeTimeout(5 * 60 * 1000, TimeUnit.MILLISECONDS) .build(); //超时时间 mOkHttpClientSoon = new OkHttpClient.Builder() .connectTimeout(3 * 1000, TimeUnit.MILLISECONDS) .readTimeout(3 * 1000, TimeUnit.MILLISECONDS) .writeTimeout(3 * 1000, TimeUnit.MILLISECONDS) .build(); } /** * 请求demo * * @param context * @param handler */ public static void xxx(Context context, BasicTextHttpResponseHandler handler) { LinkedHashMap params = new LinkedHashMap(); commonPostWithFailture(context, BASE_URL + "xxx/xxx", params, handler); } public static void getConfig(Context context, BasicTextHttpResponseHandler handler) { LinkedHashMap params = new LinkedHashMap(); commonPostWithFailture(context, BASE_URL + "xxx/xxx", params, handler); } private static void commonPost(Context context, String url, LinkedHashMap params, BasicTextHttpResponseHandler handler) { if (Constant.isDisableProxy) { commonPost(context, url, params, null, handler); } else { Toast.makeText(context, "服务器拒绝访问,请查看是否禁用了代理服务器", Toast.LENGTH_SHORT).show(); return; } } private static void commonPost(Context context, String url, LinkedHashMap params, HashMap files, BasicTextHttpResponseHandler handler) { commonPost(context, url, params, files, handler, true); } private static void commonPostWithFailture(final Context context, String url, LinkedHashMap params, final BasicTextHttpResponseHandler handler) { commonPost(context, url, params, handler); } private static void commonPost(Context context, String url, LinkedHashMap params, HashMap files, BasicTextHttpResponseHandler handler, boolean asyn) { Request request = null; SharedPreferences sp = context.getSharedPreferences("Session", MODE_PRIVATE); String seseionId = sp.getString("sessionid", ""); String[] tags = url.split("/"); String tag = tags[tags.length - 2] + "/" + tags[tags.length - 1]; if (files == null || files.size() == 0) { request = new Request.Builder().url(url).post(validateParams(params, context, handler).build()).tag(tag).addHeader("cookie", seseionId).build(); } else if (files != null && files.size() > 0) { MultipartBody body = validateParams(params, files, context, handler); request = new Request.Builder() .url(url) .post(body) .tag(tag) .addHeader("cookie", seseionId) .build(); } if (handler == null) { mOkHttpClient.newCall(request).enqueue(new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { } }); } else { mOkHttpClient.newCall(request).enqueue(handler); } } private static void commonPostSoon(Context context, String url, LinkedHashMap params, HashMap files, BasicTextHttpResponseHandler handler) { Request request = null; SharedPreferences sp = context.getSharedPreferences("Session", MODE_PRIVATE); String seseionId = sp.getString("sessionid", ""); String[] tags = url.split("/"); String tag = tags[tags.length - 2] + "/" + tags[tags.length - 1]; if (files == null || files.size() == 0) { request = new Request.Builder().url(url).post(validateParams(params, context, handler).build()).tag(tag).addHeader("cookie", seseionId).build(); } else if (files != null && files.size() > 0) { MultipartBody body = validateParams(params, files, context, handler); request = new Request.Builder() .url(url) .post(body) .tag(tag) .addHeader("cookie", seseionId) .build(); } if (handler == null) { mOkHttpClientSoon.newCall(request).enqueue(new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { } }); } else { mOkHttpClientSoon.newCall(request).enqueue(handler); } } /** * 只传递表单数据 * * @param params * @param context * @param callback * @return */ public static FormBody.Builder validateParams( LinkedHashMap params, Context context, BasicTextHttpResponseHandler callback) { params = getRequestParams(context, params); FormBody.Builder builder = new FormBody.Builder(); for (LinkedHashMap.Entry entry : params.entrySet()) { if ((!StringUtils.isEmpty(entry.getKey()))) { builder.add(entry.getKey(), entry.getValue()); } } if (callback != null) callback.onStart(); return builder; } /** * 文件和表单数据 * * @param params * @param context * @param callback * @return */ public static MultipartBody validateParams( LinkedHashMap params, HashMap files, Context context, BasicTextHttpResponseHandler callback) { params = getRequestParams(context, params); MultipartBody.Builder builder = new MultipartBody.Builder(); builder.setType(MultipartBody.FORM); for (LinkedHashMap.Entry entry : params.entrySet()) { builder.addFormDataPart(entry.getKey(), entry.getValue()); } for (LinkedHashMap.Entry entry : files.entrySet()) { for (int i = 0; i < entry.getValue().length; i++) { builder.addFormDataPart(entry.getKey(), entry.getValue()[i].getName(), RequestBody.create(MediaType.parse("file/*"), entry.getValue()[i]));//添加文件 } } callback.onStart(); return builder.build(); } public static LinkedHashMap getRequestParams(Context context, LinkedHashMap params) { if (params == null) { params = new LinkedHashMap<>(); } //获取基础参数 params.putAll(getBaseParams(context)); //获取签名 params.put("sign", getSign(params)); return params; } /** * 获取签名信息 * * @param params * @return */ private static String getSign(Map params) { Iterator its = params.keySet().iterator(); List list = new ArrayList<>(); while (its.hasNext()) { String key = its.next(); Object value = params.get(key); list.add(key + "=" + value); } Collections.sort(list); String sign = ""; for (String str : list) { sign += str + "&"; } return MD5Utils.getMD532(sign + "buXiNjie2017!"); } /** * 获取基础参数 * * @param context * @return */ private static Map getBaseParams(Context context) { Map params = new HashMap<>(); int version = PackageUtils2.getVersionCode(context); long time = System.currentTimeMillis(); String deviceType = DeviceInfoUtil.getSystemModel(context); params.put("packages", context.getPackageName()); params.put("Version", version + ""); params.put("platform", "android"); params.put("channel", ManifestDataUtil.getAppMetaData(context, "UMENG_CHANNEL")); params.put("osVersion", MobileUtil.getSystemVersion()); params.put("deviceType", StringUtils.isEmpty(deviceType) ? "" : deviceType); params.put("time", time + ""); params.put("device", DeviceInfoUtil.getDeviceId(context)); params.put("utdid", DeviceInfoUtil.getUtdid(context)); return params; } }