简单封装OkHttp框架,单例模式。一句话即可使用。
返回值已进行JSON转换,拿到响应数据后的回调运行在主线程,可以直接修改UI。
已写get请求、post方式提交字符串、post方式提交表单、post方式上传图片,后续再添加。
依赖:
//OkHttp
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
//Gson
implementation 'com.google.code.gson:gson:2.8.5'
返回结果通用类:
/**
* 服务端返回结果
* @param <T>
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonResult<T> {
//状态 0 成功 1失败
private int state;
//主要数据
private String data;
//附加数据
private String msg;
}
工具类:
import android.app.Activity;
import android.util.Log;
import com.google.gson.Gson;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* OkHttp工具类
*/
public class OkHttpRequestUtil {
private static OkHttpClient client;
private static final OkHttpRequestUtil okHttpRequestUtil = new OkHttpRequestUtil();
public static OkHttpRequestUtil getInstance() {
return okHttpRequestUtil;
}
private OkHttpRequestUtil() {
client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build();
}
public interface ICallBack {
void onResponse(JsonResult result);
}
/*-------------------------------------------------------------------------------------------------------
提供给外部调用的方法*/
/**
* post方式提交Json字符串
*
* @param activity Activity
* @param url 子路径
* @param postBody 要发送的字符串
* @param iCallBack 请求成功的回调
*/
public void stringPost(Activity activity, String url, String postBody, ICallBack iCallBack) {
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(postBody, mediaType);
Request request = new Request.Builder()
.url(Interface.API + url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d("onFailure", e.getMessage());
toast(activity);
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if (response.code() != 200) {
toast(activity);
} else {
JsonResult jsonResult = new JsonResult();
try {
JSONObject jsonObject = new JSONObject(response.body().string());
jsonResult.setState(jsonObject.getInt("state"));
jsonResult.setData(jsonObject.getString("data"));
jsonResult.setMsg(jsonObject.getString("msg"));
} catch (JSONException e) {
e.printStackTrace();
}
requestSuccess(activity, jsonResult, iCallBack);
}
}
});
}
/**
* post方式提交表单(已自动添加personToken)
*
* @param activity Activity
* @param url 根路径后面的子路径
* @param map 要发送的数据Map
* @param iCallBack 请求成功的回调
*/
public void formPost(Activity activity, String url, Map<String, String> map, final ICallBack iCallBack) {
FormBody.Builder builder = new FormBody.Builder();
//从SharedPreference中取出personToken添加到表单中
builder.add("id", activity.getSharedPreferences("user", Activity.MODE_PRIVATE).getString("personToken", ""));
for (Map.Entry<String, String> entry : map.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
FormBody formBody = builder.build();
Request request = new Request.Builder()
//根路径拼接子路径
.url(Interface.API + url)
.post(formBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d("onFailure", e.getMessage());
toast(activity);
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if (response.code() != 200) {
toast(activity);
} else {
JsonResult jsonResult = new JsonResult();
try {
JSONObject jsonObject = new JSONObject(response.body().string());
jsonResult.setState(jsonObject.getInt("state"));
jsonResult.setData(jsonObject.getString("data"));
jsonResult.setMsg(jsonObject.getString("msg"));
} catch (JSONException e) {
e.printStackTrace();
}
requestSuccess(activity, jsonResult, iCallBack);
}
}
});
}
/**
* Post方式上传图片
*
* @param activity Activity
* @param url 根路径后面的子路径
* @param id id
* @param file 图片文件
* @param iCallBack 请求成功的回调
*/
public void formFilePost(Activity activity, String url, String id, File file, final ICallBack iCallBack) {
MediaType mediaType = MediaType.parse("image/png");
RequestBody fileBody = RequestBody.create(file, mediaType);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "file", fileBody)
.addFormDataPart("id", id)
.build();
Request request = new Request.Builder()
.url(Interface.API + url)
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d("onFailure", e.getMessage());
toast(activity);
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if (response.code() != 200) {
toast(activity);
} else {
JsonResult result = new Gson().fromJson(response.body().string(), JsonResult.class);
requestSuccess(activity, result, iCallBack);
}
}
});
}
/**
* get请求(已自动添加personToken)
*
* @param activity Activity
* @param url 根路径后面的子路径
* @param map 要发送的数据Map
* @param iCallBack 请求成功的回调
*/
public void get(Activity activity, String url, Map<String, String> map, final ICallBack iCallBack) {
StringBuilder builder = new StringBuilder(url);
//从SharedPreference中取出personToken拼接到url后面
builder.append("?id=");
builder.append(activity.getSharedPreferences("user", Activity.MODE_PRIVATE).getString("personToken", ""));
for (Map.Entry<String, String> entry : map.entrySet()) {
builder.append("&");
builder.append(entry.getKey());
builder.append("=");
builder.append(entry.getValue());
}
Request request = new Request.Builder()
//根路径拼接子路径
.url(Interface.API + builder.toString())
.get()
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d("onFailure", e.getMessage());
toast(activity);
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if (response.code() != 200) {
toast(activity);
} else {
JsonResult jsonResult = new JsonResult();
try {
JSONObject jsonObject = new JSONObject(response.body().string());
jsonResult.setState(jsonObject.getInt("state"));
jsonResult.setData(jsonObject.getString("data"));
jsonResult.setMsg(jsonObject.getString("msg"));
} catch (JSONException e) {
e.printStackTrace();
}
requestSuccess(activity, jsonResult, iCallBack);
}
}
});
}
/*-------------------------------------------------------------------------------------------------------*/
/**
* 请求成功后,将获取的数据传递给回调方法
* 回调方法中的内容直接运行在主线程中
*
* @param activity Activity
* @param result JsonResult 拿到的数据
* @param iCallBack 回调接口
*/
private static void requestSuccess(Activity activity, final JsonResult result, final ICallBack iCallBack) {
activity.runOnUiThread(() -> {
if (iCallBack != null) {
iCallBack.onResponse(result);
}
});
}
private void toast(Activity activity) {
Looper.prepare();
Toast.makeText(activity, "网络连接失败", Toast.LENGTH_SHORT).show();
Looper.loop();
}
}
Activity中使用
Map<String, String> map = new HashMap<>();
map.put("enterpriseId", "1");
OkHttpRequestUtil.getInstance().formPost(this, "url", map, (result -> {
// TODO something
}));
说明:Interface是一个自定义类的名称,里面是一些public static final String的成员属性,用来保存一些服务器地址。