![](/img/trans.png)
[英]Difference between HashMap<String,String> and List<NameValuePair>
[英]Cast String to List<NameValuePair>
我基本上是想將List<NameValuePair>
傳遞給處理Android應用上的POST HTTPRequest的外部類。
String[] args = new String[]{"http://url/login", nameValuePairs.toString()}; //nameValuePairs is a param list to send via POST
Log.i("params", nameValuePairs.toString());
try {
String text = new rest().execute(args).get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ASyncTask的doInBackgroud接收兩個參數(請求的URL和nameValuePairs.toString()的結果),我找不到將字符串轉換回List <NameValuePair>的方法。
有任何想法嗎?
我為您提供了一個示例,說明如何通過POST或GET使用REST服務,將List <NameValuePair>設置為參數,然后將響應解析為一個字符串,然后該字符串可以用作您的對象(JSON,XML或數據框)
import java.io.*;
import java.util.*;
import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.entity.*;
import org.apache.http.client.methods.*;
import org.apache.http.client.utils.*;
import org.apache.http.impl.client.*;
import org.apache.http.message.*;
public class RESTHelper {
private static final String URL_POST = "http://url/login";
private static final String URL_GET = "http://url/login";
public static String connectPost(List<BasicNameValuePair> params){
String result = "";
try{
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost(URL_POST);
request.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if(entity != null){
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
}
}catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
public static String connectGet(List<BasicNameValuePair> params){
String result = "";
try{
String finalUrl = URL_GET + URLEncodedUtils.format(params, null);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(finalUrl);
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if(entity != null){
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
}
}catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
除非您編寫了某種分解已知格式的轉換器,否則不能這樣,例如, nvp[0].name=xxx, nvp[0].value=zzz
等。或重新構造默認的toString輸出(不是好玩)。
通常,您將使用JSON,XML等代替List.toString
。
或使用實際的HTTP客戶端庫。
如果執行這樣的代碼:
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
....
List<NameValuePair> h = new ArrayList<NameValuePair>();
h.add(new BasicNameValuePair("a", "b"));
h.add(new BasicNameValuePair("c", "d"));
Log.d("jj", h.toString());
您可以看到輸出類似於: [a=b, c=d]
因此您可以編寫一個解析器(或使用split()
)來還原列表。 但是,我認為依靠ArrayList和NameValuePair中的toString的實現並使用另一種序列化方法(例如Dave所說的JSON)不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.