package com.community.pocket.util; import android.content.Context; import android.os.Looper; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import com.community.pocket.BuildConfig; import com.community.pocket.R; import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class HttpUtil { private static final Map map = new HashMap<>(); public static void getRequest(Method method, Callback callback) { getRequest(method, callback, null); } public static void getRequest(Method method, Callback callback, FormBody formBody) { //1.创建OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.创建Request对象,设置一个url地址(百度地址),设置请求方式。 Request.Builder builder = new Request.Builder(); if (method == Method.GET && formBody != null) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < formBody.size(); i++) { sb.append("&").append(formBody.name(i)).append("=").append(formBody.value(i)); } builder = builder.url(BuildConfig.API_HOST + getUrl() + "?" + sb.substring(1)).method(method.name(), null); } else { builder = builder.url(BuildConfig.API_HOST + getUrl()).method(method.name(), formBody); } //3.创建一个call对象,参数就是Request请求对象 Call call = okHttpClient.newCall(builder.build()); //4.请求加入调度,重写回调方法 call.enqueue(callback); } //检查服务端连接 public static void checkServer(final Context context) { //1.创建OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.创建Request对象,设置一个url地址(百度地址),设置请求方式。 Request.Builder builder = new Request.Builder().url(BuildConfig.API_HOST); //3.创建一个call对象,参数就是Request请求对象 Call call = okHttpClient.newCall(builder.build()); //4.请求加入调度,重写回调方法 call.enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { if (BuildConfig.DEBUG) { Looper.prepare(); if (BuildConfig.API_HOST.contains("http")) { new AlertDialog.Builder(context) .setMessage(context.getString(R.string.check_server_fail, BuildConfig.API_HOST)).show(); } else { new AlertDialog.Builder(context) .setMessage(context.getString(R.string.error_api_host, BuildConfig.API_HOST)).show(); } Looper.loop(); } } @Override public void onResponse(@NotNull Call call, @NotNull Response response) { } }); } public enum Method { GET, POST } /** * 获取调用 */ @NonNull private static String getUrl() { HttpRequest httpRequest = null; StackTraceElement[] stack = Thread.currentThread().getStackTrace(); String className = null; String methodName = null; for (int index = 1; index < stack.length; index++) { if (HttpUtil.class.getName().equals(stack[index - 1].getClassName()) && !HttpUtil.class.getName().equals(stack[index].getClassName())) { className = stack[index].getClassName(); methodName = stack[index].getMethodName(); break; } } RuntimeException runtimeException = new RuntimeException("未知异常!!!"); if (className != null) { try { if (!map.containsKey(className + methodName)) { Class c = Class.forName(className); java.lang.reflect.Method[] methods = c.getMethods(); List matchMethod = new ArrayList<>(); for (java.lang.reflect.Method m : methods) { if (methodName.equals(m.getName()) && m.getAnnotation(HttpRequest.class) != null) { matchMethod.add(m); } } if (matchMethod.size() == 1) { httpRequest = matchMethod.get(0).getAnnotation(HttpRequest.class); map.put(matchMethod.get(0).getName(), httpRequest); } else if (matchMethod.size() > 1) { runtimeException = new RuntimeException(c.getName() + "包含多个方法名为:" + methodName + "的方法!!!"); } else { runtimeException = new RuntimeException("类:" + c.getName() + "方法:" + methodName + "缺少注解" + HttpRequest.class + ",无法调用" + HttpUtil.class); } } else { httpRequest = map.get(className + methodName); } if (httpRequest != null) { return httpRequest.value(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); } } throw runtimeException; } }