Retrofit 通过 POST 提交 JSON 数据、多图片多文件上传

4,869 阅读2分钟
原文链接: www.jianshu.com

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<AddSupply> addPicBase( @PartMap Map<String, RequestBody> params);
}

然后,

 Map<String, RequestBody> 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<AddSupply> observer = new Observer<AddSupply>() {
        @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<String, RequestBody> 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";

有问题欢迎评论,一起搞事情。