最近项目里用到了类似图文上传的功能,以前都是封装OkHttp的文件上传功能,这次想换个姿势,想用Retrofit2.0实现这样的功能,本来以为挺简单的,没想到进入了深坑,连续调整了好几种姿势都报了同一个错,接着网上类似的文章找了一大推,讲得都是模棱两可,或者对多参数格式不够友好,最后还是去看了相关的源码,自己把这个问题提出来解决了,在这里记录一下。
一、定义网络请求接口
public interface GoodsReturnApiService {
@Multipart
@POST(Compares.GOODS_RETURN_POST) //这里是自己post文件的地址
Observable postGoodsReturnPostEntitys(@PartMap Map map, @Part List parts);
}
上面定义了一个接口用于上传文件请求,有几个注解需要说明一下, @Multipart这是Retrofit专门用于文件上传的注解,需要配合@POST一起使用。
方法postGoodsReturnPostEntitys(@PartMap Map map, @Part List parts)第一个参数使用注解@PartMap用于多参数的情况,如果是单个参数也可使用注解@Part。
在类型Map中,Map第一个泛型String是服务器接收用于文件上传参数字段的Key,第二个泛型RequestBody是OkHttp3包装的上传参数字段的Value,这也是图文上传成功的关键所在。在后面会具体说到。
第二个参数使用注解@Part用于文件上传,