okhttp3网络请求

一、使用okhttp3和gson

build.gradle

ruby 复制代码
...
dependencied {
	...
	implementation 'com.squareup.okhttp3:okhttp:3.9.0'
	implementation 'com.google.code.gson:gson:2.10.1'
}

二、响应模型

可根据实际情况进行调整,目前我所需的就是这三个变量

HttpResponseData.java

java 复制代码
import java.util.HashMap;

public class HttpResponseData extends MoBase {
   public String message;
   public int result;
   public HashMap<String, Object> data;

   @Override
   public HashMap<String, Object> toMap() {
      HashMap<String, Object> ret = new HashMap<>();
      ret.put("code", result);
      if (data != null) {
         ret.put("data", data);
      }
      return ret;
   }
}

三、定义网络请求的callback

java 复制代码
// todo:根据实际调整
import ....HttpResponseData;

import java.io.IOException;

import okhttp3.ResponseBody;

public interface OkHttpCallback {
    void onSuccess(int code, HttpResponseData response);
    void onFailure(IOException e);
}

四、自定义反序列化

因为我的请求接口,存在如下情况,所以需要自定义反序列化

  • data有时为data,有时为datas
  • 本身要将data传到flutter层,所以需要转为基本类型
java 复制代码
// todo:根据实际调整
import ....HttpResponseData;
import com.google.gson.*;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map;

class ResponseDataDeserializer implements JsonDeserializer<HttpResponseData> {
    @Override
    public HttpResponseData deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        HttpResponseData HttpResponse = new HttpResponseData();
        HttpResponse.message = jsonObject.get("message").getAsString();
        HttpResponse.result = jsonObject.get("result").getAsInt();

        JsonElement dataElement = jsonObject.get("datas");
        if (dataElement == null) {
            dataElement = jsonObject.get("data");
        }
        if (dataElement != null) {
            if (dataElement.isJsonObject()) {
                Set<String> keys = dataElement.getAsJsonObject().keySet();
                HashMap<String, Object> map = new HashMap<>();
                for (String key : keys) {
                    JsonElement value = dataElement.getAsJsonObject().get(key);
                    Object convertedValue = convertJsonElement(value);
                    map.put(key, convertedValue);
                }
                HttpResponse.data = map;
            } else if (dataElement.isJsonArray()) {
                JsonArray jsonArray = dataElement.getAsJsonArray();
                HashMap<String, Object> map = new HashMap<>();
                List<Object> array = new ArrayList<>();
                for (int i = 0; i < jsonArray.size(); i++) {
                    Object res = convertJsonElement(jsonArray.get(i));
                    array.add(res);
                }
                map.put("data", array);
                HttpResponse.data = map;
            }
        } else {
            if (HttpResponse.result == 0) {
                HashMap<String, Object> map = new HashMap<>();
                map.put("result", HttpResponse.result);
                HttpResponse.data = map;
            }
        }
        return HttpResponse;
    }

    private static Object convertJsonElement(JsonElement value) {
        if (value.isJsonPrimitive()) {
            JsonPrimitive primitive = value.getAsJsonPrimitive();
            if (primitive.isString()) {
                return primitive.getAsString();
            } else if (primitive.isNumber()) {
                if (primitive.getAsNumber() instanceof Double) {
                    return primitive.getAsNumber().doubleValue();
                }
                return primitive.getAsNumber().intValue();
            } else if (primitive.isBoolean()) {
                return primitive.getAsBoolean();
            }
        } else if (value.isJsonObject()) {
            JsonObject jsonObject = value.getAsJsonObject();
            HashMap<String, Object> nestedMap = new HashMap<>();
            for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
                nestedMap.put(entry.getKey(), convertJsonElement(entry.getValue()));
            }
            return nestedMap;
        } else if (value.isJsonArray()) {
            JsonArray jsonArray = value.getAsJsonArray();
            List<Object> array = new ArrayList<>();
            for (int i = 0; i < jsonArray.size(); i++) {
                Object res = convertJsonElement(jsonArray.get(i));
                array.add(res);
            }
            return array;
        } else if (value.isJsonNull()) {
            return null;
        }
        return null;
    }
}

五、okhttp3单例方法

java 复制代码
import okhttp3.*;

// todo:根据实际使用
import ...HttpResponseData;
import com.google.gson.*;

import java.io.File;
import java.io.IOException;

import java.util.HashMap;
import java.util.Map;

public class OkHttpSingleton {
    private static volatile OkHttpSingleton instance;
    private final OkHttpClient client;
    private final Gson gson;

    private OkHttpSingleton() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(HttpResponseData.class, new ResponseDataDeserializer());
        gson = gsonBuilder.create();
        client = new OkHttpClient();
    }

    public static OkHttpSingleton getInstance() {
        if (instance == null) {
            synchronized (OkHttpSingleton.class) {
                if (instance == null) {
                    instance = new OkHttpSingleton();
                }
            }
        }
        return instance;
    }

    public void executeGetRequest(String url, Map<String, String> headers, OkHttpCallback callback) {
        Request.Builder requestBuilder = new Request.Builder().url(url);
        if (headers != null) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                requestBuilder.addHeader(entry.getKey(), entry.getValue());
            }
        }
        Request request = requestBuilder.build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callback.onFailure(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful() && response.body() != null) {
                    callback.onSuccess(response.code(), gson.fromJson(response.body().string(), HttpResponseData.class));
                } else {
                    callback.onFailure(new IOException("Request failed with code: " + response.code()));
                }
            }
        });
    }

    private void executePostRequest(String url, Map<String, String> headers, Map<String, Object> params, OkHttpCallback callback) {
        if (params == null) {
            params = new HashMap<>();
        }
        String jsonBody = new Gson().toJson(params);
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(JSON, jsonBody);

        Request.Builder requestBuilder = new Request.Builder().url(url).post(body);
        if (headers != null) {
            for (Map.Entry<String, String> entry : headers.entrySet()) {
                requestBuilder.addHeader(entry.getKey(), entry.getValue());
            }
        }
        Request request = requestBuilder.build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callback.onFailure(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful() && response.body() != null) {
                    callback.onSuccess(response.code(), gson.fromJson(response.body().string(), HttpResponseData.class));
                } else {
                    callback.onFailure(new IOException("Request failed with code: " + response.code()));
                }
            }
        });
    }

		// todo:需要按照实际格式调整参数key
    private void executeUploadRequest(String url, String path, OkHttpCallback callback) {
        MediaType JSON = MediaType.parse("image/*; charset=utf-8");
        File file = new File(path);
        RequestBody body = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart(
                        "PhotoFile",
                        file.getName(),
                        RequestBody.create(JSON, file)
                ).build();

        Request.Builder requestBuilder = new Request.Builder().url(url).post(body);
        Request request = requestBuilder.build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callback.onFailure(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful() && response.body() != null) {
                    callback.onSuccess(response.code(), gson.fromJson(response.body().string(), HttpResponseData.class));
                } else {
                    callback.onFailure(new IOException("Request failed with code: " + response.code()));
                }
            }
        });
    }

    public void handleHttpGetRequest(MethodChannel.Result result, String url, Map<String, String> headers) {
        executeGetRequest(url, headers, new OkHttpCallback() {
            @Override
            public void onFailure(IOException e) {
	            // todo:处理错误
            }
            @Override
            public void onSuccess(int code, HttpResponseData response) {
	            // todo:处理响应体
            }
        });
    }

    public void handleHttpPostRequest(MethodChannel.Result result, String url, Map<String, String> headers, Map<String, Object> body) {
        executePostRequest(url, headers, body, new OkHttpCallback() {
            @Override
            public void onFailure(IOException e) {
                // todo:处理错误
            }
            @Override
            public void onSuccess(int code, HttpResponseData response) {
                // todo:处理响应体
            }
        });
    }

    public void handleHttpUploadRequest(MethodChannel.Result result, String url, String path) {
        executeUploadRequest(url, path, new OkHttpCallback() {
            @Override
            public void onFailure(IOException e) {
                // todo:处理错误
            }
            @Override
            public void onSuccess(int code, HttpResponseData response) {
                // todo:处理响应体
            }
        });
    }
}
相关推荐
石山岭18 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧21 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker1 天前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋1 天前
Android 现代架构不需要事件总线进阶篇
android
杉氧2 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏2 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧2 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄2 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭2 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景2 天前
Kotlin Flow操作符学习
android·kotlin