1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| public class OkHttpEngine implements IHttpEngine { private static final OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient(); private final Handler mHandler = new Handler(); @Override public void get(boolean cache, Context context, String url, Map<String, Object> params, EngineCallback callback) { final String jointUrl = HttpUtils.joinParams(url, params); Log.e("Get请求路径: ", jointUrl); //判断缓存有没有 if (cache) { //需要缓存,拿缓存 String resultJson = CacheDataUtil.getCacheResultJson(jointUrl); if (!TextUtils.isEmpty(resultJson)) { //需要缓存,而且数据库有缓存,直接返回数据 Log.e("Get数据和缓存一致直接返回: ", resultJson); callback.onSuccess(resultJson); } } Request request = new Request.Builder() .url(url) .get() .tag(context) .build(); M_OK_HTTP_CLIENT.newCall(request).enqueue( new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { mHandler.post(() -> callback.onError(e)); }
@Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { String result = Objects.requireNonNull(response.body()).string(); //每次拿到数据之后比对上一次的内容 if (cache) { String resultJson = CacheDataUtil.getCacheResultJson(jointUrl); if (resultJson != null && !TextUtils.isEmpty(resultJson) && resultJson.equals(result)) { //比对内容 //内容相同,不需要执行success方法 Log.e("Get数据和缓存一致: ", result); return; } } //执行success方法,缓存数据 Log.e("Get返回结果: ", result); mHandler.post(() -> callback.onSuccess(result)); if (cache) { //缓存数据 CacheDataUtil.cacheData(jointUrl, result); } } } ); }
@Override public void post(boolean cache, Context context, String url, Map<String, Object> params, EngineCallback callback) { final String jointUrl = HttpUtils.joinParams(url, params); Log.e("Post请求路径: ", jointUrl); RequestBody requestBody = appendBody(params); Request request = new Request.Builder() .url(url) .tag(context) .post(requestBody) .build(); M_OK_HTTP_CLIENT.newCall(request).enqueue( new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { mHandler.post(() -> callback.onError(e)); }
@Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { String result = Objects.requireNonNull(response.body()).string(); Log.e("Post返回结果: ", result); mHandler.post(() -> callback.onSuccess(result)); } } ); }
/** * 组装post请求参数body */ protected RequestBody appendBody(Map<String, Object> params) { MultipartBody.Builder builder = new MultipartBody.Builder() .setType(MultipartBody.FORM); addParams(builder, params); return builder.build(); }
/** * 添加参数 */ private void addParams(MultipartBody.Builder builder, Map<String, Object> params) { if (params != null && !params.isEmpty()) { for (String key : params.keySet()) { builder.addFormDataPart(key, params.get(key) + ""); Object value = params.get(key); if (value instanceof File) { //处理文件 -->Object -->file File file = (File) value; builder.addFormDataPart(key, file.getName(), RequestBody .create(file, MediaType.parse(guessMimeType(file.getAbsolutePath())))); } else if (value instanceof List) { try { List<File> fileList = (List<File>) value; for (int i = 0; i < fileList.size(); i++) { //获取文件 File file = fileList.get(i); builder.addFormDataPart(key + i, file.getName(), RequestBody .create(file, MediaType.parse(guessMimeType(file.getAbsolutePath())))); } } catch (Exception e) { e.printStackTrace(); } } else { builder.addFormDataPart(key, value + ""); } } } }
/** * 猜测文件的类型 */ private String guessMimeType(String path) { FileNameMap fileNameMap = URLConnection.getFileNameMap(); String contentTypeFor = fileNameMap.getContentTypeFor(path); if (contentTypeFor == null) { contentTypeFor = "application/octet-stream"; } return contentTypeFor; } }
|