【问题标题】:How to send List of integers along with image in retrofit2 using Multipart如何使用Multipart在retrofit2中发送整数列表和图像
【发布时间】:2020-01-29 22:17:27
【问题描述】:

我正在尝试使用改造 2.0 上传图像。我几乎没有其他参数要与包含整数列表的表单数据一起发送。我的请求声明是

@Multipart
@POST("/api/Add")
    Call<AddResponse> addApi(@Part("Id") RequestBody id,
                             @Part("Name") RequestBody name,
                             @Part("Description") RequestBody description,
                             @Part("Phone") RequestBody phone,
                             @Part MultipartBody.Part logo,
                             @Part("WorkingDays") RequestBody workingDays,
                             @Part("CitiesIDs") RequestBody cities);
public class RetrofitService {

    private static Retrofit retrofit;
    private static final Object LOCK = new Object();
    private static final String BASE_URL = "https://baseurl.app";

    public static Retrofit getRetrofitInstance() {

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.addInterceptor(chain -> {
            Request original = chain.request();

            Request.Builder requestBuilder = original.newBuilder()
           .addHeader("Content-Type", "application/json");

            Request request = requestBuilder.build();
            return chain.proceed(request);
        });

        OkHttpClient client = httpClient.build();

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        httpClient.addInterceptor(logging);
        httpClient.readTimeout(60, TimeUnit.SECONDS);
        httpClient.connectTimeout(60, TimeUnit.SECONDS);
        if (retrofit == null) {
            synchronized (LOCK) {
                retrofit = new retrofit2.Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .client(client)
                        .addConverterFactory(ScalarsConverterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(httpClient.build())
                        .build();
            }
        }

        return retrofit;
    }

这种方式无法按预期工作,单独发送的整数列表如下所示。

Content-Disposition: form-data; name="CitiesIDs"
Content-Transfer-Encoding: binary
Content-Type: multipart/form-data; boundary=290d2964-526a-48b9-b742-c6a3b547c7d6
Content-Length: 286
--290d2964-526a-48b9-b742-c6a3b547c7d6
Content-Disposition: form-data; name="CitiesIDs"
Content-Length: 1
7
--290d2964-526a-48b9-b742-c6a3b547c7d6
Content-Disposition: form-data; name="CitiesIDs"
Content-Length: 1
8
--290d2964-526a-48b9-b742-c6a3b547c7d6--

另外,将整数列表转换为我使用的 RequestBody

okhttp3.MultipartBody.Builder citiesRequestBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);

  for(int i=0; i<citiesIdList.size(); ++i){
  citiesRequestBodyBuilder.addFormDataPart("CitiesIDs", String.valueOf(citiesIdList.get(i)));
   }

由于添加表单数据部分方法addFormDataPart 只接受字符串,所以我必须将整数转换为字符串,使服务器响应以下消息

 {"Success":false,
  "ErrorMessage":"Input string '--290d2964-526a-48b9-b742-c6a3b547c7d6' is not a valid number. Path '', line 1, position 38.",
 "Id":0}

邮递员,工作正常 那么如何使用 Multipart 发送图像和整数列表。

问题是RequestBody 只接受 File, byte[], String, ByteString 我如何发送带有@part 的整数列表。

感谢您的帮助。

【问题讨论】:

  • 你遇到什么错误了吗?
  • 使用retrofit2向服务器发送图像和整数列表的正确方法是什么?
  • 第一个是正确的方法
  • 添加你的api调用类,请求正文截图和错误日志。
  • @RajasekaranM 问题已更新

标签: android retrofit2 multipart


【解决方案1】:

您必须仅对文件使用 MultipartBody.Part,其他字段应使用 RequestBody。

删除下面的代码

for(int i=0; i<citiesIdList.size(); ++i){
  citiesRequestBodyBuilder.addFormDataPart("CitiesIDs", String.valueOf(citiesIdList.get(i)));
   }

使用

 // Add other field here
RequestBody description =
            RequestBody.create(
                    okhttp3.MultipartBody.FORM, Gson().toJson(citiesIdList));

【讨论】:

  • 它像Content-Disposition: form-data; name="CitiesIDs" Content-Transfer-Encoding: binary Content-Type: multipart/form-data; boundary=5247b2e1-b3ce-409d-bc3b-78c3b9d7fe63 Content-Length: 168 --5247b2e1-b3ce-409d-bc3b-78c3b9d7fe63 Content-Disposition: form-data; name="CitiesIDs" Content-Length: 5 [2,5]' but it gives error {"Success":false,"ErrorMessage":"输入字符串'--5247b2e1-b3ce-409d-bc3b-78c3b9d7fe63'不是一个有效数字。路径' ',第 1 行,位置 38。","Id":0}`
  • 你能查一下futurestud.io/tutorials/…吗?
  • 是的,我用它来上传图片,问题用邮递员截图更新
  • 使用请求正文而不是okhttp3.MultipartBody.Builder
  • 就像RequestBody citiesRequestBody = RequestBody.create("CitiesIDs", new Gson().toJson(cities)); 给了 create(string, string) 错误
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多