25

I am using OKHTTP 3.x version. I want to post multiple parameters and would like to add the params in a loop. I know that in version 2.x , I can use FormEncodingBuilder and add params to it in loop and then from it create a request body. But In 3.x , the class has been removed.

Here is my current code :

RequestBody formBody = new FormBody.Builder()
            .add("Param1", value1)
            .add("Param2", value2)
            .build();
Request request = new Request.Builder()
            .url("url")
            .post(formBody)
            .build();

Now I want to add 5 params but in a loop i.e create request body by building formbody in a loop. Like I wrote above, I know how to do it in OKHTTP version 2.x but I am using version 3.x.

Any help or guidance is appreciated.

Thanks in Advance

1
  • I have not done any hands-on this but first time you can make JsonObject containing 5 Params & pass that single JsonObject to your formBody be a se it seems formBody accepts Object. Commented Jan 16, 2016 at 14:28

4 Answers 4

38

Here's how I do it:

FormBody.Builder formBuilder = new FormBody.Builder()
        .add("key", "123");

// dynamically add more parameter like this:
formBuilder.add("phone", "000000");

RequestBody formBody = formBuilder.build();

Request request = new Request.Builder()
                .url("https://aaa.com")
                .post(formBody)
                .build();
Sign up to request clarification or add additional context in comments.

Comments

18

Imports

import okhttp3.OkHttpClient;
import okhttp3.FormBody;
import okhttp3.Request;
import okhttp3.RequestBody;

Code:

// HashMap with Params
HashMap<String, String> params = new HashMap<>();
params.put( "Param1", "A" );
params.put( "Param2", "B" );

// Initialize Builder (not RequestBody)
FormBody.Builder builder = new FormBody.Builder();

// Add Params to Builder
for ( Map.Entry<String, String> entry : params.entrySet() ) {
    builder.add( entry.getKey(), entry.getValue() );
}

// Create RequestBody
RequestBody formBody = builder.build();

// Create Request (same)
Request request = new Request.Builder()
        .url( "url" )
        .post( formBody )
        .build();

Comments

1

Here's my version

/**
 * <strong>Uses:</strong><br/>
 * <p>
 * {@code
 * List<Pair<String, String>> pairs = new ArrayList<>();}
 * <br/>
 * {@code pairs.add(new Pair<>("key1", "value1"));}<br/>
 * {@code pairs.add(new Pair<>("key2", "value2"));}<br/>
 * {@code pairs.add(new Pair<>("key3", "value3"));}<br/>
 * <br/>
 * {@code postToServer("http://www.example.com/", pairs);}<br/>
 * </p>
 *
 * @param url
 * @param pairs List of support.V4 Pair
 * @return response from server in String format
 * @throws Exception
 */
public String postToServer(String url, List<Pair<String, String>> pairs) throws Exception {
    okhttp3.OkHttpClient client = new okhttp3.OkHttpClient();
    okhttp3.Request.Builder builder = new okhttp3.Request.Builder().url(url);

    if (pairs != null) {
        okhttp3.FormBody.Builder postData = new okhttp3.FormBody.Builder();
        for (Pair<String, String> pair : pairs) {
            postData.add(pair.first, pair.second);
        }
        builder.post(postData.build());
    }
    okhttp3.Request request = builder.build();
    okhttp3.Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) {
        throw new IOException(response.message() + " " + response.toString());
    }
    return response.body().string();
}

Comments

0

I am not sure but you can try something like that :

RequestBody formBody = new FormBody.Builder();
for(...;...;...) {
   formBody.add(...)
}
formBody.build();

the rest of your code seems good. Hope it will work :) !

1 Comment

It does not work, already tried. FormBody.Builder does not return a RequestBody. Incompatible types. :(

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.