为什么这样? (使用字符串Namevaluepairs和StringBuilder)

时间:2013-04-22 22:31:46

标签: java android http post

我最近看到了一个示例代码,它首先创建了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字符串!

3 个答案:

答案 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();