为了跟进,我使用
QueryMap
和一些技巧解决了这个问题。基本上,我将我的
NameValuePair
列表转换为一个HashMap,我会检查是否已经有该键,如果有,我就将相同键的新值附加到旧值上。所以实质上(key, value) 将变成 (key, value&key=value2)。这样当构建查询字符串时,我将获得所需的key=value&key=value2。为了使它工作,我需要自己处理值的编码,以便我包含在值中的额外&和=不被编码。
所以,
HashMap
从
List
构造如下:
public static HashMap<String, String> getPathMap(List<NameValuePair> params) {
HashMap<String, String> paramMap = new HashMap<>();
String paramValue;
for (NameValuePair paramPair : params) {
if (!TextUtils.isEmpty(paramPair.getName())) {
try {
if (paramMap.containsKey(paramPair.getName())) {
paramValue = paramMap.get(paramPair.getName());
paramValue += "&" + paramPair.getName() + "=" + URLEncoder.encode(String.valueOf(paramPair.getValue()), "UTF-8");
} else {
paramValue = URLEncoder.encode(String.valueOf(paramPair.getValue()), "UTF-8");
}
paramMap.put(paramPair.getName(), paramValue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
return paramMap;
}
那么我的请求看起来像这样:
@GET("/api/")
List<Repo> listRepos(@QueryMap(encodeValues=false) Map<String, String> params)
我的服务请求看起来像这样:
// Get the list of params for the service call
ArrayList<NameValuePair> paramList = getParams();
// Convert the list into a map and make the call with it
Map<String, String> params = getPathMap(paramList);
List<Repo> repos = service.listRepos(params);
我最初尝试使用Path
解决方案,尝试手动构建查询字符串,但是在查询字符串中不允许使用替换块,因此我选择了这个QueryMap方案。希望这对遇到同样问题的其他人有所帮助!