Retrofit 参数和文件一起传输(深坑)

链接跳转:http://blog.csdn.net/u012391876/article/details/52913805

个人使用总结

1、 导入Retrofit 所需要的包

compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'

这里推荐一个很好用的打印log的工具—KLOG 
导入包:

compile 'com.github.zhaokaiqiang.klog:library:1.5.0'
  •  

2、 网络访问接口类APIService

  • 1、普通的post参数
  • 2、上传文件 这种方式指定数组名为file,文件名是test.png,不方便使用。 多文件上传,使用@PartMap Map<String, RequestBody> params 要注意在设置每一个RequestBody文件的时候,数组名不能一致,否则会覆 盖。
  • 3、上传单文件
  • 4、上传多文件
  • 5、上传文件和参数 参数也需要封装成MultipartBody.Part这样的类型,不然传递会出错,这个类型其实就是将这些数据封装成表单的类型,因为在这里不能使用FormUrlEncoded进行处理
  •  

MultipartBody是okhttp3的一个方法,在okhttp2里面不存在。

3、 Post 方式说明

方式1 只需要对应的传入String就可以了,方式2 忽略 
其他的,则需要经过MultipartBody.part的封装 
MultipartBody.part的封装

  • 1) 对文件的封装:
File file = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/Pictures/test111.png");
RequestBody requestBody =
            RequestBody.create(MediaType.parse("image/png"), file);
//参数1 数组名,参数2 文件名。
MultipartBody.Part photo1part = 
            MultipartBody.Part.createFormData("pic1", "pic2", requestBody1);
  •  

php收到的数据如下图:

这里写图片描述

上传多个文件,则会有多个这样的数组

  • 2) 对参数的封装:
MultipartBody.Part no = 
            MultipartBody.Part.createFormData("name", “tjstudy”);
  •  

4、 方式1转变为MultipartBody.Part方式

可以理解为,MultipartBody.part是为了将参数封装为表单的样式。

@Multipart
@POST("test.php")
Observable<ResponseBody> login(
        @Part MultipartBody.Part no,
        @Part MultipartBody.Part pass);
MultipartBody.Part no = 
        MultipartBody.Part.createFormData("name", “tjstudy”);
MultipartBody.Part pass =
        MultipartBody.Part.createFormData("pass", “123456”);
  •  

之后进行网络访问,调用网络接口里面对应的方法就可以了(上面的这个login方法)

5、 又踩坑了(文件和参数一起上传)

  • 1) 参数上传:

    使用@Part(”no”)String no 访问网络,服务器端收到了这样的数据 
    “no”=””12345”” 多了一对引号 
    —–后使用,MultipartBody.Part,解决了问题

  • 2) 参数上传:

网上的另外一种方式,在post方式里面使用 
@Query(”no”)String no 
什么都没有上传成功,根本没有访问到网络。 
—-猜测,Query是Get方式的访问方式,应该是不会成功的。网上的少数博客也存在坑。

  • 3) 多文件上传-只上传了一个

Retrofit上传的时候,会将相关信息放到一个数组里面,只要数组名一样,就会存在文件被覆盖,只上传了一个文件。文件的上传,并不是像我理解的,是将一组文件存在一个json数据里面,每一个文件再以单独的一个对象存在。 
文件,数组名不能一样

6、使用总结

在只需要传递参数的时候,直接使用方式1(@FormUrlEncoded@Field(“no”) String no)就可以了,只要涉及到要上传文件,则需要使用@Multipart作为标记,并且要上传的文件和参数都需要封装到MultipartBody.part里面。

转载于:https://my.oschina.net/huangzhi1bo/blog/844298

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值