1

我基本上是在尝试将 a 传递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> 的方法。

有任何想法吗?

4

3 回答 3

3

我为您提供了一个示例,说明如何通过 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();
}

}
于 2013-04-16T23:06:55.533 回答
1

您不能,除非您编写某种转换器来分离已知格式,例如nvp[0].name=xxx, nvp[0].value=zzz等,或重新构造默认的 toString 输出(不好玩)。

通常你会使用 JSON、XML 等而不是List.toString.

或者使用实际的 HTTP 客户端库。

于 2013-04-16T22:29:51.740 回答
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())来恢复列表。不过我觉得依赖 ArrayList 和 NameValuePair 中 toString 的实现,使用另一种序列化方式,比如 Dave 说的 JSON 并不是一个好主意。

于 2013-04-16T22:44:12.373 回答