一、使用okhttp3和gson
build.gradle
ruby
...
dependencied {
...
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.google.code.gson:gson:2.10.1'
}
二、响应模型
可根据实际情况进行调整,目前我所需的就是这三个变量
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
java
// 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层,所以需要转为基本类型
java
// 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单例方法
java
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:处理响应体
}
});
}
}