2016-01-16 10 views
12

Sto usando la versione 3.x di OKHTTP. Voglio pubblicare più parametri e vorrei aggiungere i parametri in un ciclo. So che nella versione 2.x, posso usare FormEncodingBuilder e aggiungere parametri ad esso in loop e poi da esso creare un corpo di richiesta. Ma in 3.x, la classe è stata rimossa.Come inviare i parametri del post dinamicamente (o in loop) in OKHTTP 3.x in Android?

Ecco il mio codice corrente:

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

Ora voglio aggiungere 5 params ma in un ciclo vale a dire creare richiesta corpo con la costruzione di formbody in un ciclo. Come ho scritto sopra, so come farlo nella versione 2.x di OKHTTP ma sto usando la versione 3.x.

Qualsiasi aiuto o guida è apprezzato.

Grazie in anticipo

+0

Non l'ho ancora fatto, ma per la prima volta puoi creare JsonObject contenente 5 Params e passare quel singolo JsonObject alla tua forma. Body è una se sembra formaBody accetta Object. – VVB

risposta

21

Ecco come lo faccio:

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(); 
0

non sono sicuro, ma si può provare qualcosa di simile:

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

il resto del codice sembra buono. Spero che funzionerà :)!

+0

Non funziona, già provato. FormBody.Builder non restituisce un RequestBody. Tipi incompatibili. :( –

11

Importazioni

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

Codice:

// 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(); 
1

Ecco la mia versione

/** 
* <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(); 
}