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:处理响应体
            }
        });
    }
}
相关推荐
中议视控3 小时前
展厅可视化网络中央控制系统:支持双向反馈,可视化播控,回显,状态显示,反向控制电脑,声光电网络视讯设备统一管理
网络·分布式·信息可视化
做萤石二次开发的哈哈3 小时前
萤石蓝海AIoT一站式工作台计费说明
网络·数据库·萤石开放平台·蓝海aiot一站式工作台
wsad05324 小时前
CentOS Stream 10 Docker 容器无法访问外网:xt_addrtype 内核模块缺失解决方法
linux·网络·docker·云原生·eureka·centos
XiaoLeisj4 小时前
Kotlin Flow:冷流收集、并行订阅、emit 推送、delay 延迟、collect 全量收集与 collectLatest 的实时数据处理
android·kotlin·android jetpack·协程·flow
Delite8025 小时前
磷酸酯抗燃油矿物油检测技术及多行业应用场景解析
网络·安全
Android-Flutter5 小时前
android jetpack 详解
android·kotlin
聚美智数5 小时前
SSL证书信息查询-SSL域名解析-SSL证书查询服务-SSL证书解析服务API接口介绍
网络·网络协议·ssl
瓦学妹5 小时前
美国住宅IP如何选?不同平台配置选择标准与教程指南
网络·网络协议·tcp/ip
SLD_Allen5 小时前
基于 eBPF + Cilium 的 Kubernetes 网络可观测与安全治理实践
网络·安全·kubernetes