【网络】Retrofit2 POST(参数传递和文件上传)
来源:互联网 发布:反潜鱼雷 知乎 编辑:程序博客网 时间:2024/05/01 20:38
tjstudy: 写在前面
环境 :android 2.1.1,Retrofit2
理解有误,待修改,貌似是php服务器端接收文件的方式有误。。。
链接跳转: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进行处理
/** * 网络访问接口 */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 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里面。
- 【网络】Retrofit2 POST(参数传递和文件上传)
- android使用HttpClient实现post get (和文件上传)
- c#上传数据参数和文件参数
- Okhttp3参数和文件同时上传
- httpclient模拟表单上传参数和文件
- Android网络编程—同时上传参数和文件到服务器
- Android网络编程—同时上传参数和文件到服务器
- Android网络编程—同时上传参数和文件到服务器
- Springmvc国际化和文件上传(八)
- MVC和文件上传
- web文件上传(三)--webapi后台接收参数和文件
- Android网络编程之请求和文件上传
- Android: 网络编程之Post传递参数
- 文件上传和文件下载
- Struts2国际化和文件上传
- ionic2拍照和文件上传
- github配置和文件上传
- 拦截器和文件上传
- 阅读源码的经验总结
- 自定义画板涂鸦
- VS2015 +EF6 连接MYSQL数据库生成实体
- Python文件操作之OS模块
- zookeeper运行环境2、3:单节点安装和伪分布式集群安装
- 【网络】Retrofit2 POST(参数传递和文件上传)
- Sublime Text 2如何在所有已打开的文件中查找
- TCP和UDP差异
- 聊天气泡框模块源码 (高仿微信、QQ聊天的气泡聊天框)
- java静态方法与成员方法及成员变量的区分
- swift代码之路(五)NSTimer
- Nagios 配置及监控
- Android6.0 wakelock深入分析
- CentOS 6.3安装配置LAMP服务器(Apache+PHP5+MySQL)