2011-09-28 17 views
30

Mam aplikację na Androida, która składa się z WebWiew i muszę zalogować się do witryny automatycznie za pomocą kodu. Próbowałem używać postUrl() i wydaje się, że działa ... ale tylko w niektórych witrynach.Jak wysłać dane POST z kodem w internetowej wersji Androida

Oto kod używam:

public class webviewActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     WebView webview = new WebView(this); 
     setContentView(webview); 
     WebSettings webSettings = webview.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 

     webview.setWebViewClient(new WebViewClient()); 

     String postData = "[email protected]&login_password=myPassword"; 
     webview.postUrl("https://www.dropbox.com/login", EncodingUtils.getBytes(postData, "utf-8")); 
    } 
} 

Działa wielki dla dropbox.com, ale inne strony takie jak google.com, facebook.com, itd. Po prostu załadować stronę logowania lub dać błąd (google.com daje komunikat, że muszę włączyć obsługę plików cookie).

Teraz po prostu ręcznie wysyłam dane pocztowe; przeglądając formularz logowania do witryny i umieszczając pola nazwy/wartości w postData w moim kodzie. Na stronach takich jak google, formularz logowania ma wiele ukrytych pól i dodałem je również do postData.

Jeśli ktoś może dać mi pojęcie czegoś, co robię źle, proszę dać mi znać, jestem dość zdezorientowany.

Odpowiedz

14

Spróbuj wymienić "utf-8" (w drugim parametrze) na "BASE64".

+1

Hi an00b. Dziękuję za odpowiedź! Sądzę, że próbowałem tego bez powodzenia. Nie pracuję już nad tym konkretnym problemem, postanowiłem wybrać oddzielną trasę. W każdym razie zagłosuję, ponieważ naprawdę doceniam odpowiedź. – javajavajavajavajava

+0

"BASE64" nie jest zestawem znaków, więc może działać (w zależności od posta), ale może również zawieść. Prawidłowym sposobem jest kodowanie danych postData w postaci "application/x-www-form-urlencoded", które można wykonać za pomocą URLEncoder.encode (postData, "UTF-8"); – raudi

+0

raudi można ułożyć odpowiedź za pomocą fragmentu kodu "application/x-www-form-urlencoded" – D4rWiNS

11
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    WebView webView = new WebView(this); 

    setContentView(webView); 

    String url = "http://example.com/somepage.php"; 
    String postData = "postvar=value&postvar2=value2"; 

    webView.postUrl(url, EncodingUtils.getBytes(postData, "base64")); 
} 
+13

Przeczytałem kod źródłowy EncodingUtils.java w systemie Android [TUTAJ] (http://grepcode.com/file/repo1. maven.org/maven2/org.apache.httpcomponents/httpcore/4.4/org/apache/http/util/EncodingUtils.java#95) 'EncodingUtils.getBytes (postData," base64 ")' tak samo jak 'postData.getBytes() '. Po prostu użyj 'postData.getBytes()' zamiast EncodingUtils. (Jeśli potrzebujesz przeprowadzić migrację do Androida M (API 23) bez EncodingUtils) – Johnny

+0

Uratowałeś mojego kolesia. – NinjaCoder

+0

https://developer.android.com/reference/org/apache/http/util/EncodingUtils.html –

0
WebView myWebView = (WebView) findViewById(R.id.webview); 

String url="http://www.example.org/login"; 

String postData= 
       "username="+URLEncoder.encode("abc","UTF8")+ 
       "&password="+URLEncoder.encode("***", "UTF-8"); 

myWebView.postUrl(url,postData.getBytes()); 
Powiązane problemy