2010-06-08 97 views
4

我一直在网上搜索一种方法来执行此操作大约一周,而我似乎无法弄清楚。在Android应用程序中使用POST数据提交表单

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

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

另一种可能性是使用xml小部件来创建一个漂亮的相对布局,这似乎加载速度更快,在android屏幕上看起来更好。我使用EditText字段作为输入,为服务选择使用微调控件,并使用登录按钮构件。我知道如何分别为button和spinner创建onclick和item select处理程序,但我无法弄清楚如何通过POST发送该数据,然后启动浏览器。我可以对动作url做一个意图,但不能获取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屏幕,这应该我登录到后返回的页面我服务,并显示在浏览器中?

+0

如果我不想打开一个浏览器上提交表单,而只是从服务器获取JSON响应,而在另一个活动显示它,我应该只是做client.execute(发布,新的BasicResponseHandler)如上? – Namratha 2013-01-17 05:53:16

回答

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并显示它。

+0

理想情况下,我试图在可以直接登录的主屏幕上添加小部件。我不知道HttpPost和UrlEncodedFormEntity。 我了解代码,直到你有“client.execute(”。什么是“客户端”参考? – datguywhowanders 2010-06-08 19:13:25

+0

已更新以扩展示例 – 2010-06-08 20:46:11

+0

在尝试了您的代码建议后更新,需要进行一些更改,ala try/catch块,并使用BasicResponseHandler()与原始类型ResponseHandler。 – datguywhowanders 2010-06-09 03:43:59

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; 
    } 
} 
相关问题