-1

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

4

3 回答 3

2

使用NameValuePairs 的代码更通用。getQuery是可重用的,并且与传递给它的对完全无关。

如果您将设计(和语法)排除在外,那么您的第一个选择是等效的。您建议的第二种选择将不起作用,因为它会转义=s 和&s 以及参数。

于 2013-04-22T22:37:53.237 回答
1

我认为这真的是关于可读性和可重用性。您看到的原始代码比您建议的单个内联字符串连接更具可读性。小而简洁的语句传递给灵活的方法。此外,在原始版本中,由于名称和值作为单独的字段保存,因此如果需要,该名称 List 可以用于其他用途,而您的内联方法是单一用途的。

这两段代码的性能应该完全相同。当您查看 Java 编译器对字符串连接所做的操作时,它实际上会实例化一个 StringBuilder 本身来执行类似于原始代码的连接。

于 2013-04-22T22:41:02.693 回答
0

从性能的角度来看并不重要,因为始终存在少量 HTTP 参数。

我个人喜欢这种方式:

 new Uri.Builder()
.scheme("http")
.authority("foo.com")
.path("someservlet")
.appendQueryParameter("param1", foo)
.appendQueryParameter("param2", bar)
.build();
于 2013-04-22T22:35:36.043 回答