![](/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.