我最近看到了一个示例代码,它首先创建了NameValuePair对象并填充它:
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("Param1", param1));
params.add(new BasicNameValuePair("Param2", param2));
params.add(new BasicNameValuePair("Param3", param3));
然后将其传递给另一个方法,将其转换为一个字符串:
private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException
{
StringBuilder result = new StringBuilder();
boolean first = true;
for (NameValuePair pair : params)
{
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}
return result.toString();
}
在我看来,我可以从这样做得到同样的结果:
String query = "";
query += URLEncoder.encode("Param1", "UTF-8") + "=" + URLEncoder.encode(Param1, "UTF-8")
query += "&" + URLEncoder.encode("Param2", "UTF-8") + "=" + URLEncoder.encode(Param2, "UTF-8")
query += "&" + URLEncoder.encode("Param2", "UTF-8") + "=" + URLEncoder.encode(Param2, "UTF-8")
我的代码会起作用吗?如果不是,为什么?如果是的话,那么以另一种方式做这件事有什么好处呢?
我意识到前者允许你传递任意数量的NVP,但我只是证明了在构建NVP所用的相同行数中,我能够构建整个POST字符串!
答案 0 :(得分:2)
使用NameValuePair
的代码更通用。 getQuery
是可重用的,并且对传递给它的对完全不可知。
如果你将设计(和语法)排除在等式之外,那么你的第一个选择是等价的。
您建议的第二个替代方案是 NOT ,因为它会使=
和&
s以及参数一起转义。
答案 1 :(得分:1)
我认为这实际上是关于可读性和可重用性。您看到的原始代码比您建议的单个内联字符串连接更具可读性。简明扼要的陈述传递给灵活的方法。此外,在原始文件中,由于名称和值保存为单独的字段,因此如果需要,可以将名称List重用于其他内容,而内联方法则是单一用途。
两段代码应该是完全相同的性能。当您查看Java编译器对字符串连接所做的操作时,它实际上会实例化StringBuilder本身以进行类似于原始代码的连接。
答案 2 :(得分:0)
无关紧要,因为总是有少量的HTTP参数。
我个人喜欢这样:
new Uri.Builder()
.scheme("http")
.authority("foo.com")
.path("someservlet")
.appendQueryParameter("param1", foo)
.appendQueryParameter("param2", bar)
.build();