Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing arrays in multipart POST using Okhttp

Tags:

android

okhttp

I'm building an app that requires an API call that has array in its POST body request. I'm using OkHttp 2.6 to request for API.

The request in Postman looks like this:

postman-ss

I have tried several ways of writing RequestBody in order to achieve this,

  1. First method

    RequestBody requestBody = new MultipartBuilder()
            .type(MultipartBuilder.FORM)
            .addFormDataPart("app_token", MY_TOKEN)
            .addFormDataPart("user_id", 377)
            .addFormDataPart("group_id", String.valueOf(groupId))
            .addFormDataPart("key_id", deals.toString())
            .addFormDataPart("img", filename + ".jpg", fileBody)
            .build();
    
  2. Second method

    RequestBody requestBody = new MultipartBuilder()
            .type(MultipartBuilder.FORM)
            .addFormDataPart("app_token", MY_TOKEN)
            .addFormDataPart("user_id", 377)
            .addFormDataPart("group_id", String.valueOf(groupId))
            .addFormDataPart("key_id[0]", "33")
            .addFormDataPart("key_id[1]", "34")
            .addFormDataPart("img[0]", filename + ".jpg", fileBody)
            .build();
    
  3. Third method, which I found here.

    MediaType json = MediaType.parse("application/json; charset=utf-8");
    Map<String, Integer> params = new HashMap<>();
    for (int i = 0; i < deals.size(); i++) {
        params.put("key_id["+i+"]", Integer.valueOf(deals.get(i).getUid()));
    }
    JSONObject parameter = new JSONObject(params);
    RequestBody theBody = RequestBody.create(json, parameter.toString());
    
    
    RequestBody requestBodyyy = new MultipartBuilder()
            .type(MultipartBuilder.FORM)
            .addFormDataPart("app_token", MY_TOKEN)
            .addFormDataPart("user_id", 377)
            .addFormDataPart("group_id", String.valueOf(groupId))
            .addPart(theBody)
            .addFormDataPart("img[0]", filename + ".jpg", fileBody)
            .build();
    

But, none of them are working.

What is the correct way of doing this? I also need the array size to be dynamic as I'm not passing a static one.

like image 568
emen Avatar asked Oct 31 '25 12:10

emen


1 Answers

Heh, the solution seems easy. I've managed to solve this issue, so I'm gonna write here anyway for anyone seeking the same solution.

MultipartBuilder multipartBuilder = new MultipartBuilder()
        .type(MultipartBuilder.FORM)
        .addFormDataPart("token", MY_TOKEN)
        .addFormDataPart("user_id", user_id)
        .addFormDataPart("group_id", group_id)
        // .addFormDataPart("img[0]", filename + ".jpg", RequestBody.create(MediaType.parse("image/png"), file));

for (int i = 0; i < keys.size(); i++) {
    multipartBuilder.addFormDataPart("key_id[" + i + "]", keys.get(i));
}

for (int i = 0; i < files.size(); i++) {
    filename = Utils.getSimpleTimestamp();
    multipartBuilder.addFormDataPart("img[" + i + "]", filename + ".jpg", RequestBody.create(MediaType.parse("image/png"), files.get(i)));
}

RequestBody requestBody = multipartBuilder.build();
Request request = new Request.Builder()
        .url(API_URL)
        .post(requestBody)
        .addHeader("content-type", "multipart/form-data;")
        .build();

OkHttpClient okHttpClient = new OkHttpClient();
like image 152
emen Avatar answered Nov 03 '25 04:11

emen