欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > okhttp3网络请求

okhttp3网络请求

2025/4/1 3:12:07 来源:https://blog.csdn.net/qq_38779672/article/details/146606452  浏览:    关键词: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:处理响应体}});}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词