2010-06-08 119 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; 
    } 
} 
相關問題