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