2010-08-12 34 views
42

我想完成一些非常簡單的事情,但是我沒有找到關於此的好文檔。我有一個webView,我需要加載一個需要POST數據的頁面。看起來像一個簡單的過程,但我找不到在webView中顯示結果的方法。Android Webview POST

的方法應該是簡單的:

查詢(用POST數據) - >網絡服務器 - > HTML響應 - >網頁視圖。

我可以使用DefaultHttpClient提交數據,但無法在WebView中顯示。

有什麼建議嗎?

,不勝感謝

解決方案

private static final String URL_STRING = "http://www.yoursite.com/postreceiver"; 

    public void postData() throws IOException, ClientProtocolException { 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("foo", "12345")); 
     nameValuePairs.add(new BasicNameValuePair("bar", "23456")); 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(URL_STRING); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 
     String data = new BasicResponseHandler().handleResponse(response); 
     mWebView.loadData(data, "text/html", "utf-8"); 
    } 

回答

15

試試這個:

private static final String URL_STRING = "http://www.yoursite.com/postreceiver"; 

public void postData() throws IOException, ClientProtocolException { 

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("foo", "12345")); 
    nameValuePairs.add(new BasicNameValuePair("bar", "23456")); 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(URL_STRING); 
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    HttpResponse response = httpclient.execute(httppost); 

} 

我建議做這個作爲的AsyncTask的一部分,之後更新的WebView

+0

我有一段代碼與此非常相似,但我不知道如何將此與WebView關聯起來。如果它不是太麻煩,你可以使用這段代碼發佈一個WebView的片段嗎?謝謝 – 2010-08-13 13:17:20

+0

一旦你有了這些數據,你只想在「WebView」中顯示結果,還是希望用戶繼續點擊鏈接?我相信一旦你從'String'加載數據,你就無法與之交互。詳細闡述一下。;-) – TJF 2010-08-13 13:29:25

+0

我真正想做的是提交POST數據做一個頁面,然後向用戶顯示生成的頁面 – 2010-08-13 14:10:24

2

如果使用從一開始的WebView可以工作?

帶有一個HTML/js的Web視圖,它會自動顯示結果。

+0

我該怎麼做? – 2010-08-12 20:14:40

142

兩種方法來加載在網頁視圖後響應:

  1. webview.loadData() :就像您在解決方案中發佈的內容。但是「通過此機制加載的內容不具備從網絡加載內容的能力」。

  2. webview.postUrl():如果發佈響應需要從網絡加載內容,請使用此項。 (注:僅由API-5級,這意味着沒有機器人1.6或更低訪問)


String postData = "username=my_username&password=my_password"; 
webview.postUrl(url,EncodingUtils.getBytes(postData, "BASE64")); 

(來源:http://www.anddev.org/other-coding-problems-f5/webview-posturl-postdata-t14239.html

+0

我認爲這是更好的方法。但是,如何上傳圖像文件?這可以用這種方法完成嗎? – leninyee 2011-08-29 05:29:06

+8

@tarkeshwar令人難以置信。 SO是充滿了漫長和[繁瑣](http://stackoverflow.com/questions/1652850/android-webview-cookie-problem/2349340#2349340)一半的解決方案,需要[單獨](http:// stackoverflow。 (cookie/to-a-webview-in-android/5717294#5717294)cookie處理和管理,並且在這裏你發佈了一個解決方案,它僅包含2行。我會投你+100,但是隻允許+1。恕我直言,這應該是被接受的答案。謝謝你爲我節省了很多時間! – ateiob 2011-08-30 00:44:22

+2

非常優雅的答案。 – Tomasz 2012-03-03 12:49:43

11

我使用webView.loadData()做客戶端後,它會顯示URL的內容,我的代碼:

public static void webview_ClientPost(WebView webView, String url, Collection< Map.Entry<String, String>> postData){ 
    StringBuilder sb = new StringBuilder(); 

    sb.append("<html><head></head>"); 
    sb.append("<body onload='form1.submit()'>"); 
    sb.append(String.format("<form id='form1' action='%s' method='%s'>", url, "post")); 
    for (Map.Entry<String, String> item : postData) { 
     sb.append(String.format("<input name='%s' type='hidden' value='%s' />", item.getKey(), item.getValue())); 
    } 
    sb.append("</form></body></html>"); 

    webView.loadData(sb.toString(), "text/html", "UTF-8");  
} 

使用功能webview_ClientPost():

Map<String, String> mapParams = new HashMap<String, String>();  
mapParams.put("param1", "111"); 
mapParams.put("param2", "222"); 

Collection<Map.Entry<String, String>> postData = mapParams.entrySet(); 

webview_ClientPost(webView1, "http://www.yoursite.com/postreceiver", postData); 
+0

'org.apache.http.util.EncodingUtils'已被棄用,所以這是最好的解決方案 – Lokesh 2016-01-06 06:45:21