2010-01-14 16 views
30

Deseo publicar datos XML con cURL. No me importan las formas como se dice en How do I make a post request with curl.Cómo PUBLICO datos XML con curl

Quiero publicar contenido XML en algún servicio web usando la interfaz de línea de comando cURL. Algo como:

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

Sin embargo, la muestra anterior no puede ser procesada por el servicio.


ejemplo de referencia en 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

¿Qué quiere decir "que no puede ser procesado por el servicio"? ¿El servicio lo está recibiendo correctamente? ¿Está siendo publicado correctamente? ¿Qué recibe el servicio de su solicitud? –

+0

El servicio no reconoce la solicitud. Recibo una página de error interna. Cuando uso mi ejemplo de C# esto no sucede. La información publicada es la misma. –

+0

¿Qué código de respuesta HTTP recibes? 500? –

Respuesta

42

-H "text/xml" no es una cabecera válida. Es necesario proporcionar el encabezado completo:

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

Buena respuesta simple, gracias @Ben: D –

1

Ha intentado url-codificación de los datos? La curvatura puede cuidar de que para usted:

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

Es más fácil de usar un archivo (req.xml en mi caso) con el contenido que desea enviar - como esto:

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

usted debe considere usar el tipo 'application/xml', también (diferencias explicadas here)

Alternativamente, sin necesidad de hacer curl leer el archivo, puede usar cat para escupir la f ile en la salida estándar y hacer curl para leer desde la salida estándar como esto:

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

Ambos ejemplos deben producir una salida de servicio idéntico.

+0

Como una ventaja, no es necesario especificar '-X POST' con datos del cuerpo (porque la lógica HTTP, obviamente). Si lo hace, los rizos modernos advertirán 'Nota: el uso innecesario de -X o --request, POST ya se ha inferido. –

5

que preferimos la siguiente:

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

Gracias por el ejemplo con los datos en línea :-) – Oliver

Cuestiones relacionadas