Retrofit通过POST提交JSON数据、图片文件
前言:最近做的项目采用了retrofit框架,但是遇到了传图片和json数据的需求,就不会用了,经过长时间的搜索与亲身测试,终于将这两种需求的处理方式都学会了,现在分享给大家,也用于自己记录,万一哪天忘了怎么用,再拿出来温习一下。这也是2016年最后一篇博客。
提交json数据
准备:
androidstudio,最新的Retrofit,如果用的是eclipse就进去下载jar,解析方面自己研究吧,添加如下依赖到module的Gradle中 compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'io.reactivex:rxjava:1.1.9'
compile 'io.reactivex:rxandroid:1.2.1'复制代码
,最后准备好你的model类,组装好了的,开车。。
1、现在我有个需求是添加一条数据,还要用户的key验证,请求如下处理
,先写api: public interface IAddPicBase{
@Multipart
//@Headers({MEDIA_TYPE_JsonHeader, MEDIA_TYPE_JsonHeaderAccept})//这一行很多网友都加上了,我加上出错,删了就好了 各位自行测试吧 @Query("key") String key,
@POST(UrlManager.AddPicBaseUrl)
Observable addPicBase( @PartMap Map params);
}复制代码
然后, Map params = new HashMap<>();
params.put("key", RequestBody.create(MediaType.parse(Constant.MEDIA_TYPE_Text), ((AddInMineActivity) getActivity()).getKey()));
Gson gson = new Gson();
params.put("parameter", RequestBody.create(MediaType.parse(Constant.MEDIA_TYPE_Json), gson.toJson(addPicModel)));// 格式一点也不能错
Observer observer = new Observer() {
@Override
public void onCompleted(){
}
@Override
public void onError(Throwable e){
}
@Override
public void onNext(AddSupply addSupply){
}
};
//下面这些可能跟各位使用的封装不同,没关系,只要调用api里传参正确就行,错不了的 ,因为retrofit是类型安全的。。
RetrofitUtil upload = new RetrofitUtil(UrlManager.commonUrl2);
Retrofit retrofit = upload.getRetrofit();
IAddPicBase iAddPicBase = retrofit.create(IAddPicBase.class);
subscription = iAddPicBase.addPicBase(params).//((AddInMineActivity) getActivity()).getKey()
subscribeOn(Schedulers.io())//在子线程请求网络
.observeOn(AndroidSchedulers.mainThread())//在主线程处理UI显示
.subscribe(observer);//在主线程处理的逻辑通过RxJava的观察者处理
注: final public static String MEDIA_TYPE_Text = "text/plain";
final public static String MEDIA_TYPE_Json = "application/json;charset=utf-8";复制代码
提交图片
准备工作跟前面一样。。我看了一下代码,其实套路一样,只不过多图上传有新套路,见代码,一张图自然不用for循环,但是参数名要有数组的那种形式比如pic[0], Map params = new HashMap<>();
params.put("key", RequestBody.create(MediaType.parse(Constant.MEDIA_TYPE_Text), ((AddInMineActivity) getActivity()).getKey()));
for (int i = 0; i < toUpPathList.size(); i++) {
String path = toUpPathList.get(i);
File file = ImageUtils.compressImage(getContext(), path);
if (file != null && file.exists()) {
params.put("pic[" + i + "]" + Constant.ParamFile + file.getName(), RequestBody.create(MediaType.parse(Constant.MEDIA_TYPE_JPEG), file));// 格式一点也不能错
}
}
注:final public static String MEDIA_TYPE_JPEG = "image/jpeg";复制代码
有问题欢迎评论,一起搞事情。