-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));

それを別のメソッドに渡して、1 つの文字列に変換します。

    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

sを使用するコードNameValuePairはより一般的です。getQuery再利用可能で、渡されたペアに完全に依存しません。

式から設計 (および構文) を除外すると、最初の選択肢は同等になります。あなたが提案した2番目の代替案は、パラメーターとともにs と sをエスケープするため、機能しません。=&

于 2013-04-22T22:37:53.237 に答える
1

これは本当に読みやすさと再利用性に関するものだと思います。あなたが見た元のコードは、あなたが提案する単一のインライン文字列連結よりもはるかに読みやすいです。柔軟なメソッドに渡される小さくて簡潔なステートメント。さらに、元の名前と値は別々のフィールドとして保持されているため、必要に応じてその名前のリストを他のものに再利用できますが、インライン メソッドは単一の目的です。

2 つのコードは、まったく同じパフォーマンスになるはずです。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 に答える