2009-03-10 8 views
14

J'ai de la difficulté à obtenir ce travail pour toute aide serait appréciée! Fondamentalement, le request.body contient le XML valide pour le Web Service comme ceci:Comment publier du XML vers un service Web RESTFUL en utilisant Net :: HTTP :: Post?

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

... mais le service retourne le XML vide. Notez que le champ id est renvoyé suggérant qu'il ne touche en fait la base de données, mais les champs de nom et la description sont nuls:

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

J'ai testé manuellement le service en utilisant RESTFUL Affiche et il fonctionne très bien.

Voici le code:

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] 

Est-ce que quelqu'un a des indices pourquoi les données contenues dans le message XML ne persistent pas?

+1

Il serait utile de voir le code pour le service. –

Répondre

8

Sans rien savoir sur le service, c'est juste une conjecture, mais ... le service attend-il un en-tête spécifique que Poster est en train de définir et vous ne l'êtes pas?

+7

Oui! Merci, je devais ajouter la ligne suivante et cela a fonctionné: request.content_type = 'text/xml' – jensendarren

1

Si j'étais vous, j'utiliserais Wireshark, tcpflow ou un autre renifleur pour regarder les données exactes envoyées par votre application, et assurez-vous qu'elles sont identiques. J'ai vu des services qui étaient sensibles aux choses les plus étranges, comme les espaces ou les agents utilisateurs.

Questions connexes