web-dev-qa-db-fra.com

Comment envoyer des paramètres de publication dynamiquement (ou en boucle) dans OKHTTP 3.x sous Android?

J'utilise la version OKHTTP 3.x. Je souhaite publier plusieurs paramètres et souhaite ajouter les paramètres dans une boucle ... Je sais que, dans la version 2.x, je peux utiliser FormEncodingBuilder et y ajouter des paramètres en boucle, puis créer un corps de requête . Mais dans 3.x, la classe a été supprimée.

Voici mon code actuel :

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

Maintenant, je veux ajouter 5 paramètres, mais dans une boucle, c'est-à-dire créer un corps de requête en construisant formbody dans une boucle . .

Toute aide ou orientation est appréciée.

Merci d'avance

17
intellignt_idiot

Voici comment je le fais:

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();
27
fahrulazmi

Importations

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();
15
Nick B

Voici ma 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();
}
1
Kasim Rangwala

Je ne suis pas sûr mais vous pouvez essayer quelque chose comme ça: 

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

le reste de votre code semble bon… .. espérons que cela fonctionnera :)!

0
MaximeJannin