OKHttp封装

本文介绍了一个基于OkHttp的网络请求封装方案,包括GET、POST请求及文件上传功能,并提供了具体的实现代码示例。

导包:

implementation 'com.squareup.okhttp3:okhttp:3.9.0'
权限:联网,读,写


<Button
        android:onClick="btnForGet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="使用封装的OkHttp类进行GET请求"/>

    <Button
        android:onClick="btnForPost"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="使用封装的OkHttp类进行Post请求"/>


接口类:

/**
 * 定义一个接口
 */
public interface OnFinishListener {
    void onFailed(String msg);
    void onSuccess(Object obj);
}


OKHttpUtils.java

public class OkHttpUtils {
    private static OkHttpUtils OK_HTTP_UTILS = null;
    //定义一个Handler
    private static Handler handler = new Handler();
    private OkHttpUtils() {
    }

    /**
     * 得到OkHttpUtils实例对象
     *
     * @return
     */
    public static OkHttpUtils getInstance() {
        if (null == OK_HTTP_UTILS) {
            synchronized (OkHttpUtils.class) {
                if (null == OK_HTTP_UTILS) {
                    OK_HTTP_UTILS = new OkHttpUtils();
                }
            }
        }
        return OK_HTTP_UTILS;
    }

    /**
     * Get请求
     *
     * @param path             http://www.baidu.com?key=value&key=value
     * @param onFinishListener
     */
    public void doGet(String path, Map<String, String> map, final OnFinishListener onFinishListener) {
        //Http:/www.baidu.com?key=ddd&
        StringBuffer sb = new StringBuffer();
        sb.append(path);
        //判断path是否包含一个
        if (sb.indexOf("?") != -1) {

            //判断"?"是否在最后一个
            if (sb.indexOf("?") != sb.length() - 1) {
                sb.append("&");
            }
        } else {
            sb.append("?");
        }

        //遍历map集合中所有请求参数
        for (Map.Entry<String, String> entry : map.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue())
                    .append("&");
        }

        //判断get请求路径最后是否包含一个"&"
        if (sb.lastIndexOf("&") != -1) {
            sb.deleteCharAt(sb.length() - 1);
        }


        OkHttpClient okHttpClient = new OkHttpClient();
        //构建请求项
        Request request = new Request.Builder()
                .get()
                .url(sb.toString())
                .build();

        Call call = okHttpClient.newCall(request);
        //execute 子线程  enqueue //
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                //请求失败
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onFinishListener.onFailed(e.getMessage());
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //得到服务器的响应结果
                final String result = response.body().string();
                //请求成功
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //主线程当中执行
                        onFinishListener.onSuccess(result);
                    }
                });
            }
        });
    }

    /**
     * post请求
     *
     * @param path
     * @param map
     * @param onFinishListener
     */
    public void doPost(String path, Map<String, String> map, final OnFinishListener onFinishListener) {
        OkHttpClient okHttpClient = new OkHttpClient();
        //构建参数的对象
        FormBody.Builder builder = new FormBody.Builder();
        //遍历map集合,获取用户的key/value
        for (String key : map.keySet()) {
            builder.add(key, map.get(key));
        }
        /*FormBody body = new FormBody.Builder()
                .add("mobile",mobile)
                .add("password",password)
                .build();*/
        //构建请求项
        final Request request = new Request.Builder()
                .post(builder.build())
                .url(path)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onFinishListener.onFailed(e.getMessage());
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();//这句话必须放到子线程里
                System.out.println("OkHttUitls 线程名 : " + Thread.currentThread().getName());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onFinishListener.onSuccess(result);
                    }
                });

            }
        });
    }

    /**
     * 上传文件
     *
     * @param path             上传文件路径
     * @param params           上传的参数
     * @param onFinishListener 监听
     */
    public void upLoadFile(String path, Map<String, Object> params, final OnFinishListener onFinishListener) {
        OkHttpClient okHttpClient = new OkHttpClient();
        MultipartBody.Builder builder = new MultipartBody.Builder();
        //设设置类型 以表单的形式提交
        builder.setType(MultipartBody.FORM);
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            Object object = entry.getValue();
            if (!(object instanceof File)) {
                builder.addFormDataPart(entry.getKey(), object.toString());
            } else {
                File file = (File) object;
                builder.addFormDataPart(entry.getKey(), file.getName().trim(),
                        RequestBody.create(MediaType.parse("img/png"), file));
                //img/png -> application/octet-stream
            }
        }
        Request request = new Request.Builder()
                .post(builder.build())
                .url(path)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        onFinishListener.onFailed(e.getMessage());
                    }
                });
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                //判断服务器是否响应成功
                if (response.isSuccessful()) {
                    final String result = response.body().string();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            onFinishListener.onSuccess(result);
                        }
                    });
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //服务器响应失败
                            onFinishListener.onFailed(response.message());
                        }
                    });
                }
            }
        });
    }
}

MainActivity.java

 //得到工具类的对象
//全局变量
( private OkHttpUtils okHttpUtils;)

        okHttpUtils = OkHttpUtils.getInstance();

继承

	implements OnFinishListener

 public void btnForGet(View view) {
        Map<String, String> params = new HashMap<>();
        params.put("mobile", "13654897654");
        params.put("password", "123456");
        okHttpUtils.doGet("http://120.27.23.105/user/login", params, this);

    }
    public void btnForPost(View view) {
       /* Map<String,String> paramters = new HashMap<>();
        paramters.put("mobile","13654897654");
        paramters.put("password","123456");
        okHttpUtils.doPost("http://120.27.23.105/user/login",paramters,this);*/
        //上传的文件
        File file = new File(Environment.getExternalStorageDirectory(), "img.png");
        Map<String, Object> params = new HashMap<>();
        params.put("uid", "3577");
        params.put("file", file);
        okHttpUtils.upLoadFile("http://120.27.23.105/file/upload", params, this);
    }


    @Override
    public void onFailed(String msg) {
        //失败
        System.out.println("MainActivity : " + msg + " 线程名 : "
                + Thread.currentThread().getName());

    }

    @Override
    public void onSuccess(Object obj) {
        //成功
        System.out.println("MainActivity : " + obj.toString()
                + "\n 线程名 : " + Thread.currentThread().getName());
    }










本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值