RPC vía HTTP o Como recoger información desde el servidor sin recargar la página.
La pregunta típica
Una de las preguntas más típicas que hace el programador novato (y a veces no tanto) en las listas de PHP es cómo recoger información desde el servidor sin recargar la página.
Ejemplo : Un cuadro de lista ofrece una lista de países. Al seleccionar uno, un segundo cuadro de lista se actuliza y muestra las distintas regiones del país, a partir de una consulta en la base de datos, sin cargar una nueva página.
Para los que trabajan en desarrollo web, esto es una pregunta delicada.
En primer lugar, cualquier acción que no sea pedir una página(si, mandar un formulario es pedir una página, pero por POST) requiere el uso de un lenguaje de programación en el cliente. Entonces, estamos obligados a usar JS en alguna de sus formas.
En segundo lugar, y aquí lo complicado, la única forma estándar para recoger información de un servidor desde un navegador es la petición completa de la página. Sólo en forma reciente se ha iniciado el proceso de estandarización de los métodos de carga dinámica, con la especificación Document Object Model (DOM) Level 3 Load and Save Specification de la W3C, el cual tiene su origen en la implimentación del objeto HTTPRequest de la Microsoft, la cual ha sido adoptada por Mozilla y otros navegadores (más información en Using the XML HTTP Request object). Entonces, la respuesta 'correcta' sería aprender la especificación y utilizar este objeto, que posiblemente pasará a ser el estándar de facto en un tiempo más.
Pero como el pan nos lo ganamos hoy en día, es necesario encontrar un método que nos permita hacer esto AHORA. Dijimos que la única manera de recoger información es a través de una carga de página. Es entonces donde podemos ocupar un pequeño truco: los marcos o frames. Pero antes de esto, es bueno hacer un poco de discusión teórica previa, para después retomar lo práctico
Que m#/&·%# es RPC
Según la Wikipedia, una llamada a procedimiento remoto o RPC, por sus siglas en inglés, es un protocolo que permite a un programa en un computador utilizar el código a ser ejecutado en otra máquina sin requerir que se programe explícitamente para este hecho.
En otras palabras, un RPC nos permite utilizar una función de PHP, JavaScript, Ruby, Java o lo que sea que de forma más o menos 'mágica', ejecuta cierto código en otra máquina y nos devuelve un resultado, sin que tengamos que preocuparnos de cual es el computador a cual nos conectamos o en qué lenguaje se programo la función que da la respuesta.
Con esta información a mano, puedo explicar el 'chiste' del título. Si digo RPC vía HTTP, me refiero a que Javascript va a utilizar la respuesta que nos de el servidor (que puede funcionar con Perl, PHP, JSP o lo que sea), a través de una o más funciones, utilizando el querido protocolo HTTP, que no ni más ni menos que el protocolo de la internet.
Implementación
Volvamos a la tierra. Ya que no tenemos todavía un método estándar para llamar de forma dinámica nuevo contenido, debemos hacerlo 'a la mala'. Cómo les decía, la forma que se ha hecho más popular es crear un frame o iframe oculto, el cual cargue una nueva página, la cual nos devuelve la información necesaria.
Si bien es simple en teoría, las diferencias en la implementación del modelo DOM y de Javascript para los distintos navegadores y sus versiones hace que sea un tanto complicado el crear una implementación que sea 'todo terreno'.
Recientemente, en PHP Everywhere, John Lim en su artículo Building Rich DHTML User Interfaces Revisited lista algunas herramientas para crear aplicaciones DHTML, entre las cuales se nombran las herramientas para hacer RPC-HTTP.
De todos modos, citaré las que encuentro más relevantes:
- Javascript Remote Scripting (JSRS): Una aplicación de larga data, con soporte para Win9x, WinNT/2000, WinXP, Unix/Linux/BSD y Mac con IE4+, NS4.x, NS6.x, Mozilla, Opera7 y Galeon. En el lado del servidor tiene soporte para ASP, ColdFusion, PerlCGI, PHP,Python, y JSP(servlet). Es la que yo utilizo y es mi recomendada hasta que aparezca algo mejor! Si a alguien le interesa, puedo armar un pequeño tutorial para mostrar su uso
- Internet Explorer:download Behavior: Ofrece una implementación muy similar de lo que hace JSRS. Si van a trabajar exclusivamente con Internet Explorer y no quieren complicarse la vida con XML y esas cosas, pueden echarle una miradita.
- Webservice Behaviour: Si se quieren complicar un poco más la vida, si les piden que se contacten con un servicio web en SOAP desde IE, pueden usar el comportamiento Webservice.
- XML-RPC: Una especificación para usar XML y HTTP para hacer RPC. Si bien tiene una impresionante lista de implementaciones en distintos lenguajes, lo verboso del XML hace que la más simple llamada ocupe un monto alto de ancho de banda y el control de errores que posee es bastante malo. Lo utilice para hacer RPC entre dos servidores con PHP y funcionó, de todos modos, relativamente bien. No lo recomendaría si del lado del cliente utilizan sólo Js.
- HTTP Request: Ya les puse este link, no es cierto? Es un buen candidato para ser el estándar de llamada RPC por JavaScript. Si alguien lo prueba, que avise
Conclusión
Existen variadas formas de buscar información desde el servidor sin recargar la página en los navegadores; no existe un estándar aún, pero el uso del objeto HTTPRequest es prometedor.La implementación más eficiente y madura, por el momento, es Jsrs.
Agradecimientos a Christian por la idea de poner un ejemplo y un par de correcciones anglio-fílicas y a Jordi por el interés en el tema.
- 8810 lecturas

Si, lo del tutorial parece que lo voy a tener que hacer, ante las peticiones desesperadas de mis amigos :)
Mantente en línea, que puede que la otra semana salga.
Que buen post, me gustaria que colocaras un tutorial de como utilizar JSRS. Me he visto en la necesidad de utilizar esta tecnica, pero no me funciona bien en IE, solo en Firefox.
[...] Wordpress, que representa un buen ejemplo del uso del URL como indicador con significado: http://www.apsique.virtuabyte.cl/php/index.php/archivo/2004/11/10/rpc- [...]
[...] ualización de la página. Os recomiendo que le echéis un vistazo. El enlace: RPC vía HTTP o Como recoger información desde el servidor sin recargar la página< [...]
Fenomenal el post, lo voy a enlazar en mi weblog. Yo únicamente conocía el truco del iframe, que como comentas quizás sea el más usado. El problema es que es complicado hacer que funcione en más de un navegador. Saludos!!!
interesante lo de usted
goooogleando di con el jsrs
y el ejemplo que trae es de locos
recien lo estoy estudiando, asi que lo del tutorial
te apoyo al 100%
salu2
Ufff... sip. La idea es armar una explicación con jsrs, ajax, con las clases que correspondan en PHP y Js. Si se puede, también en Ruby, aunque parece que el Ruby on Rails ya trae compatibilidad con Ajax.
See ya!
Alguien me podria dar la url de algun Ejemplo de formulario web usando esta tecnica???
saludos
Víctor!!
Hola a todos, resulta que como comentan, yo tuve la misma pregunta, así que anduve buscando información, y diseñe mi propia solución, para ello hice uso de dom y otras cosillas, y hasta ahora me ha dado resultado, e incluso mi solución es un poco más rápida del XmlHttp, actualmente lo he testeado en mozilla, firefox,opera, konqueror e ie y jala bastante bien...
No es por nada, pero creo que muchas veces es mejor buscar una solución propia, pues así uno sabe como está implementada y puede hacer ajustes que permitan optimizarla....
En lo personal creo que el código de Javascript Remote Scripting (JSRS) es un poco complicado de entender....bueno para mi lo fue en mis inicios
bueno...es solo mi opinión...gracias....a todos...
Pero hombre, que cuesta hacer una páginita y mostrarnos tu solución. Ayudarías a mucha gente y te harías famoso :)
oye y si hiciste el tutorial...
porke la verdad para nosotros los novatos
es dificil entender esto...
salu2
oye y si hiciste el tutorial...
porke la verdad para nosotros los novatos
es dificil entender esto...
salu2
oye y si hiciste el tutorial...
porke la verdad para nosotros los novatos
es dificil entender esto...
salu2
oye y si hiciste el tutorial...
porke la verdad para nosotros los novatos
es dificil entender esto...
salu2
oye y si hiciste el tutorial...
porke la verdad para nosotros los novatos
es dificil entender esto...
salu2
JSRS me parece una buena solucion sin embargo encontre una dificultad que se las menciono: ejecuto mi proceso en el servidor y me traigo gran cantidad de datos para ordenarlos y mostrarlos en una tabla que es lo mas comun, eso en php no es problema recargo la pagina y listo,pero si quisiera implementarlo con JSRS para no recargar la pagina, tendria que almacenar todos esos datos en el lado del cliente para despues ordenarlos y colocarlos en la tabla, es decir borrar las filas de la tabla y volver a crearlas, trabajo un poco complicado usando DOM ,pero eso no es todo y si por ejemplo parte de esos datos son otros objetos como checkbox, ¿como los almacenaria en el lado del cliente ?.
Toda respuesta sera bienvenida.
SALUDOS
Sí, recrear una tabla es un tanto complicado, pero prueba a usar el atributo innerHTML.... en la forma
document.getElementById("mitabla").innerHTML+="Nueva fila"
Sirve tanto para generar la tabla como cualquier otro elemento.
Sobre lo del checkboz, no me quedó muy claro para donde iba la cosa....
Hola a todos!!!... bueno tengo un problema y no se si me podrian apoyar en la solucion de este, necesito un ejemplo sencillo de un Web Service PHP (tanto servidor y cliente ), estube revisando articulos referentes al tema como este :http://www.xml.com/pub/a/ws/2004/03/24/phpws.html?page=2 pero al parecer algo me falta hacer; quiero reproducir el ejemplo q se ve en la imagen del explorador de XP donde dice CanadaTaxCalculator, el Calculateontariotax no me sale; y no se porque ?; si tubieses algun tiempo para enviarme otro ejemplo similar o revisar porq no me sale el
link Calculateontariotax te lo agradeceria mucho.
Saludos.
Alex
Respecto a los modos citados de RPC-HTTP, a cual de esos corresponde AJAX? O AJAY es uno aparte? Yo hasta ahora siempre he usado AJAX y funciona perfecto. Lo unico k no he encontrado es como subir una imagen (archivo en gral)usando AJAX, pero eso lo solucione con un iFrame (no muy elegante).
Saludos!
Ajax está basado en el objeto HttpRequest. Cuando hablo de RPC-HTTP, hablo de un concepto general que engloba a todas las prácticas relacionadas con enviar y recibir información del servidor sin recargar la página.
estoy haciendo una pagina donde envia un mail a una direccion (siempre la misma) el problema es que cuando apreto el boton (que es una imagen) de enviar llama a un archivo php y la pagina (que contiene el formulario desaparece del frame que la contenia dejandolo en blanco.
Hola, uso jsrs desde hace tiempo y mas o menos voy solucionando todos los problemas que surgen, peor ahora tengo uno quen consigo solucionar.
He conseguido hacer un select multiple con jsrs, pero lo que ahora no consigo es que lo recupere con jsrs. Al pasarle los valores que deben estar seleccionados solo me coge el ultimo de la lista que le paso.
Gracias.
Chale que le cuentas un (/·&/%·&%"/&" tutorialsillo
Enviar un comentario nuevo