1

我需要发送一个带有重复参数名称的 POST 请求,例如“param=a¶m=b”。

覆盖 Request.getParams() 不起作用,因为 Map 不能有重复的键,所以只会发送一个值。

我知道我可以重写 Request 类以使用 Map 或 Map>,但是如果有任何其他不需要更改库的方法,我就会徘徊。

提前致谢。

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() 而无需修改库。

F

所以我创建了以下帮助类:

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

然后在我扩展请求的类中,我覆盖了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 回答
0

嘿,我刚刚在谷歌小组问题中回答了你,但我想我也会把它贴在这里以防万一有人先来这里..

Map 确实不支持重复,但是你可以做这样的事情。你不必重写 getBody(),只是我假设你已经在做的 getParams。

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();;
            params.putAll(AddArrayParams());

            return params;
        }






public  Map<? extends String, ? extends String> AddArrayParams() {
    Map<String, String> params = new HashMap<String, String>();

  // figure that if its an array and the data is sent as [0],[1] then lets just send it up that way
                 params.put("param[0]","a");
                     params.put("param[1]","b");
                     params.put("param[3]","c");
                    ////etc

    return params;
}

祝你好运

于 2014-05-06T19:50:51.717 回答