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:处理响应体
            }
        });
    }
}
相关推荐
Zonda要好好学习19 分钟前
Python入门Day4
java·网络·python
riverz122743 分钟前
TCP backlog工作机制
服务器·网络·tcp/ip
yqcoder1 小时前
1. http 有哪些版本,你是用的哪个版本,怎么查看
网络·网络协议·http
xiangzhihong82 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios
车载应用猿2 小时前
基于Android14的CarService 启动流程分析
android
没有了遇见3 小时前
Android 渐变色实现总结
android
Fanmeang4 小时前
OSPF路由过滤
运维·网络·华为·ip·路由·ospf·路由过滤
我是阿呆同学5 小时前
仿mudou库one thread oneloop式并发服务器
网络
雨白5 小时前
Jetpack系列(四):精通WorkManager,让后台任务不再失控
android·android jetpack
是阿建吖!6 小时前
【Linux | 网络】网络编程套接字
linux·网络