Retrofit @Multipart@PartMap@Part组合的一种用法
目录
- 1、应用场景
- 2、实现
- 2.1、api的声明写法
- 2.2、实际调用
- 3、总结
1、应用场景
有这样一个需求:要实现附件与字符串参数同时提交请求。
附件可能是多个,字符串参数也可能是多个。
2、实现
2.1、api的声明写法
只实现多文件上传,处理方式如下:
@Multipart@POST("api/uploadFile")fun uploadFiles(@Part parts: List<MultipartBody.Part>): Call<ResponseBody>
实现多文件上传及多字符串参数组合形式,处理方式如下:
@Multipart@POST("api/uploadRecord")fun uploadRecord(@PartMap inspectionBean: Map<String, @JvmSuppressWildcards RequestBody>,@Part imgs: List<MultipartBody.Part>,@Part videos: List<MultipartBody.Part>): Call<ResponseBody>
2.2、实际调用
实现多文件上传及多字符串参数组合形式,实际调用如下:
//selectedImageFilePaths 组装文件对象列表private var selectedImageFilePaths: ArrayList<File> = ArrayList()private var selectedVideoFilePaths: ArrayList<File> = ArrayList()val map = HashMap<String, RequestBody>()map["id"] = toRequestBody(bean!!.id)map["content"] = toRequestBody(bean!!.content)val result :ResponseBody = uploadRecord(map,filesToMultipartBodyParts("imgs", selectedImageFilePaths)!!,filesToMultipartBodyParts("videos", selectedVideoFilePaths)!!,deleteFiles)//输出val jsonStr = String(result.bytes())println(jsonStr)
toRequestBody子函数:
private fun toRequestBody(value: String): RequestBody {return RequestBody.create(MediaType.parse("text/plain"), value)}
filesToMultipartBodyParts子函数(将File转成MultipartBody.Part):
private fun filesToMultipartBodyParts(name: String,files: List<File>): List<MultipartBody.Part>? {if (files == null) {return null}val parts: MutableList<MultipartBody.Part> =ArrayList(files.size)for (file in files) {val requestBody = RequestBody.create(MediaType.parse("*/*"), file)val part =MultipartBody.Part.createFormData(name, file.name, requestBody)parts.add(part)}return parts}
在api声明处我们需要的参数是RequestBody类型的,所以需要将字符串转成RequestBody类型,子函数作用也在于此。
3、总结
关键字:
@PartMap:
不支持直接与@FormUrlEncoded同时使用,所以需要单独注意字符串编码问题,主要是采用@PartMap是采用"binary"方式进行传输的。
支持多个ResponseBody方式传输。
@Part:单个ResponseBody方式传输。
RequestBody:存放请求信息的对象,如header等信息
MultipartBody.Part:多文件上传时要求的格式,继承RequestBody这个类。
@JvmSuppressWildcards:用来注解类和方法,使得被标记元素的泛型参数不会被编译成通配符,kotlin需要添加。
Retrofit @Multipart@PartMap@Part组合的一种用法相关推荐
- 递归法:计算m个A,n个B可以组合成多少种排列问题?
问题:计算m个A,n个B可以组合成多少种排列问题? 假设:计算3个A,2个B可以组合成多少种排列问题? 举例:AAABB BABAA- 方法:采取分割思想将第一个与后面的分开,划分为两部分,变得好解决 ...
- 组合问题,用1元纸币兑换1分,2分和5分硬币,要求兑换总数为50枚,问组合方式多少种?
组合问题,用1元纸币兑换1分,2分和5分硬币,要求兑换总数为50枚,问组合方式多少种? JavaScript编写 function hm2(){var num=100;var sum=0;var a= ...
- Java提高篇 —— Java关键字之static的四种用法
一.前言 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一 ...
- vue中$refs的三种用法
我们都知道,在vue2中获取DOM元素,可以直接在元素上绑定ref属性,然后获取到DOM元素的属性值,这种方法在vue3 中仍然可以使用,但也会有一些问题.下面就介绍$refs的三种用法: 1.vue ...
- 面向对象篇(OOP)--05 Java中static关键字的四种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...
- 正则表达式-问号的四种用法
正则表达式-问号的四种用法 原文符号 因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\? 有无量词 问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次. 非贪婪 ...
- vue3.0中setup使用(两种用法)
这篇文章主要介绍了vue3.0中setup使用,本文通过两种用法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一.setup函数的特性以及作用 可以确定的是 V ...
- Android Intent的几种用法全面总结
Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...
- mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user ...
最新文章
- Json返回时间中出现乱码问题的两种解决方法
- vue-element-admin 1.4问题及解决方案
- MOCTF-Web-机器蛇
- jfinal java类型和数据库类型_java下JFinal getModel方法及数据库使用出现问题解决教程...
- poj 3728(LCA + dp)
- 【蓝桥杯官网试题 -算法训练】素因子去重(数学,数论,因子约数)
- 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
- Linux学习笔记---使用BusyBox创建根文件系统(四)
- CISCO路由器连接ADSL之PPPoE配置
- Microsoft Visio 画图遇到的问题及解决办法
- NC65销售订单功能导入
- 「 Matlab 」矩阵运算讲解
- CentOS安装最新版本curl
- POI操作Microsoft Office 之 操作PPT简单示例(附源码)
- VTracer - 将图片转化为矢量 SVG 图形的免费开源工具
- debezium报错处理系列七:The database history couldn‘t be recovered. Consider to increase the value for datab
- windows内网的情况下如何访问外网
- 房价下跌的“理由”越来越多
- 怎么看网站是否被黑防止网站被黑
- 2068. 整数拼接