J'essaie d'accomplir quelque chose d'assez simple, mais je n'ai trouvé aucune bonne documentation à ce sujet. J'ai une webView et je dois y charger une page qui nécessite des données POST. Cela ressemble à un processus simple, mais je ne trouve pas de moyen d'afficher le résultat dans une webView.
Le processus doit être simple:
requête (avec POST) -> serveur Web -> réponse HTML -> WebView.
Je peux soumettre des données à l'aide d'un DefaultHttpClient, mais cela ne peut pas être affiché dans une WebView.
Aucune suggestion?
Merci beaucoup
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");
}
Essaye ça:
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 recommanderais de le faire dans le cadre d'une tâche AsyncTask et de mettre à jour la WebView par la suite
Deux façons de charger la post-réponse dans la vue Web:
webview.loadData()
: Comme ce que vous avez publié dans votre solution. Mais "le contenu chargé via ce mécanisme n'a pas la capacité de charger du contenu à partir du réseau".
webview.postUrl()
: utilisez cette option si la post-réponse doit charger du contenu à partir du réseau. (REMARQUE: accessible uniquement à partir du niveau 5 de l'API, ce qui signifie non Android 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 )
J'utilise webView.loadData () pour faire une publication client, et cela 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);
Si vous utilisez une WebView dès le départ, cela pourrait-il fonctionner?
Une Webview avec un html/js qui fait le POST, et affiche naturellement le résultat.