Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在PartMap中使用Retrofit和WebKitFormBoundary将文件发送到服务器

在PartMap中使用Retrofit和WebKitFormBoundary将文件发送到服务器
EN

Stack Overflow用户
提问于 2017-12-31 12:56:27
回答 1查看 1.1K关注 0票数 1

我有一个由邮递员生成的查询,用于将文件和一些信息发送到我的服务器。它在我的程序中运行得很好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
        RequestBody body = RequestBody.create(mediaType,
                "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"filename\"; filename=\"C:\\testFile.doc\"\r\nContent-Type: application/msword\r\n\r\n\r\n" +
                        "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"id\"\r\n\r\n7\r\n" +
                        "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\n3\r\n" +
                        "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"note\"\r\n\r\nafejhejfh\r\n" +
                        "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][id]\"\r\n\r\n1\r\n" +
                        "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][is_checked]\"\r\n\r\n0\r\n" +
                        "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][filename]\"; filename=\"C:\\test.pdf\"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--");

改造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Headers({"Accept: application/json", "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"})
@POST("api/save")
Call<SaveResponse> save(@Header("Authorization") String authorization,
                                   @Body RequestBody map);

第一次面对with边界,需要将上面的示例更改为动态创建的Partmap。因为需要在循环中添加来自另一个列表的一些参数。我尝试用下面的例子生成partmap,并像在api文档中写的那样将"WebKitFormBoundary7MA4YWxkTrZu0gW“添加到头文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  --header 'Authorization: {{authorization}}' \
  --header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \

下面的代码从服务器返回422错误

查询映射。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, RequestBody> requestMap = new HashMap<>();

RequestBody file = null;
if (file != null) {
    file = RequestBody.create(MediaType.parse("application/msword"), testFile);
    requestMap.put("filename", file);
}

RequestBody id = RequestBody.create(MediaType.parse("text/plain"), "18");
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "3");
RequestBody notes = RequestBody.create(MediaType.parse("text/plain"), notesTextArea.getText());
RequestBody list0id = RequestBody.create(MediaType.parse("text/plain"), "1");
RequestBody list0is_checked = RequestBody.create(MediaType.parse("text/plain"), "0");


RequestBody pdfFilename = null;
if (pdfFile != null) {
    pdfFilename  = RequestBody.create(MediaType.parse("application/pdf"), pdfFile);
    requestMap.put("list[0][filename]", pdfFilename );
}

requestMap.put("file", file);
requestMap.put("id", id);
requestMap.put("type", type);
requestMap.put("notes", notes);
requestMap.put("list[0]id", list0id);
requestMap.put("list[0]is_checked", list0is_checked);

改造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  @Multipart
    @Headers({"Accept: application/json", "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"})
    @POST("api/save")
    Call<SaveResponse> save(@Header("Authorization") String authorization,
                                       @PartMap Body map);

因此,我需要任何帮助来理解如何将WebKitFormBoundary7MA4YWxkTrZu0gW和其他需要的信息放到我的零件图中。

提前感谢您的帮助

附注:新年快乐的程序员)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-05 09:46:35

所以我用这种方式解决了这个问题

向我的服务器发出请求。request without header "content-type: multipart/form-data;接口文档中描述的boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"“。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Multipart
    @Headers({"Accept: application/json"})
    @POST("api/save")
    Call<SaveResponse> save(@Header("Authorization") String authorization,
                                       @PartMap Map<String, RequestBody> map,
                                       @Part List<MultipartBody.Part> files);

动态填充我们的查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  private void fillQuery() {

        fileListPart = new ArrayList<>();
        MultipartBody.Part filePart = null;
        if (mainFile != null) {
            if (mainFile.getName().endsWith(".pdf")) {
                filePart = MultipartBody.Part.createFormData("filename", mainFile.getName(), RequestBody.create(MediaType.parse("application/pdf"), mainFile));
            } else if (mainFile.getName().endsWith(".doc") || mainFile.getName().endsWith(".docx")) {
                filePart = MultipartBody.Part.createFormData("filename", mainFile.getName(), RequestBody.create(MediaType.parse("application/msword"), mainFile));
            }
            fileListPart.add(filePart);
        }

        requestBodyMap = new HashMap<>();
        RequestBody id = RequestBody.create(MediaType.parse("text/plain"), "id");
        RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "type");
        RequestBody notes = RequestBody.create(MediaType.parse("text/plain"), "notes");

        requestBodyMap.put("id", id);
        requestBodyMap.put("type", type);
        requestBodyMap.put("notes", notes);

        for (int i = 0; i < dynamicCollectionWirhParameters.size(); i++) {
            String prefix = "list[";
            String checkIdParameter = "][id]";
            String checkIsCheckedParameter = "][is_checked]";
            String checkFileParameter = "][filename]";

            RequestBody checklist_id = RequestBody.create(MediaType.parse("text/plain"), "2");//id
            RequestBody is_checked = RequestBody.create(MediaType.parse("text/plain"), "1"); // server convert 1 and 0 to boolean value
            requestBodyMap.put(prefix + i + checkIdParameter, checklist_id);
            requestBodyMap.put(prefix + i + checkIsCheckedParameter, is_checked);

            if (dynamicCollectionFileCollection.get(i) != null) {
                File tempFile = dynamicCollectionFileCollection.get(i);
                filePart = null;
                if (tempFile.getName().endsWith(".pdf")) {
                    filePart = MultipartBody.Part.createFormData(prefix + i + checkFileParameter, dynamicCollectionFileCollection.get(i).getName(), RequestBody.create(MediaType.parse("application/pdf"), dynamicCollectionFileCollection.get(i)));
                } else if (dynamicCollectionFileCollection.get(i).getName().endsWith(".doc") || dynamicCollectionFileCollection.get(i).getName().endsWith(".docx")) {
                    filePart = MultipartBody.Part.createFormData(prefix + i + checkFileParameter, dynamicCollectionFileCollection.get(i).getName(), RequestBody.create(MediaType.parse("application/msword"), dynamicCollectionFileCollection.get(i)));
                }
                fileListPart.add(filePart);
            }
        }

    }

并将我们的数据发送到服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void saveDatas() {
        fillQuery();

        Call<SaveResponse> sendDatasCall = DependenciesStorage.getRetrofitService().save(
                DependenciesStorage.getAuthorizationKey(),
                requestBodyMap, fileListPart);

        sendDatasCall.enqueue(new Callback<SaveResponse>() {
            @Override
            public void onResponse(Call<SaveResponse> call, Response<SaveResponse> response) {
                if (response.isSuccessful()) {

                  } else {

                 }
            }

            @Override
            public void onFailure(Call<SaveResponse> call, Throwable throwable) {
            }
        });

    }

看起来很简单)但是我花了几乎两天的时间才找到它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48042641

复制
相关文章
Android网络编程(十)Retrofit2后篇[注解]
前言 在上一篇Android网络编程(九)Retrofit2前篇[基本使用]中我们了解了Retrofit的最基本的GET方式访问网络的写法以及请求参数的简单介绍。这一篇我们来详细的了解Retrofit
用户1269200
2018/02/01
1.1K0
Android网络编程(十)Retrofit2后篇[注解]
Retrofit 使用笔记
在使用retrofit之前,你需要导入retrofit gsonconverter这些库。详情可以查看相关资料。https://github.com/square/retrofit ,现在出到最新的版本是2.4.0.
ppjun
2018/09/05
5460
深入浅出Retrofit2.x(二)
大家在和服务交互的时候,大多情况下都应该使用的是 GET、POST 请求吧,下面我们就对 POST 各种数据类型及如何定义接口进行说明。
程序员飞飞
2020/02/29
1.4K0
Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤5:创建 网络请求接口实例 并 配置网络请求参数 步骤6:发送网络请求(异步 / 同步)
Carson.Ho
2022/01/21
3.6K0
Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
Retrofit初探和简单使用
Retrofit简单介绍 Retrofit是Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客户端。它是基于注解,提供 JSON to POJO(Plain Ordin
非著名程序员
2018/02/09
7200
Retrofit初探和简单使用
安卓上如何优雅地使用网络请求丨深入浅出Retrofit2.x(二)
大家在和服务交互的时候,大多情况下都应该使用的是 GET、POST 请求吧,下面我们就对 POST 各种数据类型及如何定义接口进行说明。
程序员飞飞
2022/05/09
1.1K0
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤5:创建 网络请求接口实例 并 配置网络请求参数 步骤6:发送网络请求(异步 / 同步)
Carson.Ho
2019/02/22
3.3K0
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) - 简书
步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤5:创建 网络请求接口实例 并 配置网络请求参数 步骤6:发送网络请求(异步 / 同步)
用户2802329
2018/08/07
9.4K0
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) - 简书
springboot配合retrofit上传图片文字 完整教学
请先阅读https://www.cnblogs.com/tylerdonet/p/5722858.html。 为了验证,我特意用fiddler模拟了一次文件上传请求。 请求中要上传的信息有:{"auth": "qq", "openId": "...", "accessToken": "...", "wallpaper": "(图片文件)"}。 以下是请求的header和body的截图:
平凡的学生族
2019/05/25
2.1K0
Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)[通俗易懂]
步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤5:创建 网络请求接口实例 并 配置网络请求参数 步骤6:发送网络请求(异步 / 同步)
全栈程序员站长
2022/07/28
2.2K0
Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)[通俗易懂]
使用 iptables 将 Kubernetes Service 流量随机发送到 Pod
本文将带大家了解 Kubernetes 的 kube-proxy 组件如何使用 iptables 将 service 流量随机发送到 Pod,目的是实现 service 所需的 iptables 规则。
CNCF
2021/04/21
1.7K0
Retrofit解析2之使用简介
前面介绍完RESTful之后,我们先来初步认识下Retrofit的使用"姿势"。本文的主要内容如下:
隔壁老李头
2018/08/30
4.9K0
Retrofit解析2之使用简介
【译】Retrofit 2 - 如何从服务器下载文件
如果你在阅读本文前没有写过任何一行Retrofit请求代码,那么最好看一下前面几篇博客。对于很多Retrofit使用者来说:定义一个下载文件的请求与其他请求几乎无异:
小鄧子
2018/08/20
2.3K0
【转-干货】Retrofit2.0使用总结及注意事项
随着Google对HttpClient 摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retrofit则对okHttp进行了强制依赖。Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,如果看源码会发现其实质上就是对okHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类封装了网络接口请求的底层,其将请求返回javaBean,对网络认证 REST API进行了很好对支持此,使用Retrofit将会极大的提高我们应用的网络体验。
代码咖啡
2018/08/28
5.5K0
Retrofit使用OkHttp保存和添加cookie
Retrofit的cookie的保存和添加都可以用Interceptor来实现 下面是接收请求中返回并保存cookie的代码示例:
夏洛克的猫
2018/10/18
1.7K0
Android MVP+RxJava+Retrofit (2) RxJava+Retrofit
说道RxJava+Retrofit 的组合 大家基本不陌生,先介绍一下Retrofit Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。说白了真正工作的还是OkHttp 。
全栈程序员站长
2022/06/29
7480
Android MVP+RxJava+Retrofit (2) RxJava+Retrofit
使用JClouds在Java中获取和发布云服务器
本文中,我们举例来说明如何使用JClouds API 获取和发布云服务器。JClouds API 可以和大量云服务提供商(包括Amazon EC2和Rackspace)协同工作并且允许使用Java代码执行大量操作。换句话说,JClouds API不是针对某些提供商所特定接口去进行交互。下面我们以Rackspace所提供的云服务为例进行说明。
Techeek
2018/01/15
2.5K0
使用JClouds在Java中获取和发布云服务器
使用JClouds在Java中获取和发布云服务器
本文中,我们举例来说明如何使用JClouds API 获取和发布云服务器。JClouds API 可以和大量云服务提供商(包括Amazon EC2和Rackspace)协同工作并且允许使用Java代码执行大量操作。换句话说,JClouds API不是针对某些提供商所特定接口去进行交互。下面我们以Rackspace所提供的云服务为例进行说明。
小芬达
2018/01/16
6.4K1
使用JClouds在Java中获取和发布云服务器
点击加载更多

相似问题

使用PartMap Retrofit 2上传多个文件

12

Retrofit2 -无法使用PartMap上载文件

219

Kotlin (Android)中的Multipart request with Retrofit @PartMap错误

3191

使用Retrofit 2.0.0将多个文件发送到服务器

10

安卓系统中PartMap与部件在Retrofit2中的区别

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文