2010-01-14 5 views
30

Chcę wysłać dane XML z cURL. Nie interesują mnie formularze takie jak w How do I make a post request with curl.W jaki sposób mogę POST danych XML z curl

Chcę opublikować zawartość XML w niektórych usługach sieciowych przy użyciu interfejsu wiersza poleceń cURL. Coś w rodzaju:

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

Powyższa próbka nie może być jednak przetworzona przez serwis.


przykład odniesienia w 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

Co to znaczy "nie mogą być przetwarzane za pomocą usługi"? Czy usługa otrzymuje je poprawnie? Czy jest poprawnie publikowany? Co usługa otrzymuje od Twojej prośby? –

+0

Usługa nie rozpoznaje żądania. Otrzymuję wewnętrzną stronę błędu. Podczas korzystania z mojego przykładu C# tak się nie dzieje. Opublikowane dane są takie same. –

+0

Jaki kod odpowiedzi HTTP otrzymujesz? 500? –

Odpowiedz

42

-H "text/xml" nie jest prawidłowym nagłówkiem. Musisz podać pełny nagłówek:

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

Przyjemna prosta odpowiedź, dzięki @Ben: D –

1

Czy próbowałeś URL kodowanie danych? cURL może zająć się tym:

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

To jest prostsze w użyciu pliku (req.xml w moim przypadku) z zawartością chcesz wysłać - tak:

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

Powinieneś rozważ także zastosowanie typu "application/xml" (różnice wyjaśniono here)

Alternatywnie, bez potrzeby zwijania się, faktycznie czytasz plik, możesz użyć cat, aby wypluć f umieszczoneIle do stdout i zrobić curl czytać z stdout tak:

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

Oba przykłady powinny produkować identyczne wyjścia serwisowym.

+0

Jako bonus, nie musisz podawać '-X POST' z danymi o ciele (ponieważ oczywiście logika HTTP). Jeśli to zrobisz, nowoczesne loki będą ostrzegać 'Uwaga: niepotrzebne użycie -X lub --request, POST jest już wywnioskowane. –

5

I perfer następujące:

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

lub

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

lub

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

Dzięki za przykład z danymi wstawianymi :-) – Oliver