2009-03-10 14 views
14

¡Tengo problemas para hacer que esto funcione, por lo que cualquier ayuda sería apreciada! Básicamente, el request.body contiene XML válido para el servicio Web de este modo:¿Cómo publico XML en el servicio web RESTFUL usando Net :: HTTP :: Post?

<somedata> 
<name>Test Name 1</name> 
<description>Some data for Unit testing</description> 
</somedata> 

... pero el servicio devuelve XML vacía. Tenga en cuenta que el campo ID se devuelve lo que sugiere que en realidad no golpeó la base de datos, pero los campos de nombre y descripción son nulas:

<somedata> 
<id type='integer'>1</id> 
<name nil='true'></name> 
<description nil='true'></description> 
</somedata> 

que han probado el servicio manualmente utilizando RELAJANTE pósteres y funciona bien.

Aquí está el código:

url = URI.parse('http://localhost:3000/someservice/') 
request = Net::HTTP::Post.new(url.path) 
request.body = "<?xml version='1.0' encoding='UTF-8'?><somedata><name>Test Name 1</name><description>Some data for Unit testing</description></somedata>" 
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 

#Note this test PASSES! 
assert_equal '201 Created', response.get_fields('Status')[0] 

¿Alguien tiene alguna pista por qué los datos XML en el puesto no se conserva?

+1

Ayudaría a ver el código del servicio. –

Respuesta

8

Sin saber nada sobre el servicio, esto es solo una suposición, pero ... ¿el servicio espera un encabezado específico que el Póster está configurando y usted no?

+7

¡Sí! Gracias, necesitaba agregar la siguiente línea y funcionó: request.content_type = 'text/xml' – jensendarren

1

Si yo fuera usted, usaría Wireshark, tcpflow u otro sniffer para ver los datos exactos que está enviando el Póster y su aplicación, y asegúrese de que sean idénticos. He visto servicios que eran sensibles a las cosas más extrañas, como el espacio en blanco o el agente de usuario.

Cuestiones relacionadas