2010-01-14 44 views
30

Tôi muốn đăng dữ liệu XML bằng cURL. Tôi không quan tâm về các hình thức như đã nói trong số How do I make a post request with curl.Làm cách nào để POST dữ liệu XML với curl

Tôi muốn đăng nội dung XML lên một số dịch vụ web bằng giao diện dòng lệnh cURL. Một cái gì đó như:

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

Tuy nhiên, mẫu trên không thể xử lý bởi dịch vụ.


tham khảo ví dụ trong 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

Ý anh là gì "nó không thể được xử lý bởi các dịch vụ"? Dịch vụ có nhận được chính xác không? Có phải nó đang được đăng chính xác không? Dịch vụ nhận được gì từ yêu cầu của bạn? –

+0

Dịch vụ không nhận ra yêu cầu. Tôi nhận được một trang lỗi nội bộ. Khi sử dụng ví dụ C# của tôi, điều này không xảy ra. Các dữ liệu được đăng là như nhau. –

+0

Bạn nhận được mã phản hồi HTTP nào? 500? –

Trả lời

42

-H "text/xml" không phải là tiêu đề hợp lệ. Bạn cần cung cấp đầy đủ các tiêu đề:

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

Câu trả lời đơn giản, cảm ơn @Ben: D –

1

Các bạn đã thử url-mã hóa dữ liệu? cURL có thể xử lý điều đó cho bạn:

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

Nó là đơn giản để sử dụng một tập tin (req.xml trong trường hợp của tôi) với nội dung mà bạn muốn gửi - như thế này:

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

Bạn nên cũng nên xem xét sử dụng loại 'application/xml' (sự khác biệt được giải thích here)

Ngoài ra, mà không cần cuộn tròn thực sự đọc tệp, bạn có thể sử dụng cat để nhổ f Ile vào stdout và làm curl để đọc từ thiết bị xuất chuẩn như thế này:

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

Cả hai ví dụ nên sản xuất sản lượng dịch vụ giống hệt nhau.

+0

Là một phần thưởng, bạn không cần phải chỉ định '-X POST' với dữ liệu nội dung (vì logic HTTP, rõ ràng). Nếu bạn làm thế, các lọn tóc hiện đại sẽ cảnh báo 'Lưu ý: Việc sử dụng không cần thiết -X hoặc --yquest, POST đã được suy ra.' –

5

tôi perfer sau:

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

hoặc

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

hoặc

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

Cảm ơn ví dụ với dữ liệu nội tuyến :-) – Oliver

Các vấn đề liên quan