![](/img/trans.png)
[英]Parse NameValuePairs to String, then String to NameValuePairs
[英]Why do it this way? (use string Namevaluepairs and StringBuilder)
我最近看到了一个示例代码,该代码首先创建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字符串!
使用NameValuePair
的代码更为通用。 getQuery
是可重用的,并且与传递给它的对完全无关。
如果您不考虑设计(和语法),那么第一个选择是等效的。 你的建议是行不通的,因为它会逃走了第二个选择=
S和&
小号随着参数。
我认为这确实与可读性和可重用性有关。 您看到的原始代码比您建议的单个内联字符串连接更具可读性。 小而简洁的语句传递给灵活的方法。 另外,在原始版本中,由于名称和值保留在单独的字段中,因此如果需要,可以将名称List重复用于其他用途,而内联方法是单一用途。
这两段代码应该具有完全相同的性能。 当您查看Java编译器对字符串连接所做的操作时,它实际上会实例化StringBuilder本身以进行类似于原始代码的连接。
从性能的角度来看并不重要,因为HTTP参数始终很少。
我个人喜欢这种方式:
new Uri.Builder()
.scheme("http")
.authority("foo.com")
.path("someservlet")
.appendQueryParameter("param1", foo)
.appendQueryParameter("param2", bar)
.build();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.