在Android应用中使用POST数据提交表单

时间:2010-06-08 18:00:29

标签: android forms post android-intent

我一直在网上寻找一种方法来做这个约一个星期了,我似乎无法弄明白。

我正在尝试实施一个应用程序,我的学院可以使用该应用程序让用户轻松登录校园内的各种服务。它目前的工作方式是进入在线门户,选择他们想要的服务,填写用户名和密码,然后点击登录。表单数据通过post(它包含几个隐藏的值以及用户名和pwd)发送到相应的登录脚本,然后登录它们并加载服务。

我一直试图以两种方式解决问题。我首先尝试了一个WebView,但似乎并不想支持通常使这个表单工作的所有html。我得到了我需要的所有元素,用户和密码的字段以及登录按钮,但点击按钮不会做任何事情。我想知道我是否需要为它添加一个onclick处理程序,但是我无法看到如何在webview的html中实现该按钮而不使用单独的android元素。

另一种可能性是使用xml小部件以一个漂亮的相对布局创建表单,这似乎加载更快,并在Android屏幕上看起来更好。我使用EditText字段作为输入,使用服务选择的微调框小部件和登录的按钮小部件。我知道如何分别为按钮和微调器创建onclick和项目选择处理程序,但我无法弄清楚如何通过POST发送该数据,然后启动浏览器。我可以使用操作网址执行操作,但无法将POST数据输入其中。

所以这就是我现在所拥有的......

HttpParams params = new BasicHttpParams();
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost(action);
String endResult = null;

try 
{
post.setEntity(new UrlEncodedFormEntity(myList));
} 
catch (UnsupportedEncodingException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} 

try 
{
String response = client.execute(post, new BasicResponseHandler());
endResult = response;
} 
catch (ClientProtocolException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
} 
catch (IOException e) 
{
// TODO Auto-generated catch block
e.printStackTrace();
}  

所以现在我的问题是...如何使用endResult屏幕,该屏幕应该是我登录服务后返回的页面,并在浏览器中显示?

2 个答案:

答案 0 :(得分:4)

使用内置浏览器他们有什么问题?您还可以使用UrlEncodedFormEntity和HttpClient提交表单。

HttpParams params = new DefaultHttpParams(); // setup whatever params you what
HttpClient client = new DefaultHttpClient(params);
HttpPost post = new HttpPost("someurl");
post.setEntity(new UrlEncodedFormEntity()); // with list of key-value pairs
client.execute(post, new ResponseHandler(){}); // implement ResponseHandler to handle response correctly.

好的,并且在字符串中有响应之后。自页面起的响应将以html格式显示。您需要使用WebView来显示html。 WebView有一个方法loadData(),它接受一个html字符串并显示它。

答案 1 :(得分:1)

基于@RobbyPonds的回答,为了徘徊在这里的人们的利益,下面是一个发布和接收来自URI的响应的通用实现(注意还包含等待实现以返回响应,可能不是每天都在实施网络通话):

private static String responseValue;

@SuppressWarnings({ "unchecked", "rawtypes" })  
public static String sendPostToTargetAndWaitForResponse() throws ClientProtocolException, IOException {     
    final Thread currentThread = Thread.currentThread();
    synchronized (currentThread) {      

        HttpParams params = new BasicHttpParams();
        HttpClient client = new DefaultHttpClient(params);
        HttpPost post = new HttpPost(HTTP_POST_URI);

        // List Creation with post data for UrlEncodedFormEntity
        ArrayList<NameValuePair> mList = new ArrayList<NameValuePair>();
        mList.add(new NameValuePair() {

            @Override
            public String getValue() {
                return getSampleJSON();
            }

            @Override
            public String getName() {
                return "json";
            }
        });
        post.setEntity(new UrlEncodedFormEntity(mList)); // with list of key-value pairs
        client.execute(post, new ResponseHandler(){

            @Override
            public Object handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
                responseValue = EntityUtils.toString(response.getEntity(), "UTF-8");
                synchronized (currentThread) {                          
                    currentThread.notify();
                }
                return null;
            }
        }); 
        try {
            currentThread.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return responseValue;
    } 
}