Android Webview POST
Я пытаюсь выполнить что-то довольно простое, но я не нашел хорошей документации по этому вопросу. У меня есть webView, и мне нужно загрузить в него страницу, которая требует данных POST. Похоже на простой процесс, но я не могу найти способ отображения результата в webView.
Процесс должен быть простым:
запрос (с данными POST) → веб-сервер → ответ HTML → WebView.
Я могу отправлять данные с помощью 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");
}
Ответы
Ответ 1
Попробуйте следующее:
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 впоследствии
Ответ 2
Два способа загрузить ответ post в webview:
-
webview.loadData()
: Как то, что вы разместили в своем решении. Но "контент, загруженный через этот механизм, не имеет возможности загружать контент из сети".
-
webview.postUrl()
: используйте это, если post response необходимо загрузить контент из сети. (ПРИМЕЧАНИЕ: доступен только с уровня api 5, что означает, что нет android 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)
Ответ 3
Я использую 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);
Ответ 4
Если вы используете WebView с самого начала, он может работать?
Веб-просмотр с html/js, который выполняет POST, и, естественно, отображает результат.