OkHttp简单封装

简单封装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的成员属性,用来保存一些服务器地址。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值