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
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. [email protected]
Buenas,
Rodrigo B. escribió:
Creo que lo que necesitas es Soap.
markthomas.org
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
2009/4/27 Fernando C. [email protected]
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:[email protected]/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.
2009/4/30 Rodrigo B. [email protected]
Creo que lo que necesitas es Soap.
markthomas.org
-r.
No, como te dicen, para recibir y enviar xmls es dificil que se necesite
SOAP
2009/4/30 Manuel González Noriega [email protected]:
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:
GitHub - xianhuazhou/http_request.rb: this is a small, lightweight, powerful HttpRequest class based on the 'net/http' and 'net/ftp' libraries
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
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
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.
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:[email protected]/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