如何在 android 中的 OKHTTP 3.x 中动态(或循环)发送 post 参数?

How to send post parameters dynamically (or in loop) in OKHTTP 3.x in android?

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

这是我当前的代码:

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

现在我想添加 5 个参数,但是在循环中,即通过在循环中构建表单体来创建请求主体。 就像我在上面写的那样,我知道如何在 OKHTTP 版本 2.x 中执行此操作,但我使用的是版本 3.x.

感谢任何帮助或指导。

提前致谢

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

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

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

进口

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

这是我的版本

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

这是我的做法:

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