Android 表单同时上传文件和数据

本文讲述了作者在使用Retrofit进行接口调用时,遇到上传表单和JSON参数的问题,如何通过解析HashMap转换为RequestBody,最终解决500错误,并提供关键代码片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

retrofit注解

@Multipart
@POST("requesturl")
 Observable<ResponseBody> upload(@PartMap Map<String, RequestBody> map);

在和后台对接接口的时候,是表单类型 传入参数和图片。 其中一个参数是json格式。当时我一直在用ftpMap.toString 作为value,结果就是一直报错 500 Internal Server Error “Message”:"此资源不支持请求实体的媒体类型。然后从网上这篇博客找到下一篇博客。整整弄了一个下午,简直令人火大。好在最后还是解决了 所以有问题一直要和同事仔细对接一下,不然就是大海捞针。吐血。

HashMap<String, Object> ftpMap = new HashMap<>();
ftpMap.put("xxx", xxx);
            
File fileSign = new File(localPath);
if (fileSign.exists()) {//获取文件,存在就上传
Map<String, RequestBody> map = new HashMap<>();

map.put("ftpMap", RequestBody.create(MediaType.parse("text/plain"), new Gson().toJson(ftpMap).toString()));
map.put("xxx", RequestBody.create(MediaType.parse("text/plain"), "123123123"));
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), fileSign);
map.put("file\";filename=\"" + fileSign.getName(), requestBody);

RetrofitFactory.getInstance().getRetrofit()
                        .create(Interface.class)
                        .upload(map)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Observer<ResponseBody>() {

                            @Override
                            public void onSubscribe(Disposable d) {
                            }

                            @Override
                            public void onNext(ResponseBody s) {
                            }

                            @Override
                            public void onError(Throwable e) {
                            }

                            @Override
                            public void onComplete() {
                            }
                        });
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值