Sử Dụng cURL Để Gửi Post Request

Nguyễn Đạt

cURL (phát âm tương tự "See You Are El") là chương trình chạy trên cửa sổ dòng lệnh cung cấp các tính năng mạnh mẽ để thực hiện việc truyền tải dữ liệu giữa các máy tính trong network. Một trong những tính năng của cURL thường được các lập trình viên và nhà quản trị hệ thống sử dụng đó là thực hiện việc gửi các HTTP POST request mà chúng ta sẽ tìm hiểu trong bài viết này.

Cú Pháp Gửi POST Request với cURL

Có hai cú pháp khác nhau để thiết lập phương thức HTTP cho request gửi đi bởi cURL là POST:

  • Sử dụng tuỳ chọn -d. Ví dụ curl -d "username=johndoe&password=abcd1234" http://httpbin.org/post.
  • Sử dụng tuỳ chọn -X với giá trị là POST. Ví dụ: curl -X POST http://httpbin.org/post

Ở hai ví dụ trên cURL đều thực hiện việc gửi request theo phương thức HTTP POST. Tuy nhiên khi sử dụng tuỳ chọn -d bạn cần truyền dữ liệu cho request gửi đi trong khi -X thì điều này là tuỳ ý.

Gửi POST Request Kèm Theo Dữ Liệu

Khi sử dụng cách đầu tiên thì tuỳ chọn -d được dùng để truyền dữ liệu cho request. Chúng ta sẽ đưa vào giá trị theo kiểu URL encoding như sau:

field_1=value_1&field_2=value_2 &field_3=value_3...

Bây giờ bạn hãy mở cửa sổ dòng lệnh terminal và chạy câu lệnh sau:

$ curl -d "username=johndoe&password=abcd1234" http://httpbin.org/post

Bạn sẽ thấy kết quả trả về như sau:

cURL Gửi request với form data

Lưu ý giá trị của trường Content-Type trong trường headers lúc này là application/x-www-form-urlencoded. Ngoài ra thì dữ liệu gửi đi được hiển thị trong trường form, hay nói cách khác chúng ta đã thực hiện việc gửi dữ liệu request dưới dạng form data.

Trường hợp sử dụng cú pháp thứ 2 thì để truyền dữ liệu cho request, bạn sẽ sử dụng kết hợp với tuỳ chọn -F (form) như sau:

curl -X POST -F "username=johndoe" -F "password=abcd1234" http://httpbin.org/post

Nếu chạy câu lệnh trên bạn sẽ thấy kết quả trả về như sau:

cURL Gửi request với form data

Lưu ý giá trị của trường Content-Type trong trường headers lúc này là multipart/form-data; boundary=------... thay vì application/x-www-form-urlencoded như trong ví dụ trước đó.

Ngoài ra thì trong cách thứ 2 này bạn cũng hoàn toàn có thể kết hợp với tuỳ chọn -d, ví dụ như sau:

curl -X POST -d "username=johndoe&password=abcd1234" http://httpbin.org/post

Trường hợp bạn muốn gửi dữ liệu dạng JSON thì sao. Câu trả lời là sử dụng tuỳ chọn -H hay header để thiết lập trường Content-Type cho request header, ví dụ :

curl -X POST -H "Content-Type: application/json" -d '{"username":"johndoe", "password":"abcd1234"}' http://httpbin.org/post

Kết quả của việc chạy câu lệnh trên như sau:

Gửi request với dữ liệu dạng JSON

Lúc này bạn sẽ thấy trong kết quả trả về, dữ liệu được đưa vào trường data thay vì form như trước.

Ngoài ra chúng ta cũng có thể gửi dữ liệu nằm trong file:

$ curl -X POST -d "@/Users/codehub.vn/Documents/creadentials.json" http://httpbin.org/post

Với nội dung tập tin creadentials.json như sau:

{
  "username":"johndoe",
  "password":"abcd"
}

Hoặc:

$ curl -X POST -d "@/Users/codehub.vn/Documents/creadentials.txt" http://httpbin.org/post

Với nội dung tập tin creadentials.txt như sau:

username=johndoe&password=abcd1234

Trong cả hai trường hợp trên cURL sẽ tự động thiết lập giá trị cho Content-Type trong header phù hợp với nội dung của file được sử dụng.

Sử Dụng cURL Để Upload File

Cú pháp sử dụng cURL để upload tập tin như sau:

curl -F "FILE_INPUT_NAME=@/PATH/TO/UPLOAD_FILE"

Ví dụ sau đây sẽ upload lên server tập tin nằm ở địa chỉ /Users/codehub.vn/Pictures/avatar.png ứng với trường input có tên là profile_picture:

$ curl -F 'profile_picture=@/Users/codehub.vn/Pictures/avatar.png' http://httpbin.org/post

Chúng ta cũng có thể upload nhiều file trong cùng một request trong cùng một câu lệnh cURL:

$ curl -F 'profile_picture_1=@/Users/codehub.vn/Pictures/avatar_1.png' http://httpbin.org/post -F 'profile_picture_2=@/Users/codehub.vn/Pictures/avatar_2.png' http://httpbin.org/post

Câu lệnh trên sẽ upload hai file /Users/codehub.vn/Pictures/avatar_1.png/Users/codehub.vn/Pictures/avatar_2.png ứng với hai trường input tên là profile_picture_1profile_picture_2.

Thêm Phản Hồi

Bài Viết Liên Quan