2016-01-16 9 views
12

Używam wersji OKHTTP 3.x. Chcę opublikować wiele parametrów i chciałbym dodać parametry w pętli. Wiem, że w wersji 2.x mogę używać FormEncodingBuilder i dodawać do niego parametry w pętli, a następnie utworzyć z niego treść żądania. Ale w 3.x klasa została usunięta.Jak przesłać parametry postu dynamicznie (lub w pętli) w OKHTTP 3.x w Androidzie?

Tu jest mój bieżący kod:

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

Teraz chcę dodać 5 params ale w pętli t j tworzyć żądania ciało budując formbody w pętli. Jak napisałem powyżej, wiem, jak to zrobić w wersji OKHTTP 2.x, ale używam wersji 3.x.

Każda pomoc lub wskazówki są mile widziane.

Dzięki z gory

+0

Nie zrobiłem tego w żaden sposób, ale po raz pierwszy możesz zrobić JsonObject zawierający 5 Params i przekazać ten pojedynczy JsonObject do twojego FormBody, który wydaje się, że FormBody akceptuje Object. – VVB

Odpowiedz

21

Oto jak to zrobić:

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

Nie jestem pewien, ale można spróbować coś takiego:

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

reszta kodu wydaje się dobre. Mam nadzieję, że to zadziała :)!

+0

To nie działa, już wypróbowane. FormBody.Builder nie zwraca RequestBody. Niezgodne typy. :( –

11

Import

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

Kod:

// 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

Oto moja wersja

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