今天看在 Apache
的 HttpClient
时,看到一个 BasicnameValuePair
觉得奇怪,明明有现成的 Map 来存储键值对,为啥偏偏用 List<BasicnameValuePair>
这种莫名其妙的东西呢,稍微了解了一下才发现
1 简单使用
BasicNameValuePair 通常用于在 Http 请求中封装用于 post 的参数名称与参数值。
常见的应用如下图:
public String httpPost(Map<String, String> requestParams, String urlEncode) {
HttpPost httpPost = null;
String resp = "";
try {
// 参数设置
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> entry : requestParams.entrySet()) {
params.add(new BasicNameValuePair((String) entry.getKey(),
(String) entry.getValue()));
}
httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params, urlEncode));
HttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200)
{
return null;
}
HttpEntity httpEntity = response.getEntity();
resp = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (httpPost != null) {
httpPost.abort();
}
}
return resp;
}
UrlEncodedFormEntity 的源码如下图:
2 使用 BasicNameValuePair 而不使用 Map 的原因
UrlEncodedFormEntity
的构造器只接受 List<? extends BasicNameValuePair>
等作为参数,不接受 Map
要想封装 post 请求的参数,只能使用 List<BasicNameValuePair>
3 参考资料
1、Difference between HashMap<String,String>
and List<NameValuePair>
https://stackoverflow.com/questions/24646644/difference-between-hashmapstring-string-and-listnamevaluepair