1

「param=a¶m=b」のように、パラメータ名が重複する POST リクエストを送信する必要があります。

Map は重複するキーを持つことができないため、 Request.getParams() のオーバーライドは機能せず、1 つの値のみが送信されます。

Map または Map> を使用するように Request クラスを書き直すことができることはわかっていますが、ライブラリを変更する必要のない他の方法がないか探していました。

前もって感謝します。

PS: volley-users グループに同じ質問を提出しました: https://groups.google.com/forum/#!topic/volley-users/tFRclnEbpAk

4

2 に答える 2

3

Ficus Kirkpatrick が volley-users グループ ( https://groups.google.com/d/msg/volley-users/tFRclnEbpAk/uiC2f9nAIgkJ )に関する私の質問に答えました。

ライブラリを変更せずに getBody() をオーバーライドできます。

そこで、次のヘルパー クラスを作成しました。

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HttpParams extends HashMap<String, List<String>> {

    private static final long serialVersionUID = 1L;

    public HttpParams() {
        super();
    }

    public HttpParams(int capacity) {
        super(capacity);
    }

    public HttpParams(Map<String, List<String>> map) {
        super(map);
    }

    public HttpParams(int capacity, float loadFactor) {
        super(capacity, loadFactor);
    }

    /*
     * This is the method to use for adding post parameters
     */
    public void add(String key, String value) {
        if (containsKey(key)) {
            get(key).add(value);
        }
        else {
            ArrayList<String> list = new ArrayList<String>();
            list.add(value);
            put(key, list);
        }
    }

    /**
     * Converts the Map into an application/x-www-form-urlencoded encoded string.
     */
    public byte[] encodeParameters(String paramsEncoding) {
        StringBuilder encodedParams = new StringBuilder();
        try {
            for (Map.Entry<String, List<String>> entry : entrySet()) {
                String key = URLEncoder.encode(entry.getKey(), paramsEncoding);
                for (String value : entry.getValue()) {
                    encodedParams.append(key);
                    encodedParams.append('=');
                    encodedParams.append(URLEncoder.encode(value, paramsEncoding));
                    encodedParams.append('&');
                }
            }
            return encodedParams.toString().getBytes(paramsEncoding);
        } catch (UnsupportedEncodingException uee) {
            throw new RuntimeException("Encoding not supported: " + paramsEncoding,     uee);
        }
    }
}

次に、Request を拡張するクラスで getBody() をオーバーライドしました。

    @Override
    public byte[] getBody() throws AuthFailureError {
        if (mParams != null && mParams.size() > 0) {
            return mParams.encodeParameters(getParamsEncoding());
        }
        return null;
    }
于 2013-11-16T17:06:40.930 に答える