今天看在 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

本文介绍在使用Apache HttpClient发送POST请求时如何使用BasicNameValuePair封装参数。解释了为何采用List而非Map来存储参数,并提供了具体的实现代码。

8284

被折叠的 条评论
为什么被折叠?



