【⽹络】Retrofit2POST(参数传递和⽂件上传)
tjstudy: 写在前⾯
环境 :android 2.1.1,Retrofit2
个⼈使⽤总结
1、导⼊Retrofit 所需要的包
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'fit2:retrofit:2.1.0'
compile 'fit2:converter-gson:2.1.0'
compile 'fit2: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⽂件的时候,数组名不能⼀致,否则会覆 盖。
android retrofit3、上传单⽂件
4、上传多⽂件
5、上传⽂件和参数 参数也需要封装成MultipartBody.Part这样的类型,不然传递会出错,这个类型其实就是将这些数据封装成表单的
类型,因为在这⾥不能使⽤FormUrlEncoded进⾏处理
/**
* ⽹络访问接⼝
*/
public interface APIService {
//1、
@FormUrlEncoded
@POST("test.php")
Observable<ResponseBody> login(
@Field("no") String no,
@Field("pass") String pass);
/
/2、
@Multipart
@POST("upload.php")
Observable<ResponseBody> uploadFile(
@Part("file\"; filename=\"test.png") RequestBody file
);
//3、
@Multipart
@POST("upload.php")
Observable<ResponseBody> uploadFile(
@Part MultipartBody.Part file );
/
/4、
@Multipart
@POST("upload.php")
Observable<ResponseBody> uploadFile(
@Part() List<MultipartBody.Part> files );
//5、
@Multipart
@POST("upload.php")
Observable<ResponseBody> uploadFile(
@Part() List<MultipartBody.Part > files );
}
MultipartBody是okhttp3的⼀个⽅法,在okhttp2⾥⾯不存在。
3、 Post ⽅式说明
⽅式1 只需要对应的传⼊String就可以了,⽅式2 忽略
其他的,则需要经过MultipartBody.part的封装
MultipartBody.part的封装
1) 对⽂件的封装:
File file = new ExternalStorageDirectory()
.getAbsolutePath() + "/Pictures/test111.png");
RequestBody requestBody =
//参数1数组名,参数2⽂件名。
MultipartBody.Part photo1part =
ateFormData("pic1", "pic2", requestBody1); php收到的数据如下图:
上传多个⽂件,则会有多个这样的数组
2) 对参数的封装:
MultipartBody.Part no =
ateFormData("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 =
ateFormData("name", “tjstudy”);
MultipartBody.Part pass =
ateFormData("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⾥⾯。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论