gửi / gửi tập tin xml bằng dòng lệnh curl


Câu trả lời:


507

Nếu câu hỏi đó được kết nối với các câu hỏi Hudson khác của bạn, hãy sử dụng lệnh họ cung cấp. Cách này với XML từ dòng lệnh:

$ curl -X POST -d '<run>...</run>' \
http://user:pass@myhost:myport/path/of/url

Bạn cần thay đổi một chút để đọc từ tệp:

 $ curl -X POST -d @myfilename http://user:pass@myhost:myport/path/of/url

Đọc trang hướng dẫn . theo một tham số trừu tượng cho -d.

-d / - dữ liệu

(HTTP) Gửi dữ liệu được chỉ định trong yêu cầu POST đến máy chủ HTTP, giống như cách trình duyệt thực hiện khi người dùng điền vào biểu mẫu HTML và nhấn nút gửi. Điều này sẽ khiến curl truyền dữ liệu đến máy chủ bằng cách sử dụng ứng dụng loại nội dung / x-www-form-urlencoding. So sánh với mẫu -F / -.

-d / - dữ liệu giống như --data-ascii. Để đăng dữ liệu hoàn toàn là nhị phân, thay vào đó bạn nên sử dụng tùy chọn --data-binary. Để mã hóa URL giá trị của trường biểu mẫu, bạn có thể sử dụng --data-urlencode.

Nếu bất kỳ tùy chọn nào trong số các tùy chọn này được sử dụng nhiều lần trên cùng một dòng lệnh, các phần dữ liệu được chỉ định sẽ được hợp nhất với nhau bằng một & -symbol riêng biệt. Do đó, sử dụng '-d name = daniel -d skill = lousy' sẽ tạo ra một đoạn bài đăng trông giống như 'name = daniel & skill = lousy'.

Nếu bạn bắt đầu dữ liệu bằng chữ cái @, phần còn lại sẽ là tên tệp để đọc dữ liệu từ hoặc - nếu bạn muốn cuộn tròn để đọc dữ liệu từ stdin. Nội dung của tệp phải được mã hóa URL. Nhiều tập tin cũng có thể được chỉ định. Do đó, việc đăng dữ liệu từ một tệp có tên 'foobar' sẽ được thực hiện với --data @foobar.


2
Đọc trang hướng dẫn. The contents of the file must already be URL-encoded.Các tệp XML của OP chắc chắn không có.
Đại tá Panic

52
Miễn là bạn chỉ định loại nội dung --header "Content-Type:application/xml"mà bạn không mong đợi để mã hóa URL
Đại tá Panic

12
Tôi sẽ chỉ thêm rằng nếu bạn sử dụng "-d" thì nó mặc định là POST, do đó không cần phải sử dụng "-X".
Tal Liron

4
nếu bạn đang sử dụng tùy chọn trang đổi hướng sau curl của -L, đừng không sử dụng -X POSTvì nó sẽ làm cho chuyển hướng POST sử dụng yêu cầu quá. Nếu bạn chỉ sử dụng -d như @Tai gợi ý, điều này sẽ không xảy ra
Tristan Havelick

18
Được cảnh báo rằng -ddải ngắt dòng từ các tập tin. Để tránh điều này, sử dụng --data-binarythay thế.
Yar

189

Từ trang này , tôi tin rằng đây là những droid bạn đang tìm kiếm:

-F/--form <name=content>

(HTTP) Điều này cho phép cuộn tròn mô phỏng một biểu mẫu điền vào trong đó người dùng đã nhấn nút gửi. Điều này gây ra cong dữ liệu POST bằng cách sử dụng đa dữ liệu / biểu mẫu dữ liệu Kiểu nội dung theo RFC2388. Điều này cho phép tải lên các tệp nhị phân, v.v ... Để buộc phần 'nội dung' là một tệp, hãy đặt tiền tố tên tệp bằng dấu @.

Ví dụ, để gửi tệp mật khẩu của bạn đến máy chủ, trong đó 'mật khẩu' là tên của trường biểu mẫu mà / etc / passwd sẽ là đầu vào:

curl -F password=@/etc/passwd www.mypasswords.com

Vì vậy, trong trường hợp của bạn, đây sẽ là một cái gì đó như
curl -F file=@/some/file/on/your/local/disk http://localhost:8080


11
Giải pháp này có thêm lợi ích là có thể đặt tên cho tệp được gửi (không giống như giải pháp đã chọn ở trên) và do đó bạn có thể gửi nhiều tệp.
David Cairns

13
Định dạng file=@-này rất hữu ích nếu bạn muốn đưa tập tin của mình vào.
Steven Lu

2
Trong trường hợp bất cứ ai đang tìm cách gửi một tập tin và thông tin khác: sử dụng -F key = val -F key = val nhiều lần bạn cần. Kèm theo tất cả các tham số bài đăng trong một chuỗi lớn được phân tách bằng & không hoạt động.
hgolov

Bạn có thể đề cập đến cách chuẩn bị trang web nhận để có thể nhận các tệp được tải lên qua curl từ máy tính để bàn không?
SexyBeast

@Coolvogel: Giống như bất kỳ trường tải lên tệp nào khác; không có xử lý đặc biệt cụ thể cho curl.
Piskvor rời khỏi tòa nhà vào

47

Bạn có thể sử dụng tùy chọn --data với tập tin.

Viết nội dung xml vào một tệp có tên là Soap_get.xml và sử dụng lệnh curl để gửi yêu cầu:

curl -X POST - tiêu đề "Loại nội dung: text / xml; charset = UTF-8" --data @ soap_get.xml your_url


Đây phải là câu trả lời vì OP đang hỏi về việc đăng một tệp không phải là văn bản nội tuyến.
FearlessFuture

Điều này là cần thiết để nó hiển thị "không thoát" cho tôi bằng máy chủ web mùa xuân, cảm ơn!
rogerdpack

20

Với Jenkins 1,494, tôi đã có thể gửi một tập tin vào một tham số công việc trên Ubuntu Linux 12.10 sử dụng curlvới --formcác thông số:

curl --form name=myfileparam --form file=@/local/path/to/your/file.xml \
  -Fjson='{"parameter": {"name": "myfileparam", "file": "file"}}' \
  -Fsubmit=Build \
  http://user:password@jenkinsserver/job/jobname/build

Trên máy chủ Jenkins, tôi đã cấu hình một công việc chấp nhận một tham số duy nhất: tham số tải lên tệp có tên myfileparam.

Dòng đầu tiên của cuộc gọi curl đó xây dựng một biểu mẫu web với một tham số có tên myfileparam(giống như trong công việc); giá trị của nó sẽ là nội dung của một tệp trên hệ thống tệp cục bộ có tên /local/path/to/your/file.txt. Các @tiền tố biểu tượng cho curl để gửi một tập tin địa phương thay vì tên tập tin nhất định.

Dòng thứ hai xác định một yêu cầu JSON khớp với các tham số biểu mẫu trên dòng một: tham số tệp có tên myfileparam.

Dòng thứ ba kích hoạt nút Build của biểu mẫu. Dòng thứ tư là URL công việc với hậu tố "/ build".

Nếu cuộc gọi này thành công, curl trả lại 0. Nếu không thành công, lỗi hoặc ngoại lệ từ dịch vụ được in ra bàn điều khiển. Câu trả lời này lấy rất nhiều từ một bài đăng trên blog cũ liên quan đến Hudson , mà tôi đã giải cấu trúc và làm việc lại cho nhu cầu của riêng tôi.


6

Đây là cách bạn có thể POST XML trên Windows bằng dòng lệnh curl trên Windows. Sử dụng tốt hơn tập tin batch / .cmd cho điều đó:

curl -i -X POST -H "Content-Type: text/xml" -d             ^
"^<?xml version=\"1.0\" encoding=\"UTF-8\" ?^>                ^
    ^<Transaction^>                                           ^
        ^<SomeParam1^>Some-Param-01^</SomeParam1^>            ^
        ^<Password^>SomePassW0rd^</Password^>                 ^
        ^<Transaction_Type^>00^</Transaction_Type^>           ^
        ^<CardHoldersName^>John Smith^</CardHoldersName^>     ^
        ^<DollarAmount^>9.97^</DollarAmount^>                 ^
        ^<Card_Number^>4111111111111111^</Card_Number^>       ^
        ^<Expiry_Date^>1118^</Expiry_Date^>                   ^
        ^<VerificationStr2^>123^</VerificationStr2^>          ^
        ^<CVD_Presence_Ind^>1^</CVD_Presence_Ind^>            ^
        ^<Reference_No^>Some Reference Text^</Reference_No^>  ^
        ^<Client_Email^>john@smith.com^</Client_Email^>       ^
        ^<Client_IP^>123.4.56.7^</Client_IP^>                 ^
        ^<Tax1Amount^>^</Tax1Amount^>                         ^
        ^<Tax2Amount^>^</Tax2Amount^>                         ^
    ^</Transaction^>                                          ^
" "http://localhost:8080"

Làm thế nào để bạn định dạng chuỗi xml trước khi sử dụng với lệnh curl
Chinmoy

3

Nếu bạn có nhiều tiêu đề thì bạn có thể muốn sử dụng như sau:

curl -X POST --header "Content-Type:application/json" --header "X-Auth:AuthKey" --data @hello.json Your_url

3

Bạn có thể sử dụng lệnh này:

curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json' --header 'Authorization: <<Removed>>' -F file=@"/home/xxx/Desktop/customers.json"  'API_SERVER_URL' -k 

1

Nếu bạn đang sử dụng curl trên Windows:

curl -H "Content-Type: application/xml" -d "<?xml version="""1.0""" encoding="""UTF-8""" standalone="""yes"""?><message><sender>Me</sender><content>Hello!</content></message>" http://localhost:8080/webapp/rest/hello
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.