目录

  • 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组合的一种用法相关推荐

  1. 递归法:计算m个A,n个B可以组合成多少种排列问题?

    问题:计算m个A,n个B可以组合成多少种排列问题? 假设:计算3个A,2个B可以组合成多少种排列问题? 举例:AAABB BABAA- 方法:采取分割思想将第一个与后面的分开,划分为两部分,变得好解决 ...

  2. 组合问题,用1元纸币兑换1分,2分和5分硬币,要求兑换总数为50枚,问组合方式多少种?

    组合问题,用1元纸币兑换1分,2分和5分硬币,要求兑换总数为50枚,问组合方式多少种? JavaScript编写 function hm2(){var num=100;var sum=0;var a= ...

  3. Java提高篇 —— Java关键字之static的四种用法

    一.前言 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一 ...

  4. vue中$refs的三种用法

    我们都知道,在vue2中获取DOM元素,可以直接在元素上绑定ref属性,然后获取到DOM元素的属性值,这种方法在vue3 中仍然可以使用,但也会有一些问题.下面就介绍$refs的三种用法: 1.vue ...

  5. 面向对象篇(OOP)--05 Java中static关键字的四种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  6. 正则表达式-问号的四种用法

    正则表达式-问号的四种用法 原文符号 因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\? 有无量词 问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次. 非贪婪 ...

  7. vue3.0中setup使用(两种用法)

    这篇文章主要介绍了vue3.0中setup使用,本文通过两种用法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一.setup函数的特性以及作用 可以确定的是 V ...

  8. Android Intent的几种用法全面总结

    Android Intent的几种用法全面总结 Intent, 用法 Intent应该算是Android中特有的东西.你可以在Intent中指定程序要执行的动作(比如:view,edit,dial), ...

  9. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示.  比如 SELECT * FROM [user ...

最新文章

  1. Json返回时间中出现乱码问题的两种解决方法
  2. vue-element-admin 1.4问题及解决方案
  3. MOCTF-Web-机器蛇
  4. jfinal java类型和数据库类型_java下JFinal getModel方法及数据库使用出现问题解决教程...
  5. poj 3728(LCA + dp)
  6. 【蓝桥杯官网试题 -算法训练】素因子去重(数学,数论,因子约数)
  7. 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
  8. Linux学习笔记---使用BusyBox创建根文件系统(四)
  9. CISCO路由器连接ADSL之PPPoE配置
  10. Microsoft Visio 画图遇到的问题及解决办法
  11. NC65销售订单功能导入
  12. 「 Matlab 」矩阵运算讲解
  13. CentOS安装最新版本curl
  14. POI操作Microsoft Office 之 操作PPT简单示例(附源码)
  15. VTracer - 将图片转化为矢量 SVG 图形的免费开源工具
  16. debezium报错处理系列七:The database history couldn‘t be recovered. Consider to increase the value for datab
  17. windows内网的情况下如何访问外网
  18. 房价下跌的“理由”越来越多
  19. 怎么看网站是否被黑防止网站被黑
  20. 2068. 整数拼接

热门文章

  1. CS:APP二进制炸弹phase5
  2. 中台之上(三):战略和组织结构,业务架构设计中不应被忽视的关键因素
  3. linux shell if参数---markx
  4. 普通人怎样投资区块链
  5. cad怎么画坐标系箭头_cad怎么插入箭头?cad插入箭头方法
  6. C# 结束进程的解决方法
  7. 2021威海高考成绩查询电话,2021威海高考成绩查询系统
  8. 一个统计Word文档中行数的VBA例程
  9. 聊聊订单系统的设计?看这篇就够了!
  10. 搭建基于DataX的可视化界面