24

我正在使用 OKHTTP 3.x 版本。我想发布多个参数,并想在循环中添加参数。我知道在 2.x 版本中,我可以使用 FormEncodingBuilder 并在循环中向其中添加参数,然后从中创建一个请求正文。但是在 3.x 中,该类已被删除。

这是我当前的代码:

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

现在我想添加 5 个参数,但在一个循环中,即通过在循环中构建 formbody 来创建请求体。就像我上面写的那样,我知道如何在 OKHTTP 2.x 版中做到这一点,但我使用的是 3.x 版。

任何帮助或指导表示赞赏。

提前致谢

4

4 回答 4

36

这是我的做法:

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();
于 2016-05-23T10:47:13.117 回答
17

进口

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

代码:

// 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();
于 2016-02-26T19:59:49.963 回答
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();
}
于 2016-05-19T21:25:09.393 回答
0

我不确定,但您可以尝试类似的方法:

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

您的其余代码似乎不错。希望它会工作:)!

于 2016-01-16T12:04:09.707 回答