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.pswp.cn/diannao/75895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75895.shtml
英文地址,請注明出處:http://en.pswp.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; 二.安…