2010-08-12 6 views
42

J'essaie d'accomplir quelque chose de très simple, mais je n'ai trouvé aucune bonne documentation à ce sujet. J'ai un webView, et j'ai besoin de charger une page qui nécessite des données POST. Cela ressemble à un processus simple, mais je n'arrive pas à trouver un moyen d'afficher le résultat dans un WebView.Android Webview POST

Le processus doit être simple:

requête (avec des données POST) -> webserver - réponse> HTML -> WebView.

Je peux soumettre des données en utilisant un DefaultHttpClient, mais cela ne peut pas être affiché dans un WebView.

Des suggestions?

Beaucoup Merci

Solution

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"); 
    } 

Répondre

15

Essayez ceci:

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); 

} 

Je recommande de faire cela dans le cadre d'une AsyncTask et mise à jour du WebView après

+0

J'ai un morceau de code assez similaire à celui-ci, mais je n'ai aucune idée de comment relier cela avec un WebView. Si ce n'est pas trop de problèmes, pourriez-vous poster un extrait d'un WebView en utilisant ce morceau de code? Merci –

+0

Une fois que vous avez les données, voulez-vous simplement afficher les résultats dans 'WebView', ou voulez-vous que l'utilisateur continue à cliquer sur des liens? Je crois qu'une fois que vous chargez des données d'un 'String' vous ne pouvez pas interagir avec lui. Elaborer un peu plus.;-) – TJF

+0

Tout ce que je veux vraiment faire est de soumettre des données POST faire une page, puis afficher la page résultante à l'utilisateur –

2

Si vous utilisez un WebView dès le départ pourrait-il fonctionner?

Un Webview avec un html/js qui fait le POST, et affiche naturellement le résultat.

+0

Comment est-ce que je ferais cela? –

142

Deux façons de charger réponse post dans WebView:

  1. webview.loadData() : Comme ce que vous avez posté dans votre solution. Mais "le contenu chargé par ce mécanisme n'a pas la capacité de charger du contenu à partir du réseau".

  2. webview.postUrl(): Utilisez cette option si la réponse à une publication doit charger du contenu à partir du réseau. (NOTE: uniquement accessible de api niveau 5, ce qui signifie pas d'androïde 1,6 ou inférieur)


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

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

+0

Je pense que c'est la meilleure façon de le faire. Mais qu'en est-il de télécharger un fichier image? Pourrait-il être fait avec cette méthode? – leninyee

+8

@tarkeshwar Incroyable. Le SO est plein de solutions à demi-cuites longues et [encombrantes] (http://stackoverflow.com/questions/1652850/android-webview-cookie-problem/2349340#2349340) qui nécessitent [séparé] (http: // stackoverflow. com/questions/5716898/set-a-cookie-to-a-webview-in-android/5717294 # 5717294) gestion et gestion des cookies, et voilà que vous venez, poster une solution qui fait tout cela avec 2 lignes seulement. Je vous aurais voté +100 mais SO ne permet que +1. À mon humble avis ceci devrait être la réponse acceptée. Merci de m'avoir sauvé beaucoup de temps! – ateiob

+2

Grande et élégante réponse. – Tomasz

11

J'utilise webView.loadData() pour faire poste client, et il affichera le contenu de l'URL, mon code:

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");  
} 

, utilisez la fonction 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' est déconseillé, c'est donc la meilleure solution – Lokesh