Android Okhttp工具类的封装(okhttpUtils)

2023-05-16

Android Okhttp工具类

Android Okhttp工具类的封装(okhttpUtils)

近期的项目频繁使用到了网络交互,采用的是第三方类库okhttp
以下是我对okhttp主要使用到的方法进行的封装。
github源码地址:https://github.com/square/okhttp

主要是分为以下三种使用模式(post请求)

  1. post请求(参数+cookie)
  2. post请求(单文件+参数+cookie)
  3. post请求(多文件+参数+cookie)

下面是代码

代码中的变量声明

  private static volatile OkhttpUtil instance;
  private static final String TAG = "OkhttpUtil";
  public static Handler handler = new Handler();
  private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

双重检测锁-单例模式

 /**
     * 双重检测锁-单例模式
     *
     * @return
     */
    public static OkhttpUtil getInstance() {
        if (instance == null) {
            synchronized (OkhttpUtil.class) {
                if (instance == null) {
                    instance = new OkhttpUtil();
                }
            }
        }
        return instance;
    }

然后是post请求(参数+cookie)

 /**
     * @网络请求--post请求(参数+cookie)
     * url地址,map是参数集合,name是header的key,value是header的value,CallBack回调方法
     */
    public void postParameter(String url, Map<String, String> map, String name, String value, final CallBack callback) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
            @Override
            public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {//存储用户身份凭证
                cookieStore.put(httpUrl.host(), list);
            }

            @Override
            public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                List<Cookie> cookies = cookieStore.get(httpUrl.host());
                return cookies != null ? cookies : new ArrayList<Cookie>();
            }
        }).build();
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        for (Map.Entry<String, String> entry : map.entrySet()) {//遍历map集合进行添加
            builder.addFormDataPart(entry.getKey(), entry.getValue());
        }
        MultipartBody requestBody = builder.build();
        final Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .header(name, value)//将身份凭证作为头参数,访问时携带发送
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                Log.e(TAG, "onFailure:" + e.getCause().getStackTrace() + e.getMessage());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFailed( e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String result = response.body().string();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess( result);
                        }
                    });
                }
            }
        });
    }

下面是post请求(参数+cookie)使用时的代码

 private void post() {
        OkhttpUtil okhttpUtil = new OkhttpUtil();
        String url = "这里是所要访问的url地址;
        Map<String, String> map = new HashMap<>();//参数map集合
        map.put("account", account);//向map集合中添加参数
        map.put("pw", pw);
        okhttpUtil.postParameter(url, map, new CallBack() {
            @Override
            public void onSuccess(String request) {//回调访问成功
                final Gson gson = new Gson();
                loginBean newsBean = gson.fromJson(request, loginBean.class);//解析传回的json数据
                String message = newsBean.getMessage();  //获取传回的message
            }

            @Override
            public void onFailed(Exception e) {//回调访问失败
                Toast.makeText(LoginActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
            }
        });
    }

好了,以上就是post请求(参数+cookie)的使用过程
那么下面就是 post请求(单文件+参数+cookie)了

 /**
     * @网络请求--post请求(单文件+参数+cookie)
     * url地址,map是参数集合,f是文件,name是header的key,value是header的value,CallBack回调方法
     */
    public void postFileCookie(String url, String f, Map<String, String> map, String name, String value, final CallBack callback) {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
            @Override
            public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
                cookieStore.put(httpUrl.host(), list);
            }

            @Override
            public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                List<Cookie> cookies = cookieStore.get(httpUrl.host());
                return cookies != null ? cookies : new ArrayList<Cookie>();
            }
        }).build();
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            builder.addFormDataPart(entry.getKey(), entry.getValue());
        }
        File file = new File(f);
        if (file != null) {
            builder.addFormDataPart("file", file.getName(),
                    RequestBody.create(MediaType.parse("file/*"), file));
        }
        MultipartBody requestBody = builder.build();
        Request request = new Request.Builder()
                .url(url)
                .header(name, value)
                .post(requestBody)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                Log.e(TAG, "onFailure:" + e.getCause().getStackTrace() + e.getMessage());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onFailed( e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onSuccess(result);
                    }
                });
            }
        });
    }

下面是post请求(单文件+参数+cookie)使用时的代码

 private void post() {
        OkhttpUtil okhttpUtil = new OkhttpUtil();
        String url = "这里是所要访问的url地址";
        Map<String, String> map = new HashMap<>();
        map.put("enterprise", "enterprise");//向map集合中添加参数
        map.put("checklogid", checklogid);
        okhttpUtil.postFileCookie(url, savedFile, map, "cookie", "JSESSIONID=" + getToken(), new CallBack() {
            @Override
            public void onSuccess(String request) {//请求成功
                final Gson gson = new Gson();
                updateBean newsBean = gson.fromJson(request, updateBean.class);//解析传回的json数据
                String message = newsBean.getMessage();//获取想要拿到的数据
            }
            @Override
            public void onFailed(Exception e) {//请求失败
                Toast.makeText(getActivity(), "网络错误", Toast.LENGTH_SHORT).show();
            }
        });
    }

以下是post请求(多文件+参数+cookie)

 /**
     * @网络请求--post请求(多文件+参数+cookie)
     *  url地址,map是参数集合,list是文件集合,name是header的key,value是header的value,CallBack回调方法
     */
    public void postFileParameterCookie(String url, Map<String, String> map, List<String> list, String name, String value, final CallBack callback) {
        if (list.size() > 0) {
            OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
                @Override
                public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
                    cookieStore.put(httpUrl.host(), list);
                }

                @Override
                public List<Cookie> loadForRequest(HttpUrl httpUrl) {
                    List<Cookie> cookies = cookieStore.get(httpUrl.host());
                    return cookies != null ? cookies : new ArrayList<Cookie>();
                }
            }).build();
            MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
            for (int i = 0; i < list.size(); i++) {遍历集合中的文件
                File file = new File(list.get(i));
                if (file != null) {
                    builder.addFormDataPart("file", file.getName(),
                            RequestBody.create(MediaType.parse("file/*"), file));
                }
            }
            for (Map.Entry<String, String> entry : map.entrySet()) {
                builder.addFormDataPart(entry.getKey(), entry.getValue());
            }
            MultipartBody requestBody = builder.build();
            Request request = new Request.Builder()
                    .url(url)
                    .header(name, value)//身份标识
                    .post(requestBody)
                    .build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new okhttp3.Callback() {
                @Override
                public void onFailure(Call call, final IOException e) {//访问失败
                    Log.e(TAG, "onFailure:" + e.getCause().getStackTrace() + e.getMessage());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onFailed(e);
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {//访问成功
                    final String result = response.body().string();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(result);
                        }
                    });
                }
            });
        }
    }

下面是post请求(多文件+参数+cookie)使用时的代码

 private void post(List<String> list) {
        String url = "访问的url地址";
        OkhttpUtil okhttpUtil = new OkhttpUtil();
        Map<String, String> map= new HashMap<>();
        map.put("rectifyday", rectifyday);		//向map中添加参数
        map.put("treatmethod", treatmethod);
        okhttpUtil.postFileParameterCookie(url, map, list, "cookie", "JSESSIONID=" + getToken(), new CallBack() {
            @Override
            public void onSuccess(String request) {
                final Gson gson = new Gson();
                updateBean newsBean = gson.fromJson(request, updateBean.class);//解析传回的json数据
                String message = newsBean.getMessage();//获取想要拿到的数据
            }
            @Override
            public void onFailed( Exception e) {
                Toast.makeText(UpdateActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
            }
        });
    }

其中的CallBack是另写的一个接口,代码如下:

public interface CallBack{
    void onSuccess(String request);
    void onFailed(Exception e);
}

以上就是我对okhttp的封装。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Okhttp工具类的封装(okhttpUtils) 的相关文章

  • 【tcpdump命令使用总结】

    1 tcpdump说明 linux系统的tcpdump命令用来分析数据包分析工具 xff0c 相似的工具有wireshark等 xff0c wireshark使用见 wireshark报文解析ping baidu com 执行tcpdump
  • 使用graphviz+pycallgraph绘制python调用关系图

    绘制python代码调用关系图 前言1 工具安装1 1 安装graphviz1 2 安装pycallgraph2 可视化调用关系 参考文献 前言 一个 python project 中往往包含很多 py 文件 python文件中又会包含很多
  • 用树莓派实现人脸识别打卡门禁系统

    用树莓派实现人脸识别打卡门禁系统的构建 背景功能硬件效果源码摄像头测试代码录入信息人脸识别 结论 背景 源于实习公司的人脸识别打卡系统 xff0c 完成之前的项目后正好没有事情干 xff0c 于是想到了这个 xff0c 公司的这个打卡系统操
  • 一个多功能智能小车的想法

    其实一直以来都有这个想法 xff0c 但是一直没有付出行动 xff0c 学了一些专业知识之后就有了一个想法 xff0c 制作一个智能的 xff0c 非常炫酷的并且看起来就很不普通的一个机器人 xff0c 比如像机器人总动员里的瓦力 xff1
  • “2020 博客之星”年度总评选 TOP 200 名单已出,速来认领!

    经过为期半个月的激烈角逐 xff0c 2020博客之星海选投票已正式落下帷幕 成功的程序员离不开技术之路的踽踽独行 xff0c 同时也离不开社区同盟的鼎力拥趸 以下博主们在此次票选中获得了强有力的支持 xff0c 为他们一整年的技术输出添上
  • 三自由度机械臂的三维设计

    三自由度机械臂的三维设计 背景底座设计机械臂设计关节连接方式底座与机械臂的连接方式效果 背景 写本篇文章的时候只是模型设计完成以及部分零件进行了采购 xff0c 最终是否能实现不能确定 xff0c 某些图片过于辣眼 xff0c 请多担待 继
  • 气动爬行机器人设计

    气动爬行机器人设计 简介项目规则想法原理电控原理腿部机构转向机构其他结构 结语 简介 最近在学校做一个气动的爬行机器人 xff0c 算是一个二级项目 xff0c 虽然名义上有分组 xff0c 但是基本上是我自己在做 xff0c 觉得有些东西
  • ImportError: cannot import name 'Flask'解决方法

    在写bug的时候发现了这么一个错误 xff0c ImportError cannot import name Flask xff0c 自己建一个test脚本 xff0c 代码复制过去后发现可以运行 xff0c 经检查发现脚本文件的名称可能和
  • python lambda表达式详解

    64 python lambda表达式详解 1 lambda简介 先来看一段代码示例 xff1a 第一行是lambda声明 xff0c x y相当于传入的参数 xff0c 整个函数会返回x 43 y的值 lambda作为一个表达式 xff0
  • CNN(卷积神经网络)详解

    CNN卷积神经网络详解 Why CNN局部感受野 local receptive fields 权值共享 Shared weights and biases 池化 Pooling 总的来看 Why CNN 首先回答这样一个问题 xff0c
  • mysql索引笔记 innodb null

    1 列有null 索引不失效 2 is not null 不会用索引 3 模糊查询 左边匹配 不会用索引 4 组合索引最左原则 5 设置索引 不加长度 默认长度为字段长度如varcher 255 单个索引字节不超过767 组合索引不超过30
  • Mysql避免索引失效

    要尽量避免这些不走索引的sql xff1a SELECT 96 sname 96 FROM 96 stu 96 WHERE 96 age 96 43 10 61 30 不会使用索引 xff0c 因为所有索引列参与了计算 SELECT 96
  • MySQL中的semi-join半连接

    MySQL中的semi join半连接
  • JDK8 lamdba

    1 方法调用
  • try catch finally执行顺序

    try catch finally执行顺序 内容简介代码示例执行结果 xff1a 分析 内容简介 代码中经常会在catch 或者finally中再次抛出异常 xff0c 传给调用者 xff08 如文件上传处理工具类 xff09 xff0c
  • C++中全局变量的使用

    在C 43 43 中全局变量的定义与使用做一下下面简单的记录 xff0c 方便日后查阅 xff0c 也与大家一起学习 1 全局变量的声明 1 在头文件 h中进行声明 xff0c 如果在此文件之外也要使用该变量 xff0c 则在变量声明前加e
  • mysql innodb

    mysql s sql优化 io 使用limit返回用到的字段 xff0c 不要返回太多无用字段和一些大字段 避免索引失效 创建索引 dd
  • C语言之什么是大小端,数组大小端,位域大小端,结构体大小端

    公众号 xff1a 嵌入式不难 本文仅供参考学习 xff0c 如有错误之处 xff0c 欢迎留言指正 理解大小端之前必须明白的三点 内存地址始终以字节为单位大小端只针对基本数据类型存在位域的情况下 xff0c 小端模式下先定义的位域从LSB
  • <Linux开发> linux应用开发-之-can通信开发例程

    xff1c Linux开发 xff1e linux应用开发 之 can通信开发例程 一 简介 对于Can通信的相关介绍 xff0c 读作不过多介绍了 xff0c 网上其它网友的介绍有很多 二 环境搭建 本次测试can通信的应用例程是运行在u
  • 使用RGBD相机模拟激光数据,用于move_base中添加新图层避障功能

    参考文章 xff1a ROS depthimage to laserscan ROS导航 向cost map中添加超声波障碍图层 一 RGBD模拟激光雷达数据 我使用的是RealSense双目相机 xff0c 首先使用的是ros自带的功能包

随机推荐

  • 公安视图库1400的协议

    一 平台注册 注销 1 1 注册 注销流程 注册流程1如图所示 图 1 下级平台主动向上级平台注册 xff1b 注册鉴权信息 xff08 用户名和密码 xff09 由上级平台提供 xff1b 1 2 报文说明 1 2 1 下级第一次注册 P
  • linux cmake交叉编译

    linux cmake交叉编译 linux cmake交叉编译下载测试添加依赖库需要注意的问题 linux cmake交叉编译 linux cmake交叉编译 xff0c 使用环境 xff1a ubuntu cmake gcc arm 10
  • OpenCV中使用RANSAC算法实现多张图像拼接

    思路 xff1a xff08 1 xff09 获取图像的特征点 xff0c 将每张图片的特征点保存到一个vector中 xff1b xff08 2 xff09 通过特征点匹配的方法 xff0c 找到每张图片的共有特征点 xff0c 并将其保
  • 数据安全--安全网关

    简介 对于数据安全来说 xff0c 安全网关是数据安全建设中极其重要的一部分 xff0c 我这里把它做了几种分类 xff0c 如下 xff1b 对内 xff1a 零信任安全网关 xff08 7层和4层 xff09 对外 xff1a 应用安全
  • idea使用svn拉取源码,创建分支,合并分支教程

    svn拉取源码 xff0c 创建分支 xff0c 合并分支教程 最近对svn的分支使用比较感兴趣了 xff0c 花时间研究了一下 xff0c 分享给大家 xff1a 此文章记录了idea使用svn的过程 xff1a 包括拉取源码 建立分支
  • Qt中QSS的简单使用

    样式表的组成 样式表由两大元素组成 xff1a 选择器和声明 选择器实际上可以理解为对象 xff0c 声明则是对该对象的属性的设置 样式表的使用 方法一 xff1a 在代码中调用setStyleSheet 来设置样式 xff1b 方法二 x
  • jetson nano pytorch安装及文件系统扩容

    jetson nano扩容 我安装的系统是16GB的 xff0c 如果不扩容的话文件系统只有16GB 首先安装gparted span class token function sudo span span class token func
  • Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths

    fastplanner2 摘要相关工作基于梯度的路径优化拓扑路径规划 路径制导轨迹优化A 优化失效分析B 问题公式化 拓扑路径搜索A 拓扑等价关系B 拓扑路径图C 路径缩短和修剪 实时拓扑路径规划 这篇论文是港科大开源的无人机运动规划fas
  • curl 参数配置详情

    第一类 xff1a 对于下面的这些option的可选参数 xff0c value应该被设置一个bool类型的值 xff1a CURLOPT AUTOREFERER 当根据Location 重定向时 xff0c 自动设置header中的Ref
  • 分区隔离与数据安全交换技术

    一 背景 网络的物理隔离是很多网络设计者都不愿意的选择 xff0c 网络上要承载专用的业务 xff0c 其安全性一定要得到保障 然而网络的建设就是为了互通的 xff0c 没有数据的共享 xff0c 网络的作用也缩水了不少 xff0c 因此网
  • g++编译命令大全

    gcc amp g 43 43 现在是gnu中最主要和最流行的c amp c 43 43 编译器 g 43 43 是c 43 43 的命令 xff0c 以 cpp为主 xff0c 对于c语言后缀名一般为 c 这时候命令换做gcc即可 其实是
  • Ubuntu 14.04 配置iptables防火墙

    Ubuntu默认安装是没有开启任何防火墙的 xff0c 为了学习redis数据库 xff0c 需要启用防火墙设置 whereis iptables 查看系统是否安装防火墙可以看到 iptables sbin iptables usr sha
  • Qt显示汉字乱码问题

    转载自http blog csdn net u012790503 article details 52485263 测试1 新建test工程用于测试 xff0c main c文件内容如下 xff1a span class hljs prep
  • Anaconda使用总结

    原文地址 xff1a https www jianshu com p 2f3be7781451 序 Python易用 xff0c 但用好却不易 xff0c 其中比较头疼的就是包管理和Python不同版本的问题 xff0c 特别是当你使用Wi
  • A*寻路算法介绍

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角 xff0c 让它们移动到特定的位置 xff0c 避开墙壁和障碍物呢 xff1f 如果是的话 xff0c 请看这篇教程 xff0c 我们会展示如何使用A星寻路算法来实现它 xff01 在网上
  • RTK固定解什么意思

    RTK固定解什么意思 金丝大环刀的回答 知乎 RTK固定解什么意思 知乎 rtk固定解一般是指载波相位窄巷整周模糊度已经固定之后的解算结果 narrow int xff0c 精度可达厘米级至毫米级 除此之外 xff0c 还有宽巷解 xff0
  • QtCreate由MinGW编译的项目,换为MSVC编译器后编译无法通过

    解决方法 xff1a 1 将文件的编码格式设置为utf 8且BOM格式 xff1b 2 在 pro文件中添加如下代码 msvc QMAKE CFLAGS 43 61 utf 8 QMAKE CXXFLAGS 43 61 utf 8 其中方法
  • 2D nav goal 后小车不能沿着路径走

    2D nav goal 后小车不能沿着路径走 解决方法 xff1a 下载turtlebot3的代码 xff0c 编译 xff0c 把原来的模型改成turtlebot3的 真正的错因 xff1a xacro在melodic版本上的inorde
  • vscode配置header指令添加头部注释或KoroFileHeader自动添加头部解释

    1 xff08 1 xff09 新建Python文件输入header添加头部注释 vscode gt file gt Perferences gt User Snippets gt python 也可选其他语言 xff1a 则会生成pyth
  • Android Okhttp工具类的封装(okhttpUtils)

    Android Okhttp工具类 Android Okhttp工具类的封装 xff08 okhttpUtils xff09 近期的项目频繁使用到了网络交互 xff0c 采用的是第三方类库okhttp 以下是我对okhttp主要使用到的方法