当前位置: 首页 > news >正文

okhttp3网络请求

一、使用okhttp3和gson

build.gradle

...
dependencied {
	...
	implementation 'com.squareup.okhttp3:okhttp:3.9.0'
	implementation 'com.google.code.gson:gson:2.10.1'
}

二、响应模型

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

HttpResponseData.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

// 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层,所以需要转为基本类型
// 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单例方法

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:处理响应体
            }
        });
    }
}

相关文章:

  • 【Apache Hive】
  • springboot3 整合 Log4j2
  • python3面试题(元类、内存管理、函数)
  • Maven工具学习使用(六)——聚合与继承
  • 24、web前端开发之CSS3(一)
  • java对pdf文件分页拆分
  • 第十四届MathorCup高校数学建模挑战赛-C题:基于 LSTM-ARIMA 和整数规划的货量预测与人员排班模型
  • 股指期货的连续主力合约能不能代表这个股指期货?
  • 人体细粒度分割sapiens 实战笔记
  • 数据设计(范式、步骤)
  • kubernetes》》k8s》》 kubeadm、kubectl、kubelet
  • Spring 约定编程案例与示例
  • uv 命令用conda命令解释
  • iOS抓包-charles和Stream
  • SAP:越来越多组织通过AI解决数据问题,迈向大规模应用
  • leetcode33.搜索旋转排序数组
  • 云原生四重涅槃·破镜篇:混沌工程证道心,九阳真火锻金身
  • 【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析
  • Linux驱动编程 - UVC驱动分析
  • Java Optional:优雅处理空值的艺术,告别NullPointerException
  • 建设一个企业网站多少钱/企业培训课程视频
  • 撰写网站栏目规划/杭州seo博客
  • 网新科技做网站怎么样/培训计划模板
  • 做网站公司-汉狮网络/长春seo主管
  • 网站答辩ppt怎么做/流量精灵
  • 保定企业网站建设/黑帽seo培训