2011-09-28 36 views
30

Tôi có ứng dụng android bao gồm WebWiew và tôi cần đăng nhập tự động vào trang web bằng mã. Tôi đã thử sử dụng postUrl() và có vẻ như hoạt động ... nhưng chỉ trên một số trang web.Cách gửi dữ liệu POST bằng mã trong chế độ xem web trên Android

Dưới đây là đoạn code tôi đang sử dụng:

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

này Làm việc lớn cho dropbox.com, nhưng các trang web khác như google.com, facebook.com vv chỉ tải các trang đăng nhập hoặc cung cấp cho một lỗi (google.com đưa ra một lỗi nói rằng tôi cần bật cookie).

Hiện tại, tôi chỉ đang chuyển dữ liệu bài đăng bằng tay; nhìn vào biểu mẫu đăng nhập cho trang web và đặt các trường tên/giá trị trong tệp PostData trong mã của tôi. Trên các trang web như google, biểu mẫu đăng nhập có nhiều trường ẩn và tôi cũng đã thêm các trường đó vào postData.

Nếu có ai có thể cho tôi biết bất cứ điều gì tôi đang làm sai, hãy cho tôi biết, tôi khá bối rối về điều này.

Trả lời

14

Thử thay thế "utf-8" (trong thông số thứ 2) bằng "BASE64".

+1

Xin chào an00b. Cảm ơn câu trả lời! Tôi tin rằng tôi đã thử điều này mà không có may mắn. Tôi không còn làm việc về vấn đề cụ thể này nữa, tôi quyết định đi một con đường riêng. Tôi sẽ bỏ phiếu cho bạn dù sao đi nữa, bởi vì tôi thực sự đánh giá cao câu trả lời. – javajavajavajavajava

+0

"BASE64" không có bộ ký tự, do đó, điều này có thể hoạt động (tùy thuộc vào postData) nhưng nó cũng có thể thất bại. Cách chính xác là mã hóa dữ liệu postData thành "application/x-www-form-urlencoded" được mã hóa, có thể được thực hiện với URLEncoder.encode (postData, "UTF-8"); – raudi

+0

raudi u có thể đặt câu trả lời bằng đoạn trích sử dụng "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

Tôi đọc mã nguồn của EncodingUtils.java trong Android [HERE] (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 ")' giống như 'postData.getBytes() '. Chỉ cần sử dụng 'postData.getBytes()' thay vì EncodingUtils. (Nếu bạn cần di chuyển sang Android M (API 23) mà không có EncodingUtils) – Johnny

+0

Bạn đã lưu ngày của tôi. – 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()); 
Các vấn đề liên quan