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:处理响应体
            }
        });
    }
}
相关推荐
二J1 小时前
管理100个小程序-很难吗
android·小程序
s11show_1631 小时前
hz修改后台新增keyword功能
android·java·前端
christine-rr1 小时前
【25软考网工】第三章(3)虚拟局域网VLAN
网络·笔记·软考
落笔画忧愁e1 小时前
数据通信学习笔记之OSPF的基础术语-距离矢量路由协议
网络·智能路由器
jingshaoyou1 小时前
【防火墙 pfsense】1简介
网络·智能路由器·防火墙
Jackilina_Stone1 小时前
【网工第6版】第5章 网络互联⑦
网络·软考·网络互联·网工·第5章 网络互联
福大大架构师每日一题1 小时前
docker v28.1.1 正式发布!修复关键Bug,网络与安全性再升级
网络·docker·bug
kaixin_learn_qt_ing2 小时前
了解通信链路
网络
彭友圈1012 小时前
CE第二次作业
linux·服务器·网络
IT技术图谱2 小时前
【绝非标题党】网络监听新姿势:APT编译时注解实现高扩展框架
android·面试·架构