elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Capturar las respuestas del servidor con un objeto WebEngine
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Capturar las respuestas del servidor con un objeto WebEngine  (Leído 2,149 veces)
Octsam

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Capturar las respuestas del servidor con un objeto WebEngine
« en: 11 Junio 2017, 17:58 pm »

Con los objetos WebEngine de JavaFX, es posible interactuar con una página web y extraer sus datos. Pero si son actualizados con mucha frecuencia, recargar la página para obtener el código HTML actualizado o revisar cada nodo para saber cuál ha cambiado, es ineficiente. Por ello, y debido a que las peticiones y respuestas HTTP suelen ser hechas con JQuery, probé a ver las respuestas del servidor añadiendo en la consola del navegador el código javascript:

Código:
$(document).ajaxSuccess(function(event, xhr, settings){ alert(xhr.responseText); });

Y tras comprobar que funciona en el navegador, quise incluirlo en Java escribiendo el código siguiente:

Código:
import javafx.application.Application;
import javafx.beans.value.*;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
//import javafx.concurrent.Worker.State;
import org.w3c.dom.Document;
import netscape.javascript.JSObject;

@SuppressWarnings("restriction")
public class Captura extends Application{

        public static void main(String[] args) { launch(args); }

        @Override
        public void start(Stage escenario){
                final TextArea área_texto = new TextArea();
                área_texto.setEditable(false);
                
                // 'ingenio' será el objeto que conecta con "webkit" para operar con HTML, javascript y CSS.
                final WebEngine ingenio = new WebEngine();
                
                // 'ventana' es el objeto que permite conectar javascript con Java.
                final JSObject ventana = (JSObject)ingenio.executeScript("window");
                
                // Esto establece el vínculo entre "jHelper" en javascript y "JavaHelper" en Java.
                ventana.setMember("jHelper", new JavaHelper(área_texto));
                
                // Esta estructura supuestamente es para ser ejecutada al cargar la página web, pero
                // no entiendo bien esta parte.
                ingenio.documentProperty().addListener(new ChangeListener<Document>(){
                        @Override
                        public void changed(ObservableValue<? extends Document> observable, Document oldDoc, Document newDoc){
                                // Esto pondrá en la ventana el código inicial HTML.
                                área_texto.setText((String)ingenio.executeScript("document.documentElement.innerHTML"));

                                // Esto es para comprobar si al ejecutar el código, realmente es alcanzada esta parte,
                                // algo que muchas veces no ocurre.
                                System.out.println("Llegué.");
                                
                                // Esto capturará el tráfico HTTP con javascript.
                               ingenio.executeScript("$(document).ajaxSuccess(function(event, xhr, settings){ jHelper.respuesta(xhr.responseText); });");
                        }
                });
                
                ingenio.load("http://www.sportium.es");
                escenario.setScene(new Scene(área_texto, 800, 600));
                escenario.show();
        }
        
        
        // Esta clase servirá para llamar a Java desde javascript.
        public static class JavaHelper{
                // 'área_texto' será el objeto donde será mostrado el código HTML inicial, y las
                // respuestas capturadas.
                final TextArea área_texto;
                // 'cont' indicará el número de respuestas que han sido capturadas y mostradas.
                private int cont =  0;
                
                public JavaHelper(TextArea área_texto){
                        this.área_texto = área_texto;
                }
                
                // 'texto' contendrá el mensaje de respuesta del servidor.
                public void respuesta(String texto){
                        ++cont;
                        área_texto.setText("\n"+cont+":\n"+texto);
                }
        }
}

Lo curioso es que unas veces es abierta una ventana y se queda en blanco, otras aparece el código HTML inicial y se queda así, y otras presenta el código y lo cambia por la primera respuesta del servidor, y se queda así también. Necesito

Lo que necesito saber es porqué no me funciona como en el navegador, captando sólo la respuesta primera en el mejor de los casos, y cómo corregirlo, pues no sé cómo resolverlo.




« Última modificación: 11 Junio 2017, 18:04 pm por Octsam » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines