GWT DefaultRequestTransport: ¿cuándo/por qué extender?

He visto varios extractos de código GWT donde el desarrollador amplió DefaultRequestTransport y le dio funcionalidad personalizada. Un ejemplo de ello está en esta pregunta SO con respecto a los filtros de autenticación/inicio de sesión. Pero he visto varios otros además de este ejemplo.

Mi pregunta: ¿cuándo y por qué alguien necesita extender esta clase y anular sus métodos? (En otras palabras, ¿qué hace esta clase, qué servicios realizan sus métodos y por qué tendría que personalizarlos?)

En ese ejemplo, el createRequestCallback el método fue anulado. De acuerdo con los Javadocs sobre ese método, su propósito es:

Cree un RequestCallback que asigne la respuesta HTTP a la interfaz TransportReceiver.

Esto sigue siendo una especie de explicación críptica para mí. ¿Podría alguien darme una explicación sencilla sobre qué escenarios sería beneficioso extender esta clase y anular 1+ de sus métodos?

preguntado el 03 de diciembre de 13 a las 12:12

2 Respuestas

RequestFactory no depende de un mecanismo de "transporte" específico; trata con representaciones JSON de solicitudes y respuestas, pero la forma en que se intercambian y transfieren es fuera del ámbito, y diferido a un RequestTransport.

EL DefaultRequestTransport utiliza una RequestBuilder a una URL dada (pero configurable); porque usa RequestBuilder, solo se puede usar en un cliente GWT (para ser compilado en JavaScript). También está el UrlRequestTransport que usa un java.net.HttpURLConnection y se puede usar en cualquier cliente que se ejecute en una JVM (un servidor que realiza una llamada a otro servidor, una aplicación de Android, una aplicación Java de escritorio, etc.)

En teoría (porque nunca lo probé y nunca escuché que alguien más lo haya hecho), podrías hacer una RequestTransport que utiliza Comet o WebSockets, o el transporte que desee. Por supuesto, el lado del servidor también tendría que adaptarse (SimpleRequestProcessor se puede reutilizar fácilmente fuera del RequestFactoryServlet; este es un parecido separación de intereses)

De regreso DefaultRequestTransport: usa RequestBuilder y proporciona algunos ganchos que puede anular para personalizar cómo funciona. El caso de uso más común es interceptar todas las solicitudes para agregar algún encabezado de solicitud (por ejemplo, credenciales) y/o todas las respuestas para manejar respuestas HTTP específicas antes de decodificar la respuesta RequestFactory codificada en JSON (por ejemplo, interceptar la respuesta "no autorizada" para pedirle al usuario que iniciar sesión).
DefaultRequestTransport funciona como un adaptador entre RequestFactory API y el RequestBuilder uno y createRequestCallback es la mitad de ella responsable de adaptar la respuesta.

Respondido el 03 de diciembre de 13 a las 14:12

En el ejemplo que se muestra, necesitan extender DefaultRequestTransport para inspeccionar todas las respuestas del servidor de RF y capturar el estado 401 (SC_UNAUTHORIZED), lo que significa que la solicitud fue rechazada en el lado del servidor porque el usuario no tiene una sesión válida y luego redirigir al usuario a la página de inicio de sesión de la aplicación.

También he usado DefaultRequestTransport para cambiar la URL de la solicitud (el valor predeterminado es gwtRequest), por lo que puedo establecer filtros basados ​​en el patrón de URL: por ejemplo, los servicios de RF autenticados van a /myapp/gwtRequest o servicios de RF no autenticados vaya a /myapp/anonymousRequest etc.

También tengo un RequestTransport personalizado que usa versiones modificadas de RequestBuilder y XMLHttpRequest capaz de monitorear eventos en progreso, muy útil para solicitudes grandes.

Puede extenderlo para enviar encabezados personalizados utilizados para realizar la autenticación CORS o lo que sea.

En resumen RequestTransport es la forma de modificar la capa de transporte del cliente de RF.

Respondido el 03 de diciembre de 13 a las 13:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.