2013-04-16 2 views
1

Я в основном пытаюсь передать List<NameValuePair> внешнему классу, который обрабатывает POST HTTPRequest в приложении для Android.Листинг String to List <NameValuePair>

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

doInBackgroud из AsyncTask получает два параметра (URL-адрес для запроса и результат nameValuePairs.toString()), и я не могу найти способ, чтобы преобразовать строку обратно в список < пар имя>.

Любые идеи?

ответ

3

Я приведу вам пример использования ресурсов REST POST или GET, задает список < 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(); 
} 

} 
1

Вы не можете, если только не пишете какой-то конвертер, который отделяет известный формат, например nvp[0].name=xxx, nvp[0].value=zzz и т. Д., Или реструктурирует вывод toString по умолчанию (не забавно).

Обычно вы используете JSON, XML и т. Д. Вместо List.toString.

Или используйте фактическую клиентскую библиотеку HTTP.

+0

Итак, могу ли я передать JSONObject.toString(), а затем преобразовать его в список? Есть ли функция для этого? –

1

Если выполнить следующий код:

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()) для восстановления Список. Однако я считаю, что не стоит полагаться на реализацию toString в ArrayList и NameValuePair и использовать другой метод сериализации, например JSON, как сказал Дэйв.