2011-09-28 10 views
30

Tengo una aplicación de Android que consiste en WebWiew y necesito iniciar sesión en un sitio automáticamente usando el código. Intenté usar postUrl() y parece funcionar ... pero solo en algunos sitios.Cómo enviar datos de POST con código en una vista web de Android

Aquí está el código que estoy usando:

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

Esto funciona gran para dropbox.com, pero otros sitios como google.com, facebook.com, etc. Basta con cargar la página de inicio de sesión o dar un error (google.com da un error diciendo que necesito habilitar las cookies).

En este momento solo voy a ir a los datos de la publicación a mano; mirando el formulario de inicio de sesión para el sitio y poniendo los campos de nombre/valor en el postData en mi código. En sitios como google, el formulario de inicio de sesión tiene muchos campos ocultos y también los agregué a la publicación de datos.

Si alguien me puede dar alguna idea de algo que estoy haciendo mal, por favor hágamelo saber, estoy bastante confundido acerca de esto.

Respuesta

14

Intente reemplazar "utf-8" (en el 2 ° parametro) con "BASE64".

+1

Hola an00b. ¡Gracias por la respuesta! Creo que lo he intentado sin suerte. Ya no estoy trabajando en este problema específico, decidí ir por una ruta diferente. Te votaré de todos modos, porque realmente aprecio la respuesta. – javajavajavajavajava

+0

"BASE64" no es un conjunto de caracteres, por lo que esto puede funcionar (dependiendo de los datos posteriores) pero también puede fallar. La forma correcta es codificar el postData para que sea codificado en "application/x-www-form-urlencoded", lo que se puede hacer con URLEncoder.encode (postData, "UTF-8"); – raudi

+0

raudi puede poner una respuesta con un fragmento que use "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

Leí el código fuente de EncodingUtils.java en 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 ")' igual que 'postData.getBytes() '. Simplemente use 'postData.getBytes()' en lugar de EncodingUtils. (Si necesita migrar a Android M (API 23) sin EncodingUtils) – Johnny

+0

Usted salvó mi día amigo. – 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()); 
Cuestiones relacionadas