Comunicación XML con otra máquina


#1

Hola a todos, tengo que “debutar” en el mundillo de la comunicación
entre máquinas por XML… Si tenéis algún enlace a material de
referencia, me vendría muy bien.

Aparte de eso, temas concretos:

1.- El protocolo empieza con que yo tengo que enviar por POST un XML a
la máquina del cliente. Generar el XML no es problema, con un archivo
sesion.xml.builder:

xml.instruct! :xml
xml.token do
xml.request :type => ‘validation’ do
xml.user @yo.nick
xml.pass @yo.pass_sha
xml.userId @yo.id
end
end

pero no sé cómo enviarlo por POST!! ¿Alguien lo ha hecho alguna vez?

2.- El cliente responderá enviándome un archivo XML que yo debo
procesar. Procesarlo es sencillo, con from_xml; pero el problema es el
mismo que antes, al revés: ¿cómo lo recojo para procesarlo?

Aparte de eso, después tendré que ver temas de seguridad, temas de
codificación (ellos usan ISO-8859-1 y yo UTF-8), etc… pero lo primero
que necesito es esto. Cualquier ayuda sería muy agradecida…

s2


#2

A grandes rasgos:

En el controlador:

require ‘net/http’
require ‘uri’
require ‘iconv’

Para establecer la conexion:
request = el xml que quieres enviar (string)
xml = respuesta del servicio web

xml = Net::HTTP.post_form(URI.parse(‘http://www.servicioweb.com/ruta’),
{
“xml” => request })

en xml.body tienes el contenido de la respuesta

Si el servidor te responde en ISO-8859-1 puedes convertirlo a UTF8 así

xml = Iconv.conv(‘utf-8’, “ISO-8859-1”, xml.body)

Una vez recoges el xml lo puedes procesar con Hpricot, REXML o libxml

Espero que te sirva

2009/4/27 Fernando C. removed_email_address@domain.invalid


#3

Creo que lo que necesitas es Soap.

http://markthomas.org/2007/09/12/getting-started-with-soap4r/

-r.


#4

Buenas,

Rodrigo B. escribió:

Creo que lo que necesitas es Soap.
http://markthomas.org/2007/09/12/getting-started-with-soap4r/

para comunicarse mediante XML con otra máquina no necesitas SOAP para
nada. Otra cosa es que el servicio web use este protocolo pero Fernando
no dijo nada de ello.

Saludos


#5

2009/4/27 Fernando C. removed_email_address@domain.invalid

pero no sé cómo enviarlo por POST!! ¿Alguien lo ha hecho alguna vez?

Te recomiendo que uses alguna de las gemas para comunicación rest de alto
nivel, como HTTParty o RestClient

Con RestClient

http://rest-client.heroku.com/rdoc/

require ‘rest_client’

RestClient.get ‘http://example.com/resource
RestClient.get ‘https://user:removed_email_address@domain.invalid/private/resource

RestClient.post ‘http://example.com/resource’, :param1 => ‘one’,
:nested => { :param2 => ‘two’ }

RestClient.delete ‘http://example.com/resource

2.- El cliente responderá enviándome un archivo XML que yo debo
procesar. Procesarlo es sencillo, con from_xml; pero el problema es el
mismo que antes, al revés: ¿cómo lo recojo para procesarlo?

Si el XML llega de forma síncrona a tu petición, lo recibirás en el
cuerpo
de la respuesta a esta. Depende de la librería que utilices
(rest-client,
net/http, …) a esta respuesta accederás de una forma u otra, pero muy
facilmente en cualquier caso.

Si llega de forma asíncrona, es decir, tienes q estar siempre a la
espera de
un post del cliente, basta que tengas una acción normal que reaccione a
un
post (como un create) y procese params. Es lo mismo que si recibes datos
de
un formulario de tu aplicación, dejando aparte comprobaciones de
seguridad,
etc.


#6

2009/4/30 Rodrigo B. removed_email_address@domain.invalid

Creo que lo que necesitas es Soap.

http://markthomas.org/2007/09/12/getting-started-with-soap4r/

-r.

No, como te dicen, para recibir y enviar xmls es dificil que se necesite
SOAP


#7

2009/4/30 Manuel González Noriega removed_email_address@domain.invalid:

sesion.xml.builder:

pero no sé cómo enviarlo por POST!! ¿Alguien lo ha hecho alguna vez?

Te recomiendo que uses alguna de las gemas para comunicación rest de alto
nivel, como HTTParty o RestClient

+1, hay librerías muy majas para estas cosas. Esta semana he probado
estas dos esta semana pero necesitaba algo más flexible y tuve algunos
problemas para enviar archivos. Al final me quedé con esta:

http://github.com/xianhuazhou/http_request.rb/tree/master

Con lo fácil que es programar clientes como estos y servicios basados
en Sinatra, cada vez que leo SOAP o CORBA se me ponen los pelos de
punta :slight_smile:


#8

Fernando C. wrote:

pero las primeras pruebas siguiendo las
indicaciones de Emili me está costando hacerlo funcionar, y probaré con
RestClient.

Claro que me estaba costando hacerlo funcionar!! Os cuento el problema
que he tenido, para que no os pase a nadie…

Resulta que estoy probando en localhost el protocolo: una función pide
un xml, y la otra se lo da…

¿Qué pasa? Que la primera se queda bloqueada sin recibir respuesta!! No
porque tenga nada mal programado, sino PORQUE TENGO UN SÓLO MONGREL QUE
SIRVE LAS PETICIONES DE FORMA LINEAL Y NO CONCURRENTE, así que la
función que se lo da no recibe la petición hasta que termine la que
pedía… que está bloqueada esperando la respuesta de la otra!!
Mecagontóóóóóóó !!! El tiempo que he perdido probando otras cosas,
cuando desde el principio estaba bien…

Si alguien va a hacer esto, después de haber probado casi todo, os
recomiendo el rest_client; todos funcionan, pero este deja un código muy
limpio y es más intuitivo…

s2


#9

:slight_smile: shit happens… no hay mejor manera de aprender que saliendo vivo de
situaciones como esta.

Gracias por comentar la
solución
f.

El día 30 de abril de 2009 19:31, Fernando C.


#10

Manuel González Noriega wrote:

Te recomiendo que uses alguna de las gemas para comunicación rest de alto
nivel, como HTTParty o RestClient

Con RestClient

http://rest-client.heroku.com/rdoc/

require ‘rest_client’

RestClient.get ‘http://example.com/resource
RestClient.get ‘https://user:removed_email_address@domain.invalid/private/resource

RestClient.post ‘http://example.com/resource’, :param1 => ‘one’,
:nested => { :param2 => ‘two’ }

RestClient.delete ‘http://example.com/resource

Si el XML llega de forma síncrona a tu petición, lo recibirás en el
cuerpo
de la respuesta a esta. Depende de la librería que utilices
(rest-client,
net/http, …) a esta respuesta accederás de una forma u otra, pero muy
facilmente en cualquier caso.

Si llega de forma asíncrona, es decir, tienes q estar siempre a la
espera de
un post del cliente, basta que tengas una acción normal que reaccione a
un
post (como un create) y procese params. Es lo mismo que si recibes datos
de
un formulario de tu aplicación, dejando aparte comprobaciones de
seguridad,
etc.

Esto tiene muy buena pinta, muchas gracias!! Bueno, gracias a todos en
realidad. Todavía casi no he podido ponerme a ello (algo muy urgente ha
retrasado lo importante), pero las primeras pruebas siguiendo las
indicaciones de Emili me está costando hacerlo funcionar, y probaré con
RestClient.

En este caso no necesito SOAP; es un protocolo específico nuestro. Usar
SOAP para algo así me parece que sería matar moscas a cañonazos…

Pero bueno, me pongo a ello y ya os contaré. Y por si alguien más está
interesado en el tema, os dejo algunos hilos en los que se hablaba de
esto…

http://www.ruby-forum.com/topic/112906
http://www.ruby-forum.com/topic/60053
http://www.ruby-forum.com/topic/168426
http://www.ruby-forum.com/topic/134384

s2