OkHttp的使用之{RequestBody、FormBody、MultipartBody}

2023-11-18

目录

0、相关文章

1、POST请求

1.1、RequestBody--json数据提交

1.2、FromBody---表单提交 这种能满足大部分的需求

1.3、MultipartBody---文件上传

1.4、图片下载,文件下载


0、相关文章

OkHttp的初步使用(get、post之{RequestBody、FormBody、MultipartBody})(阅读量4w,40赞)

1、POST请求

主要来讲一下post请求,post方式中的Request需要传递一个RequestBody作为post的参数。RequestBody有两个子类:FormBody和MultipartBody

1.1、RequestBody--json数据提交

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
     RequestBody body = RequestBody.create(JSON, json);
      Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
//同步
      Response response = client.newCall(request).execute();
    f (response.isSuccessful()) {
        return response.body().string();
    } else {
        throw new IOException("Unexpected code " + response);
    }
}

1.2、FromBody---表单提交 这种能满足大部分的需求

romBody用于提交表单键值对,key-value,其作用类似于HTML中的<form>标记。比如username="LHX",age="21"等类似的键值对。

我们可以使用HashMap<String,String>这样的数据结构来存储接口所需参数的键值对,它的查找速度为O(1),很快,但是对于API接口参数来说,数据不会太多,查找快体现不出优势来,并且HashMap比较耗费内存。以下是使用hashmap的例子:

private void fetchDataByPost() {
     //把参数传进Map中
        HashMap<String,String> paramsMap=new HashMap<>();
        paramsMap.put("name","哈哈");
        paramsMap.put("client","Android");
        paramsMap.put("id","3243598");
        FormBody.Builder builder = new FormBody.Builder();
        for (String key : paramsMap.keySet()) {
            //追加表单信息
            builder.add(key, paramsMap.get(key));
        }
   OkHttpClient okHttpClient=new OkHttpClient();
        RequestBody formBody=builder.build();
      Request request=new   Request.Builder().url(netUrl).post(formBody).build();
        Call call=okHttpClient.newCall(request);
       call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败的处理
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {  
            }
        });

}

所以我们还有一种方式可以装取键值对,通过ArrayList<RequestParameter>这样的数据结构。

//首先要有一个RequestParameter类
public class RequestParameter implements Serializable {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    private  String name;
    private  String value;
    public RequestParameter(String name,String value){
        this.name=name;
        this.value=value;
    }
}
        List<RequestParameter> parameter=new ArrayList<>();
        RequestParameter rp1=new RequestParameter("name","哈哈");
        parameter.add(rp1);
        RequestParameter rp2=new RequestParameter("client","Android");
        parameter.add(rp2);

        //创建一个FormBody.Builder
        FormBody.Builder builder=new FormBody.Builder();
        if (parameter!=null&&parameter.size()>0){
            for (final RequestParameter p : parameter) {
                builder.add(p.getName(),p.getValue());
            }
        }
        RequestBody formBody=builder.build();
   OkHttpClient okHttpClient=new OkHttpClient();
        Request request=new   Request.Builder().url(netUrl).post(formBody).build();
        Call call=okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败的处理
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {  
            }
        });

1.3、MultipartBody---文件上传

MultipartBody可以构建与HTML文件上传格式兼容的复杂请求体。

   File file=new File(Environment.getExternalStorageDirectory(), "balabala.png");
        MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
        RequestBody filebody = MultipartBody.create(MEDIA_TYPE_PNG, file);
        MultipartBody.Builder multiBuilder=new MultipartBody.Builder();
        //这里是 封装上传图片参数
        multiBuilder.addFormDataPart("file", file.getName(), filebody);
        //参数以添加header方式将参数封装,否则上传参数为空
        // 设置请求体
        multiBuilder.setType(MultipartBody.FORM);
//这里是 封装上传图片参数
        multiBuilder.addFormDataPart("file", file.getName(), filebody);
        // 封装请求参数,这里最重要
        HashMap<String, String> params = new HashMap<>();
        params.put("client","Android");
        params.put("uid","1061");
        params.put("token","1911173227afe098143caf4d315a436d");
        params.put("uuid","A000005566DA77");
        //参数以添加header方式将参数封装,否则上传参数为空
        if (params != null && !params.isEmpty()) {
            for (String key : params.keySet()) {
                multiBuilder.addPart(
                        Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
                        RequestBody.create(null, params.get(key)));
            }
        }
 RequestBody multiBody=multiBuilder.build();
   OkHttpClient okHttpClient=new OkHttpClient();
        Request request=new   Request.Builder().url(netUrl).post(multiBody).build();
        Call call=okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败的处理
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {  
            }
        });

1.4、图片下载,文件下载

图片下载是通过回调的Response拿到byte[]然后decode成图片;
文件下载,就是拿到inputStream做写文件操作;

 

 

 

 

 

 

 

 

 

 

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

OkHttp的使用之{RequestBody、FormBody、MultipartBody} 的相关文章

  • linux设备驱动makefile入门解析

    以下内容仅作参考 能力有限 如有错误还请纠正 对于一个普通的linux设备驱动模块 以下是一个经典的makefile代码 使用下面这个makefile可以 完成大部分驱动的编译 使用时只需要修改一下要编译生成的驱动名称即可 只需修改obj
  • 关于socket大数据收发解决方案

    关于socket大数据收发 现在遇到个问题 我们这边是做客户端的 服务器端是socket 不是我们写的 看不到源码 走的是tcp协议 我们的socket客户端在接收大数据 大约大于5000个byte 的时候总是不能一次性的接收所有的数据 一
  • 知乎 爬虫

    import requests from pyquery import PyQuery as pq def getHtml url try headers User Agent Mozilla 5 0 Macintosh Intel Mac
  • 远程桌面出现了内部错误有哪些解决方法?

    远程桌面连接出现了内部错误解决方法 在使用Windows自带远程桌面连接时 有时会遇到 远程桌面出现了内部错误 这一问题 许多用户不知道如何解决远程桌面连接出现了内部错误 这里我们整理了五种有效的解决方法 分享出来以供参考 方法一 重启远程
  • ETL使用Kettle处理银行信用卡申请项目

    一 项目概述 对当天申请信用卡人员进行信息校对 对不符合人员进行风险标注 无风险人员信息根据所在地区进行分表 交付 信息来源 1 web端 银行网页申请 2 移动端 网银 手机银行 3 三方 各类门户网站 手机APP 4 柜台 人工柜台 A
  • 利用GIT钩子函数实现自动部署或其他操作

    1 Server端 第一步 创建初始化一个裸仓库 用来添加钩子函数 git init bare test git hook function git 第二步 通过裸仓库创建一个用来存放代码的仓库 git init test git hook
  • latex算法步骤,子代码编号及修改算法框的宽度

    看了官方文档和网上一下资料 对于一个步骤下面有好多子步骤的算法 大多是通过for循环与while判断实现的 而且对于for下面的每一步骤没有重新编码 感觉很乱 不好看 论文的参考文有下图的结构 感觉很好 可以一用 主要用到下面这个代码块 其
  • 被C语言的malloc给坑了

    事情是这样的 最近想用C语言实现一些数据结构 今天在写二叉树时在linux下使用gcc编码是没有任何问题的 然而当我在本地window使用clion编写时 同样的代码竟然不能用了 反复看了下代码没有任何问题 然后我把代码拷贝到linux中用
  • redis集群配置

    分片集群搭建 springboot集成redis 相关配置 spring redis timeout 3000 database 0 cluster node 127 0 0 1 7000 127 0 0 1 7001 127 0 0 1
  • SpringBoot 文件上传解决跨域问题

    后端解决跨域问题 在Controller接口上加上 CrossOrigin注解就可以 该注解可以加在类上 也可以加在方法上 一般的请求处理数据都没有问题 但是如果上传文件就会报跨域的错误 解决这个文件上传跨域的问题 就需要增加一个过滤器配置
  • django解决跨域的方法,django如何解决跨域问题,django如何跨域

    django 使三方工具包解决跨域问题 1 安装 pip install django cors headers 2 到django的配置文件settings py中配置 1 注册到app中 INSTALLED APPS corsheade
  • Thread.UncaughtExceptionHandler

    1 自定义Application继承Application 在清单文件中将默认的Application的android name 替换成自定义的Application对象名称即可 在Oncreate中写入要实现的内容 2 在编写APK程序时
  • SpringBoot @EnableAutoConfiguration exclude属性失效

    在学习SpringBoot的时候 入了不少的坑 今天学习 SpringBootApplication里面的 EnableAutoConfiguration注解的exclude属性的 加载配置中 发现了属性失效的case 病状 exclude
  • NMEA协议解析

    文章目录 一 NMEA0183协议 1 NMEA基本框架 2 常用语句 1 GNGGA 2 GNGLL 3 GNGSA 4 GPGSV 5 GNRMC 6 GNVTG 7 GNZDA 8 PAIRCLK等 二 异或校验和代码 1 网址在线计
  • Pycharm启动失败的可能原因之一

    下载好Python后下载Pycharm应用 但是点击应用配置后有时启动失败 有时弹框提示错误 看进程均不占CPU 尝试网上各种解决方案 重新下载软件 重装系统都没能解决 最终发现是因为电脑上装的加密软件导致 卸载后重新安装即可 Pychar
  • 解决 java.lang.noclassdeffounderror: XXX 相关问题

    本文能临时解决所有与noclassdeffounderror相关的报错 首先说下这个错误 它表示你在运行的时候没有找到这个包 但是我们在编译的时候反而有这个包 这里需要理解下 我们java在编译和运行的时候都会编译jar包 但是你肯定是id
  • 记一次Spark打包错误:object java.lang.Object in compiler mirror

    使用maven compile和package 一直报错scala reflect internal MissingRequirementError object scala runtime in compiler mirror not f
  • 【Linux】实现简易的Shell命令行解释器

    大家好我是沐曦希 文章目录 一 前言 二 准备工作 1 输出提示符 2 输入和获取命令 3 shell运行原理 4 内建命令 5 替换 三 整体代码 一 前言 前面学到了进程创建 进程终止 进程等待 进程替换 那么通过这些来制作一个简易的S
  • 多任务:分层特征融合网络 NDDR-CNN

    论文链接 NDDR CNN 论文摘要 In this paper we propose a novel Convolutional Neural Network CNN structure for general purpose multi

随机推荐

  • sqli-labs/Less-34

    这一关虽然属于宽字节注入 但是回归了post请求了 而且欢迎界面还是存在转义之后的样子和十六进制的样子 首先我们试试在username处输入admin 转义之后变成了admin 所以我们进行宽字节注入将注入修改为admin c0 结果界面还
  • 微信小程序隐私保护指引设置

    今天修改了发布规则 发布前必须填写用户隐私保护指引设置 就是以下内容
  • 解决Unity导出的APK启动黑屏的问题

    今天准备把最近写的Unity游戏编一个版本 但是放真机上运行时 一启动就黑屏 网上各种查资料 折腾半天后 找到了解决方案 需要指定Graphics APIs 为OpenGLES3 在 Project Settings gt Player g
  • sort中用lambda函数(看完就会)

    介绍 sort函数是默认从小到大排列的 如果我们想要改变排序方式就要自己写个cmp函数 如果排列方式比较简单的话我们可以在sort函数中用一个简单的lambda函数 源码及讲解 对非结构体的数组 前面的 表示对数的操作方式 如果填个 说明是
  • shell指令,通过函数实现数组求和,通过函数获取用户uid和gid

    一 实现一个对数组求和的函数 数组通过实参传递给函数 num 0 read p 请输入一组数据 a arr function add for i 0 i lt arr i do num arr i done return num add a
  • CSS中如何实现文字描边效果(Text Stroke)?

    聚沙成塔 每天进步一点点 专栏简介 文字描边效果 Text Stroke 示例 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅 这个专栏是为那些对
  • 手把手接入【微信测试公众号】,不会还有人不会调试公众号吧?

    仅使用微信的测试公众号 Java开发内容 遇错与参考 Java接入测试微信公众号调试流程 前提 创建并配置测试号 登陆注册微信测试公众号 沙箱 微信验签 免登授权获取用户信息 微信接口调试工具的使用 创建服务号菜单 常见错误 invalid
  • 最高月薪15K! 这个30岁的奶茶店老板说:这次转行,转对了!

    人生没有一成不变的风景 这一路上 我们会走过晴天 也会踏过泥泞 会穿越风雨 也将沐浴暖阳 不同的年龄 有不同的风景 不同的阶段 有不同的境遇 也许每个人的经历不同 对人生的感受也各异 但只要内心强大 不断让自己淬炼成长 就能从容面对人生 行
  • Yii Framework 开发教程(47) 主题 Theme 示例

    Theming是一个在Web应用程序里定制网页外观的系统方式 通过采用一个新的主题 可以非常方便的改变应用的外观 在Yii 每个主题由一个目录代表 包含view文件 layout文件和相关的资源文件 如图片 CSS文件 JavaScript
  • 1、安装配置

    一 安装 这里以Redis 5 0 5版本为例 实际安装过程中 可以去官网下载最新的稳定版本 官网地址 http redis io download wget http download redis io releases redis 5
  • 内核启动过程中对CPU型号的确认

    1 内核为什么要确认CPU型号 内核和CPU都是不断发展的 内核会不断的更新版本 CPU会不断的出新型号 每当厂商推出一款新的CPU都需要移植内核 使内核能在新款CPU上运行 如果我们将没有针对该款CPU移植过的内核放到该款CPU上运行 结
  • Linux定时器

    Linux定时器的实现主要用到itimerval结构体以及setitimer产生的信号 系统随使用signal信号处理函数来处理产生的定时信号 从而实现定时器 itimerval结构体说明 struct itimerval Value to
  • [谦实思纪 02]整理自2023雷军年度演讲——《成长》(下篇)创业之旅(创业与成长)

    文章目录 谦实思纪 整理自2023雷军年度演讲 成长 下篇 创业之旅 创业与成长 0 写在前面 1 创业 创业与成长 1 1 找互补的朋友一起干 更容易成功 1 2 创业中必须要有领导者 核心思维 1 3 从失败开始 学海无涯 1 4 金山
  • STM32G070进行flash读写操作

    STM32G070的flash读写问题 STM32G070xx的flash分布如下图 打算将Page 63用于保存用户数据 问题 开始一直出现flash写入失败 从返回码来看是FLASH FLAG PGSERR 一直找不到原因 代码如下 d
  • android throw exception 原理,Android Throw Exception

    It depends if this Close can throw an exception then it still needs to be declared as being thrown or caught Often times
  • grid常用属性及属性值介绍

    文章目录 前言 一 grid布局是什么 二 常用简写 必会 2 1 grid 2 2 gap grid gap 2 3 grid area 2 4 grid template 2 5 place content 2 6 place item
  • 1359: [Baltic209]Candy

    题目链接 题目大意 tan90 题解 不存在的 我的收获 如何快速升级
  • protobuf与protoc-gen-go

    什么是protobuf Protobuf Protocol Buffer 是google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了多种语言的实现 java c c go 和 python 每一种实现都包含了相应语
  • Jmeter接口测试+压力测试

    jmeter是apache公司基于java开发的一款开源压力测试工具 体积小 功能全 使用方便 是一个比较轻量级的测试工具 使用起来非常简单 因为jmeter是java开发的 所以运行的时候必须先要安装jdk才可以 jmeter是免安装的
  • OkHttp的使用之{RequestBody、FormBody、MultipartBody}

    目录 0 相关文章 1 POST请求 1 1 RequestBody json数据提交 1 2 FromBody 表单提交 这种能满足大部分的需求 1 3 MultipartBody 文件上传 1 4 图片下载 文件下载 0 相关文章 Ok