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;@Overridepublic 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> {@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) {callback.onFailure(e);}@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) {callback.onFailure(e);}@Overridepublic 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:需要按照实际格式调整参数keyprivate 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() {@Overridepublic void onFailure(Call call, IOException e) {callback.onFailure(e);}@Overridepublic 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() {@Overridepublic void onFailure(IOException e) {// todo:处理错误}@Overridepublic 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() {@Overridepublic void onFailure(IOException e) {// todo:处理错误}@Overridepublic void onSuccess(int code, HttpResponseData response) {// todo:处理响应体}});}public void handleHttpUploadRequest(MethodChannel.Result result, String url, String path) {executeUploadRequest(url, path, new OkHttpCallback() {@Overridepublic void onFailure(IOException e) {// todo:处理错误}@Overridepublic void onSuccess(int code, HttpResponseData response) {// todo:处理响应体}});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯每日一题】3.28

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x "今天熬的夜&#xff0c;会变成明天奖状的闪光点&#xff01;" 目录 一、唯一的雪花 题目链接 题目描述 解题思路 解题代码 二、逛画展 题目链接 题目描述 解题思路 解题代…

【MinIO】Bucket的生命周期管理

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.ILM使用介绍2.生命周期配置实例 1.ILM使用介绍 对象生命周期管理&#xff08;ILM&#xff09;是现代对象存储系统的核心功能之一&#x…

Android 中隐藏标题栏和状态栏的方法

在Android开发中&#xff0c;隐藏标题栏和状态栏是实现全屏显示的常见需求。 一、隐藏标题栏 1、通过代码隐藏 对于继承自 AppCompatActivity 的 Activty&#xff0c;可在 onCreate() 方法中调用supportRequestWindowFeature 或 getSupportActionBar 方法来隐藏标题栏。 ove…

进程间通信——信号量

进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…

Linux内核2-TFTP与NFS环境搭建

Uboot&#xff1a;引导程序 初始化硬件设备&#xff0c;初始化c语言环境&#xff0c;为内核加载做准备 zImage:内核文件 rootfs:文件系统&#xff0c;为用户提供一个与硬件设备数据交互的系统 1.TFTP和NFS功能 TFTP:简单文件传输协议网络配置 pc可以下载 2.minicom bootargs…

TDengine 中的命名与边界

简介 本章主要介绍命名的合法字符集和限制规则&#xff0c;这对于正确使用 TDengine&#xff0c;减小报错很重要&#xff0c;这些规则在 SQL 语句中都生效&#xff0c;在使用过程中要注意&#xff0c;避免不必要的错误。 名称命名规则 合法字符&#xff1a;英文字符、数字和…

C++ 中将函数作为参数传递

C 中将函数作为参数传递 1. 通过指针传递函数 函数可以通过传递函数的地址来作为参数传递&#xff1b;简而言之&#xff0c;就是通过指针实现这一点。 示例代码 #include <iostream> using namespace std;// 定义加法和减法函数 #include <iostream> #include …

Vala 编程语言教程-继承

继承‌ 在 Vala 中&#xff0c;一个类可以继承自 ‌一个或零个‌ 其他类。尽管实际开发中通常继承一个类&#xff08;不同于 Java 等语言的隐式继承机制&#xff09;&#xff0c;但 Vala 并不强制要求必须继承。 当定义继承自其他类的子类时&#xff0c;子类的实例与父…

Crypto Architecture Kit简介

HarmonyOS 5.0.3(15) 版本的配套文档&#xff0c;该版本API能力级别为API 15 Release 文章目录 约束与限制能力范围基本概念与相关Kit的关系 Crypto Architecture Kit屏蔽了第三方密码学算法库实现差异的算法框架&#xff0c;提供加解密、签名验签、消息验证码、哈希、安全随机…

交流电机类型及其控制技术

交流电机可分为同步电机和异步电机两大种类&#xff0c;如果电机转子的转速与定子旋转磁场的转速相等&#xff0c;转子与定子旋转磁场在空间同步地旋转&#xff0c;这种电机就称为同步电机。如果电机转子的转速不等于定子旋转磁场的转速&#xff0c;转子与定子旋转磁场在空间旋…

SQL语言分类及命令详解(一)

目录 1. DQL&#xff08;Data Query Language&#xff09;数据查询语言 主要命令&#xff1a; SELECT 2. DDL&#xff08;Data Definition Language&#xff09;数据定义语言 主要命令&#xff1a; CREATE ALTER DROP TRUNCATE&#xff08;清空表数据&#xff0c;保留…

fluent_UDF学习笔记

UDF源代码路径 D:\Program Files\ANSYS Inc\v231\fluent\fluent23.1.0\src关于颗粒反弹速度的计算 /* 通过面法向单位向量计算速度的法向向量、切向向量&#xff0c;再通过法向、切向恢复系数重新计算反弹速度*//* Compute normal velocity.将颗粒速度向面法线方向投影&#x…

Go 语言标准库中sort模块详细功能介绍与示例

Go语言的 sort 模块提供了对切片和自定义数据结构的排序功能&#xff0c;支持基本类型排序、自定义排序规则、稳定排序和二分查找。以下是 sort 模块的核心方法及示例说明&#xff1a; 1. 基本类型排序 sort.Ints、sort.Float64s、sort.Strings 直接对基本类型的切片进行排序…

第十六届蓝桥杯模拟二(串口通信)

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

06-ADC

ADC简介 Analog-Digital Converter 模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC&#xff0c;1us转换时间&#xff1b;输入电压范围&#xff1a;0-3.3V&#xff0c;转换结果…

二层综合实验

拓扑图 实验要求 1.内网IP地址使用172.16.6.0/16分配 2.sw1和sW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有电脑可以正常访问IsP路由器环回 实验思路 这是一个二层综合实验每当拿到一个实验看清楚要求之后都有…

Java实现pdf中动态插入图片

今天接到一个需求&#xff0c;需要在pdf中的签名处&#xff0c;插入签名照片&#xff0c;但签名位置不固定&#xff0c;话不多说上代码&#xff1a; 1、首先引入itextpdf依赖包&#xff1a; <dependency><groupId>com.itextpdf</groupId><artifactId>…

OpenCV 图形API(2)为什么需要图形API?

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 G-API背后的动机 G-API模块为OpenCV带来了基于图的执行模型。本章简要描述了这种新模型如何在两个方面帮助软件开发者&#xff1a;优化和移植图像处理算法…

基于Spring AI开发本地Jenkins MCP Server服务

前言 首先介绍下MCP是什么&#xff1f; MCP是由开发了 Claude 模型的 Anthropic 公司2024年12月提出并开源的一项开放标准&#xff0c;全称&#xff1a;Model Context Protocol&#xff0c;它是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…

vcpkg安装指定版本的库

一.vcpkg安装 使用git将vcpkg源码克隆到本地制定目录&#xff08;D:\vcpkg&#xff09;&#xff0c;并初始化 git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh # Linux/macOS .\bootstrap-vcpkg.bat # Windows 如下图&#xff1a; 二.安…