2010-08-12 11 views
42

Próbuję osiągnąć coś bardzo prostego, ale nie znalazłem dobrej dokumentacji na ten temat. Mam webView, i muszę załadować stronę, która wymaga danych POST. Wydaje się, że jest to prosty proces, ale nie mogę znaleźć sposobu na wyświetlenie wyniku w WebView.Android Webview POST

Proces ten powinien być prosty:

kwerendy (z danymi POST) -> serwer WWW -> HTML odpowiedź -> WebView.

Mogę przesłać dane za pomocą DefaultHttpClient, ale nie można tego wyświetlić w WebView.

Wszelkie sugestie?

Much Dzięki

Rozwiązanie

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

Odpowiedz

15

Spróbuj tego:

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

} 

polecam zrobić to jako część AsyncTask i aktualizowanie WebView potem

+0

Mam kawałek kodu bardzo podobny do tego, ale nie mam pojęcia, jak powiązać to z WebView. Jeśli to nie za dużo problemów, możesz opublikować fragment WebView za pomocą tego fragmentu kodu? Dzięki –

+0

Gdy masz już dane, czy chcesz wyświetlić wyniki w "WebView", czy chcesz, aby użytkownik nadal klikał łącza? Wierzę, że po wczytaniu danych z 'String' nie można z nim współdziałać. Opracuj trochę więcej.;-) – TJF

+0

Wszystko, co naprawdę chcę zrobić, to przesłać dane POST do strony, a następnie wyświetlić stronę wynikową do użytkownika –

2

Jeśli używasz WebView od początku może to działa?

Podgląd strony z plikiem html/js wykonującym test POST i oczywiście wyświetla wynik.

+0

Jak to zrobić? –

142

dwa sposoby, aby załadować pocztowy odpowiedź w WebView:

  1. webview.loadData() : Tak jak to, co napisałeś w swoim rozwiązaniu. Ale "treści ładowane za pomocą tego mechanizmu nie mają możliwości ładowania zawartości z sieci".

  2. webview.postUrl(): Użyj tej opcji, jeśli odpowiedź na żądanie wymaga załadowania treści z sieci. (UWAGA: dostępne tylko z poziomu API-5, co oznacza brak Android 1.6 lub niższej)


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

(źródło: http://www.anddev.org/other-coding-problems-f5/webview-posturl-postdata-t14239.html)

+0

Myślę, że jest to lepszy sposób na zrobienie tego. Ale może przesłać plik obrazu? Czy można to zrobić za pomocą tej metody? – leninyee

+8

@tarkeshwar Niewiarygodne. SO jest pełne długich i [uciążliwych] (http://stackoverflow.com/questions/1652850/android-webview-cookie-problem/2349340#2349340) półpiecznych rozwiązań wymagających [oddzielnych] (http: // stackoverflow. com/questions/5716898/set-a-cookie-to-a-webview-in-android/5717294 # 5717294) Obsługa i zarządzanie plikami cookie, a tu jesteś, zamieszczając rozwiązanie, które robi to wszystko tylko z 2 liniami. Głosowałbym na ciebie do +100, ale SO daje tylko +1. IMHO powinno to być zaakceptowaną odpowiedzią. Dziękuję, że oszczędziłeś mi dużo czasu! – ateiob

+2

Świetna i elegancka odpowiedź. – Tomasz

11

używam webView.loadData(), aby zrobić klient poczty, a wyświetli zawartości URL, mój kod:

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

użyć funkcji 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' jest przestarzałe, więc jest to najlepsze rozwiązanie – Lokesh