ProxyView ya tiene nombre xD

Sigo con el Proxy para saltarme CORS y poder usar XHR para obtener recursos cross origen desde javascript vanilla.

Antes de nada os comparto lo que estoy escuchando!

Tengo algo más avanzado. Hice el documento html con javascript al que le puse 2 input text y 2 botones. Uno llama a un alert que muestra el contenido de los input text y el otro envia los mismos valores a través de la interfaz de webkit a Java. Después los muestra con un widget Toast. Me falta hacer el código javascript más limpio, accesible y reusable. Tengo que pensar en ello, ya que quizás me interese inyectarlo directamente en el html de tal forma que el programador que utilice el .apk pueda utilizar el XHR de forma transparente o en su defecto a través de un par de propiedades expuestas.

Por otro lado la interfaz de xml quizás no la toque y deje simplemente el webview para no interferir en las visualizaciones que se quieran hacer por parte del desarrollador.

Ahora que ya tengo el metodo de la petición HTTP y la URL en Java, tengo que hacer la petición para crawlear el contenido y pasarlo como respuesta al javascript. No tengo aún claro como simularé la petición POST. Algo se me ocurrirá cuando esté en ello.

Por último también me falta la forma de obtener el código html del desarrollador que quiera usar mi app para saltarse CORS. Hay tantas maneras... Puedo exponerle un text-area y obtener el código mediante una interfaz para leerlo en Java y pasárselo al webview. Puedo leerlo de la carpeta downloads. Puedo dejar que lo cargen usando HTML5. Puedo obtenerlo de una url... Ya veré que hago.

Os dejo el código que llevo escrito y un par de imágenes del resultado.

Cualquier duda, sugerencia o crítica os recuerdo que podeis comentar libremente y os lo agradezco.

ActividadPrincipal.java
package com.stringmanolo.proxyview;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebChromeClient;

import com.stringmanolo.proxyview.R;

public class ActividadPrincipal extends Activity {

  private WebView ProxyView;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.principal_actividad);
   
    ProxyView  = new WebView(this);

    WebSettings webSettings = ProxyView.getSettings();
    webSettings.setJavaScriptEnabled(true); 
 
    String MiUserAgent = "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";
    ProxyView.getSettings().setUserAgentString(MiUserAgent);

    ProxyView.addJavascriptInterface(new JSInterface(this), "ProxyView");
    
    
ProxyView.setWebChromeClient(new WebChromeClient());
    
  
  ProxyView.loadUrl("file:///android_asset/Request.html");
  setContentView(ProxyView);
  }

  @Override
  public void onBackPressed() {
    if(ProxyView.canGoBack()) {
      ProxyView.goBack();
    }

    else {
      super.onBackPressed();
    }
  }
}


JSInterface.java
package com.stringmanolo.proxyview;

import android.content.Context;
import android.webkit.JavascriptInterface;
import android.widget.Toast;

/* TO DO:
* Add request headers before send request
* Callback to webview?
*
*/

public class JSInterface {
  Context mContext;
  JSInterface(Context c) {
    mContext = c;
  }

  @JavascriptInterface
  public void Request(String method, String url) {
   /* Pass Intent To WebView to make request */
   
   String ProxyMethod = method;
   String ProxyUrl = url;
   Toast.makeText(mContext,"Hola soy una función de java que te responde. Pusiste la url " + url + " y quieres utilizar el método HTTP " + method,Toast.LENGTH_SHORT).show();  
  }
}


principal_actividad.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

        <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>
</LinearLayout>


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.stringmanolo.proxyview"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
       
       android:minSdkVersion="14"
        android:targetSdkVersion="25" />
<uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar">

        <activity android:name="com.stringmanolo.proxyview.ActividadPrincipal">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>


Requests.html
<!DOCTYPE html>
<html>
  <!-- This file is just a working example
about, how to make Cross Origen Requests -->
  <head>
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
    <meta charset="UTF-8">
    <title>Requests</title>
  </head>
  <body>
    <input type="text" class="request" placeholder="method">
    <input type="text" class="request" placeholder="url">
    <button type="button" id="request">Send</button>
 
    <button type="button" onclick="alert('Hola soy una función de javascript que te responde. Pusiste la url ' + referenceObject.url + ' ' + ' y quieres utilizar el método HTTP ' + referenceObject.method)">Test</button>
    <script>
    
      function request2(method, url, callback) {
        ProxyView.Request(method, url);
      }
    
    
    /* This object will have the method and the url to craft the request after button click event. */
    var referenceObject = {};
    var buttonEvent;
    
    function main() {  
      
      
      function getRequestParams(inputsByClass, buttonById, reference) {
        var inputs = document.getElementsByClassName(inputsByClass);
      
        var request = {};
        request.method=(inputs[0].value).toString();
        request.url=(inputs[1].value).toString();
        referenceObject = JSON.parse(JSON.stringify(request));
        request2(request.method, request.url);
      }
   
         
      
      var button = document.getElementById("request");      
      buttonEvent = button.addEventListener("click", function(){getRequestParams("request", "request", referenceObject)});
      
    } window.onload=main();
    </script>
  </body> 
</html>


Comentarios

Entradas populares