2010-01-14 4 views
30

Desidero pubblicare dati XML con cURL. Non mi importa di forme come detto in How do I make a post request with curl.Come inviare i dati XML POST con arricciatura

Desidero pubblicare contenuto XML su alcuni servizi Web utilizzando l'interfaccia della riga di comando cURL. Qualcosa del tipo:

curl -H "text/xml" -d "<XmlContainer xmlns='sads'..." http://myapiurl.com/service.svc/ 

Tuttavia, il suddetto esempio non può essere elaborato dal servizio.


esempio di riferimento in C#:

WebRequest req = HttpWebRequest.Create("http://myapiurl.com/service.svc/"); 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
using(Stream s = req.GetRequestStream()) 
{ 
    using (StreamWriter sw = new StreamWriter(s)) 
     sw.Write(myXMLcontent); 
} 
using (Stream s = req.GetResponse().GetResponseStream()) 
{ 
    using (StreamReader sr = new StreamReader(s)) 
     MessageBox.Show(sr.ReadToEnd()); 
} 
+0

Cosa vuol dire "che non può essere elaborato dal servizio"? Il servizio lo riceve correttamente? Viene pubblicato correttamente? Che cosa riceve il servizio dalla tua richiesta? –

+0

Il servizio non riconosce la richiesta. Ricevo una pagina di errore interna. Quando si utilizza il mio esempio C# questo non accade. I dati pubblicati sono gli stessi. –

+0

Quale codice di risposta HTTP ricevi? 500? –

risposta

42

-H "text/xml" non è un colpo di testa valida. È necessario fornire l'intestazione completa:

-H "Content-Type: text/xml" 
+0

Bella risposta semplice, grazie @ Ben: D –

1

Hai provato url-codifica dei dati? cURL può prendersi cura di questo per voi:

curl -H "Content-type: text/xml" --data-urlencode "<XmlContainer xmlns='sads'..." http://myapiurl.com/service.svc/ 
8

E 'semplice da utilizzare un file (req.xml nel mio caso) con contenuto che si desidera inviare - come questo:

curl -H "Content-Type: text/xml" -d @req.xml -X POST http://localhost/asdf

Si dovrebbe considera anche l'uso di tipo 'application/xml' (differenze spiegate here)

In alternativa, senza dover fare in modo che il ricciolo effettivamente legga il file, è possibile utilizzare cat per sputare la f ile nella stdout e fare curl leggere da stdout simili:

cat req.xml | curl -H "Content-Type: text/xml" -d @- -X POST http://localhost/asdf

Entrambi gli esempi dovrebbero produrre output servizio identico.

+0

Come bonus, non è necessario specificare '-X POST' con i dati del corpo (perché la logica HTTP, ovviamente). Se lo fai, i riccioli moderni avvertiranno 'Nota: uso non necessario di -X o - richiesta, il POST è già stato dedotto. –

5

I perfer il seguente:

cat req.xml | curl -X POST -H 'Content-type: text/xml' -d @- http://www.example.com 

o

curl -X POST -H 'Content-type: text/xml' -d @req.xml http://www.example.com 

o

curl -X POST -H 'Content-type: text/xml' -d '<XML>data</XML>' http://www.example.com 
+0

Grazie per l'esempio con dati in linea :-) – Oliver