cURL là gói chứa các công cụ khác nhau để truyền dữ liệu giữa server từ xa. Nó hỗ trợ FTP, Windows Shares, Mail Servers, và tất nhiên Web Servers dùng HTTP.
Tải file từ shell Linux thường thực hiện dùng lệnh cURL như sau:
curl https://example.org/file.zip --output file.zip
Điều này tạo request cho file dùng phương thức GET và đơn giản tải xuống.
Bài viết này sẽ chi tiết cách dùng cURL để tạo POST request, bao gồm form data. Điều này có thể hữu ích nếu server yêu cầu credentials để tải file, hoặc nếu bạn xây dựng script tự động submit dữ liệu vào web form để lưu vào database.
Nó cũng sẽ đề cập submit dữ liệu XML hoặc JSON từ file để dùng với REST API.
POST các trường URL Encoded dùng cURL
Cho ví dụ của chúng ta, chúng ta sẽ submit form data sau:
| Tên trường | Giá trị |
|---|---|
| field1 | value1 |
| field2 | value2 |
Dữ liệu sẽ được submit đến URL https://example.org/submit.php. Địa chỉ trên example.org không thực sự tồn tại, chỉ là domain web chúng ta dùng an toàn cho ví dụ. submit.php cũng là tên ví dụ cho script submit form và không tham chiếu đến gì cụ thể.
Dữ liệu form có thể truyền cho POST request như một chuỗi đơn với mỗi trường form và giá trị được định nghĩa bởi name=value, và tách nhau bởi & dùng tùy chọn –data:
curl --data "field1=value1&field2=value2" https://example.org/submit.php
Tuy nhiên, điều này không lý tưởng, vì nó yêu cầu dữ liệu URL encoded – tức là dữ liệu đã thay thế dấu cách và dấu chéo bằng mã đặc biệt để định dạng cho gửi qua HTTP. Bạn có thể làm thủ công, nhưng cURL có thể làm giúp bạn dùng –data-urlencode:
curl --data-urlencode "field1=value1&field2=value2" https://example.org/submit.php
Tên trường không được URL encoded – nếu bạn muốn encoded chúng hãy thêm tiền tố =:
curl --data-urlencode "=user name=Linus Torvalds" https://example.org
Chúng ta sẽ dùng –data-urlencode cho các ví dụ sau thay vì –data để tạo POST request cho dễ dàng.
Các trường URL Encoded chỉ định riêng biệt
Mỗi cặp tên/giá trị trường form có thể truyền riêng biệt – làm cho mọi thứ đơn giản hơn nhiều để đọc:
curl --data-urlencode "field1=value1" --data-urlencode "field2=value2" https://example.org/submit.php
Upload Multipart/File dùng cURL
Request multipart form, bao gồm file, có thể submit qua POST dùng tùy chọn –form. Ví dụ dưới sẽ upload myfile.txt vào trường form fileupload:
curl --form "admin@wsxdn.com" https://example.org/submit.php
Multipart với trường và file, và tên file
Cặp tên/giá trị trường form cũng có thể bao gồm với upload file, và filename cho file upload nếu bạn muốn đổi nó:
curl --form "admin@wsxdn.com;filename=newfilename.txt" --form field1=value1 --form field2=value2 https://example.org/submit.php
Không có dữ liệu
Để tạo POST request không có dữ liệu, chỉ cần truyền chuỗi rỗng:
curl --data-urlencode '' https://example.org/submit.php
Hiển thị tiến trình upload file
Để theo dõi tiến trình upload, thêm tùy chọn -o output để hiển thị progress bar:
curl --tr-encoding -X POST -v -# -o output -T myfile.dat https://example.org/submit.php
Submit dữ liệu lưu trong file
Nếu upload dữ liệu đã lưu trong file, tất cả có thể submit cùng lúc, thay vì parse ra lệnh cURL:
curl --data-urlencode @myfile.txt https://example.org/submit.php
Dữ liệu JSON và XML có thể POST cho dịch vụ API lập trình bằng cách thêm header thích hợp:
curl -X POST --data-urlencode @myfile.txt https://example.org/submit.php --header "Content-Type:text/xml" curl -X POST --data-urlencode @myfile.txt https://example.org/submit.php --header "Content-Type:application/json"
Kết luận
Thành thạo cURL quan trọng nếu bạn thường xuyên làm việc trên dòng lệnh Linux. Nó có thể thực hiện nhiều tác vụ mà bạn thường cần trình duyệt web đầy đủ, ngoài việc dùng tương tác với API lập trình và truyền dữ liệu đến/từ server của bạn.
Xem các bài viết khác về Linux shell và scripting ở đây!