2013-11-15 90 views
1

我需要發送帶有重複參數名稱的POST請求,如「param = a & param = b」。帶有重複參數名稱的Google Volley請求

覆蓋Request.getParams()不起作用,因爲Map不能有重複鍵,所以只會發送一個值。

我知道我可以重寫Request類來使用Map或Map>,但如果有任何其他方式不需要更改庫,我就會徘徊。

在此先感謝。

PS:我已經申請了同樣的問題凌空用戶組:https://groups.google.com/forum/#!topic/volley-users/tFRclnEbpAk

回答

3

榕帕特里克回答我的問題凌空用戶組 (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); 
     } 
    } 
} 

,然後在我的類,它擴展請求我overrided的getBody():

@Override 
    public byte[] getBody() throws AuthFailureError { 
     if (mParams != null && mParams.size() > 0) { 
      return mParams.encodeParameters(getParamsEncoding()); 
     } 
     return null; 
    } 
0

嘿,我只是在谷歌組問題中回答你,但我想我也會在這裏發佈它,以防萬一有人來這裏..

確實地圖不支持重複但不過您可以做這樣的事情。你不必重寫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; 
} 

好運

+1

如果您在服務器端使用PHP這可能會實現,但我不知道這是否與Java或任何其他語言的工作。 – Paris