Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

curl & HTTPie — CLI alternatives

Mở đầu — vì sao bài này quan trọng

Trong suốt khóa học, chúng ta đã dành rất nhiều thời gian để làm chủ Postman và Newman. Đó là những công cụ mạnh, có giao diện đẹp, có collection, có environment, có report. Nhưng nếu bạn đã đi làm QA/SDET một thời gian, bạn sẽ nhận ra một sự thật hơi phũ: không phải lúc nào bạn cũng có Postman trong tay.

Hãy tưởng tượng bạn SSH vào một server production của công ty để điều tra một sự cố lúc 2 giờ sáng. Trên con server Ubuntu trần trụi đó không có giao diện đồ họa, không có Postman, thậm chí không có cả quyền cài đặt phần mềm mới. Nhưng bạn cần kiểm tra ngay xem API nội bộ http://localhost:8080/health có trả về đúng không. Lúc này, thứ duy nhất cứu bạn là một dòng lệnh curl gõ thẳng vào terminal.

Đó chính là lý do bài này quan trọng. curlHTTPie là hai công cụ dòng lệnh (CLI — Command Line Interface) để gọi API mà không cần bất kỳ giao diện nào. Chúng nhẹ, nhanh, có mặt ở khắp nơi, và đặc biệt hữu ích cho việc debug nhanh, viết script tự động, hay chia sẻ một request cho đồng nghiệp chỉ bằng một dòng text dán vào Slack. Một QA giỏi cần biết cả hai thế giới: thế giới GUI đẹp đẽ của Postman, và thế giới CLI thô ráp nhưng cực kỳ linh hoạt này.

Khái niệm cốt lõi

curl — con dao Thụy Sĩ của thế giới HTTP

curl (viết tắt của "Client URL") là công cụ CLI ra đời từ năm 1997, tuân theo chuẩn POSIX và có sẵn trên hầu như mọi hệ điều hành Linux, macOS, và cả Windows 10 trở lên. Điều tuyệt vời là bạn không cần cài gì cả — nó đã nằm sẵn đó. Cú pháp cơ bản nhất chỉ là:

curl https://api.shop.vn/products

Lệnh trên gửi một request GET và in toàn bộ response body ra màn hình. Để làm việc thực tế hơn, bạn cần vài flag quan trọng:

GET kèm header Authorization

curl -H "Authorization: Bearer $TOKEN" https://api.shop.vn/products

POST gửi JSON

curl -X POST https://api.shop.vn/orders \ -H "Content-Type: application/json" \ -d '{"product_id": 42, "quantity": 2}'

Xem cả header của response (verbose gọn)

curl -i https://api.shop.vn/products

Xem toàn bộ quá trình request/response chi tiết

curl -v https://api.shop.vn/products

Những flag bạn sẽ dùng nhiều nhất:

  • -X (hoặc --request): chỉ định HTTP method (POST, PUT, DELETE, PATCH). Với GET thì không cần.
  • -H (--header): thêm một header. Muốn nhiều header thì lặp lại -H nhiều lần.
  • -d (--data): gửi body. Khi có -d, curl mặc định chuyển sang method POST.
  • -i (--include): in kèm response header vào output.
  • -v (--verbose): in chi tiết mọi thứ, kể cả request curl gửi đi (dòng bắt đầu bằng >) và response nhận về (dòng bắt đầu bằng <). Đây là flag debug quan trọng nhất.
  • -o file.json (--output): lưu response vào file thay vì in ra màn hình.
  • -s (--silent): ẩn progress bar, thường dùng khi viết script.
  • -w: in ra thông tin bổ sung như thời gian phản hồi, HTTP status code.
Điểm mạnh của curl là tính phổ quát. Bất kỳ tài liệu API nào trên thế giới cũng có ví dụ bằng curl. Postman thậm chí có nút "Code" cho phép export request thành lệnh curl. Ngược lại, bạn có thể dán một lệnh curl vào Postman để nó tự parse thành request — đây là mẹo cực kỳ hữu ích khi đồng nghiệp gửi cho bạn một lệnh curl trong Slack.

HTTPie — curl dành cho con người

curl mạnh nhưng output của nó khá "khô": JSON in ra một cục không màu, không format, khó đọc. HTTPie sinh ra để giải quyết đúng vấn đề đó. Slogan chính thức của nó là "curl for humans" — curl dành cho con người.

HTTPie không có sẵn, bạn phải cài:

macOS

brew install httpie

Ubuntu/Debian

sudo apt install httpie

Qua pip (Python)

pip install httpie

Sau khi cài, lệnh gọi là http (hoặc https). Cú pháp trực quan hơn hẳn:

GET — mặc định luôn là GET, không cần khai báo

http GET https://api.shop.vn/products

GET kèm header — dùng cú pháp Header:Value

http https://api.shop.vn/products "Authorization:Bearer $TOKEN"

POST gửi JSON — dùng cú pháp field=value, HTTPie tự tạo JSON

http POST https://api.shop.vn/orders product_id:=42 quantity:=2

Query param — dùng field==value (hai dấu bằng)

http https://api.shop.vn/products category==laptop page==2

Điểm khác biệt cú pháp cần nhớ:

  • Header:Value (một dấu hai chấm) → thêm header.
  • field=value (một dấu bằng) → thêm field vào JSON body dạng chuỗi.
  • field:=value (dấu hai chấm bằng) → thêm field vào JSON body dạng số/boolean/mảng (kiểu "raw JSON").
  • param==value (hai dấu bằng) → thêm query string param.
Ưu điểm lớn nhất của HTTPie là output: nó tự động format JSON, tô màu syntax, in header rõ ràng. Khi bạn gọi một API trả về JSON lồng nhau phức tạp, HTTPie hiển thị nó đẹp và dễ đọc ngay lập tức, không cần pipe qua công cụ khác. Nó cũng mặc định giả định bạn gửi JSON, nên bạn không phải gõ -H "Content-Type: application/json" như curl.

Khi nào dùng cái nào?

Đây là bảng tư duy đơn giản: dùng curl khi bạn cần tính phổ quát (script CI/CD, server production không cài được gì thêm, tài liệu chính thức). Dùng HTTPie khi bạn debug thủ công trên máy cá nhân và muốn đọc kết quả cho dễ. Còn cả hai đều không thay thế Postman cho việc quản lý collection lớn, environment nhiều tầng, hay chạy test suite hàng trăm request — đó vẫn là sân của Postman/Newman.

Tình huống thực tế

Tình huống 1 — Debug production lúc nửa đêm ở Tiki

Một bạn QA tên Minh làm tại một sàn thương mại điện tử lớn (gọi là Tiki cho dễ hình dung). 2 giờ sáng, hệ thống báo động: API /api/v2/cart trả lỗi 500 hàng loạt. Minh SSH vào server staging để kiểm tra. Server này là Ubuntu trần, không GUI, không Postman.

Minh gõ ngay:

curl -v -H "Authorization: Bearer $TOKEN" \
  https://staging-api.tiki.internal/api/v2/cart/12345

Nhờ flag -v, Minh thấy được toàn bộ: request header gửi đi đúng, nhưng response trả về HTTP/1.1 500 kèm body báo lỗi "database connection timeout". Chỉ trong 30 giây, Minh xác định được đây không phải lỗi ứng dụng mà là lỗi kết nối database. Bạn ấy escalate ngay cho team DevOps thay vì mất hàng giờ nghi ngờ code.

Bài học: Trong tình huống production khẩn cấp, không có thời gian cài công cụ hay mở GUI. curl -v là công cụ chẩn đoán nhanh nhất vì nó có sẵn ở mọi nơi và cho bạn thấy raw truth của cuộc giao tiếp HTTP.

Tình huống 2 — Reproduce bug từ một lệnh curl trong Slack

Một startup fintech ở TP.HCM (gọi là VietPay) có quy trình: khi tester phát hiện bug API, họ dán nguyên lệnh curl vào ticket Jira để dev reproduce chính xác. Bạn tester Lan tìm ra một bug: khi gửi số tiền âm, API tạo giao dịch vẫn chấp nhận. Thay vì mô tả dài dòng "mình vào Postman, chọn collection này, tab kia...", Lan chỉ dán:

curl -X POST https://sandbox.vietpay.vn/api/transactions \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_test_abc123" \
  -d '{"amount": -500000, "currency": "VND", "to": "0909123456"}'

Dev copy nguyên dòng đó, dán vào terminal, reproduce bug trong 5 giây. Không hiểu lầm, không "trên máy tôi chạy được". Lệnh curl trở thành một hợp đồng chính xác về đầu vào của request.

Bài học: Một lệnh curl là dạng "reproducible" nhất của một API request — nó tự chứa mọi thông tin (URL, method, header, body) trong một dòng text có thể copy-paste. Đây là lý do curl thống trị trong tài liệu bug report và tài liệu API.

Tình huống 3 — Kiểm tra nhanh trong lúc dev, dùng HTTPie

Bạn Dũng, một SDET tại một công ty logistics ở Đông Nam Á, đang cùng team backend phát triển API tra cứu đơn hàng. API còn đang thay đổi liên tục nên chưa đáng để tạo Postman collection. Dũng cần gọi thử và đọc kết quả JSON lồng nhau nhiều tầng liên tục hàng chục lần trong ngày. Anh dùng HTTPie:

http https://dev-api.logi.sea/orders/SGN20260627 "Authorization:Bearer $TOKEN"

Output ra được tô màu, format đẹp, Dũng thấy ngay field status: "delivered" nằm đỏ chót và estimated_time bị null — chính là bug. Nếu dùng curl, anh sẽ phải pipe thêm | jq để đọc được, còn HTTPie làm sẵn điều đó.

Bài học: Trong vòng lặp phát triển nhanh (dev loop), khi API chưa ổn định và bạn cần đọc response bằng mắt liên tục, HTTPie tiết kiệm rất nhiều "ma sát" nhờ output đẹp mặc định.

Hướng dẫn từng bước

Hãy thực hành một luồng hoàn chỉnh: đăng nhập lấy token, rồi dùng token đó gọi API được bảo vệ. Chúng ta dùng một API giả định https://api.shop.vn.

Bước 1 — Gọi API đăng nhập bằng curl để lấy token.

curl -s -X POST https://api.shop.vn/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "test@shop.vn", "password": "123456"}'

Response trả về JSON kiểu {"token": "eyJhbGc..."}. Flag -s để ẩn progress bar cho output sạch.

Bước 2 — Trích token và lưu vào biến môi trường. Nếu máy bạn có jq (công cụ xử lý JSON trên CLI), làm gọn thế này:

TOKEN=$(curl -s -X POST https://api.shop.vn/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "test@shop.vn", "password": "123456"}' | jq -r '.token')

echo $TOKEN # kiểm tra token đã có chưa

Bước 3 — Dùng token gọi API cần xác thực.

curl -i -H "Authorization: Bearer $TOKEN" https://api.shop.vn/me/orders

Flag -i để bạn thấy cả status code (HTTP/1.1 200 OK) lẫn body.

Bước 4 — Làm điều tương tự bằng HTTPie để so sánh.

Đăng nhập

http POST https://api.shop.vn/auth/login email=test@shop.vn password=123456

Gọi API bảo vệ

http https://api.shop.vn/me/orders "Authorization:Bearer $TOKEN"

Để ý cách HTTPie ngắn gọn hơn: không cần -X POST (nó tự hiểu khi có body), không cần khai báo Content-Type JSON.

Bước 5 — Đo thời gian phản hồi bằng curl (một phần của smoke test).

curl -o /dev/null -s -w "Status: %{http_code} | Time: %{time_total}s\n" \
  https://api.shop.vn/products

Lệnh này vứt body đi (-o /dev/null), chỉ in ra status code và tổng thời gian. Rất hữu ích để nhét vào một script kiểm tra sức khỏe API định kỳ.

Bước 6 — Đưa curl vào một smoke test script đơn giản.

#!/bin/bash
STATUS=$(curl -o /dev/null -s -w "%{http_code}" https://api.shop.vn/health)
if [ "$STATUS" -eq 200 ]; then
  echo "API OK"
else
  echo "API FAIL với status $STATUS"
  exit 1
fi

Đây chính là điểm giao thoa với CI/CD: một script curl nhỏ như trên có thể chạy trong pipeline để chặn deploy nếu API chết.

Lỗi thường gặp & mẹo

Lỗi 1 — Quên -H "Content-Type: application/json" với curl. Khi POST bằng -d, curl mặc định gửi Content-Type là application/x-www-form-urlencoded, không phải JSON. Nếu server yêu cầu JSON, request của bạn sẽ bị từ chối dù body trông đúng. Luôn thêm header này. (HTTPie không dính lỗi này vì mặc định của nó là JSON.)

Lỗi 2 — Rắc rối với dấu nháy trong body JSON. Trên shell, JSON có dấu nháy kép bên trong nên bạn phải bọc toàn bộ body bằng nháy đơn '...'. Nếu dùng nháy kép bọc ngoài, các dấu " bên trong sẽ vỡ. Với body phức tạp, mẹo an toàn là lưu JSON vào file rồi dùng curl -d @body.json.

Lỗi 3 — Lỗi SSL certificate với môi trường staging. Server staging nội bộ thường dùng self-signed certificate, khiến curl báo lỗi SSL certificate problem. Bạn có thể thêm -k (--insecure) để bỏ qua kiểm tra SSL. Cảnh báo: chỉ dùng -k cho môi trường test nội bộ, tuyệt đối không dùng khi gọi API production thật vì nó vô hiệu hóa bảo vệ chống tấn công man-in-the-middle.

Lỗi 4 — Token bị lộ trong lịch sử shell. Khi bạn gõ token thẳng vào lệnh, nó lưu vào file ~/.bash_history hoặc ~/.zsh_history. Trên máy dùng chung, đây là rủi ro bảo mật. Mẹo: luôn đưa token vào biến môi trường (export TOKEN=...) và tham chiếu $TOKEN, hoặc dùng công cụ quản lý secret. Điều này liên hệ với tư duy quản lý secret mà Postman Vault giải quyết ở phía GUI.

Mẹo 1 — Format JSON của curl bằng jq. Nếu quen curl nhưng muốn output đẹp như HTTPie, chỉ cần pipe: curl -s https://api.shop.vn/products | jq. Bạn có được cả sức mạnh phổ quát của curl lẫn output đẹp.

Mẹo 2 — Chuyển đổi hai chiều với Postman. Trong Postman, nút "Code" (biểu tượng </>) cho phép export request hiện tại thành lệnh curl để dán vào tài liệu. Ngược lại, dán một lệnh curl vào ô URL của Postman, nó tự parse thành request đầy đủ. Đây là cầu nối cực kỳ tiện giữa hai thế giới CLI và GUI.

Mẹo 3 — Dùng --data-urlencode khi giá trị có ký tự đặc biệt. Nếu bạn gửi form data chứa dấu &, khoảng trắng, hoặc tiếng Việt có dấu, dùng curl --data-urlencode "keyword=máy tính" để curl tự encode đúng, tránh vỡ request.

Bài tập thực hành

Hãy chọn một API công khai miễn phí, ví dụ https://jsonplaceholder.typicode.com hoặc https://httpbin.org, rồi làm các bài sau:

  • Cơ bản với curl: Gửi request GET tới https://httpbin.org/get với một header tùy chỉnh X-Test-Header: vietnamcos. Dùng -v để xác nhận server nhận đúng header của bạn (httpbin sẽ echo lại header trong response).
  • POST JSON: Gửi POST tới https://httpbin.org/post với body JSON {"course": "API Testing", "lesson": 34}. Xác nhận response phản chiếu đúng body bạn gửi. Nhớ thêm Content-Type.
  • So sánh HTTPie: Cài HTTPie và làm lại bài 2 bằng http POST httpbin.org/post course="API Testing" lesson:=34. So sánh độ dài lệnh và độ đẹp của output giữa hai công cụ.
  • Đo hiệu năng: Viết một lệnh curl dùng -w để in ra status code và thời gian phản hồi của https://httpbin.org/delay/2. Quan sát xem time_total có phản ánh đúng độ trễ 2 giây không.
  • Nâng cao — smoke test script: Viết một bash script kiểm tra 3 endpoint bất kỳ, in "OK" nếu status 200 và "FAIL" nếu khác, và thoát với mã lỗi khác 0 nếu có bất kỳ endpoint nào hỏng. Đây là bản nháp cho một job kiểm tra sức khỏe trong CI/CD.
Sau khi làm xong, hãy tự trả lời: trong tình huống nào bạn thấy curl tiện hơn, và tình huống nào HTTPie làm bạn dễ chịu hơn?

Tóm tắt

curlHTTPie là hai công cụ CLI để gọi API, bổ sung chứ không thay thế Postman. curl là chuẩn phổ quát, có sẵn ở mọi server, là ngôn ngữ chung của tài liệu API và bug report — bạn dùng nó để debug production khẩn cấp, viết script CI/CD, và chia sẻ request dưới dạng một dòng text reproducible. HTTPie là "curl cho con người", cú pháp trực quan và output tô màu đẹp mặc định — lý tưởng cho việc debug thủ công trong vòng lặp phát triển nhanh.

Những điều cần khắc cốt: với curl luôn nhớ -H "Content-Type: application/json" khi POST JSON, dùng -v để chẩn đoán, -i để xem status, và -w để đo hiệu năng; bọc body JSON bằng nháy đơn; đưa token vào biến môi trường để tránh lộ. Với HTTPie, nhớ ba cú pháp Header:Value, field=value, param==value. Và luôn nhớ cầu nối hai chiều với Postman qua nút Code.

Một QA/SDET trưởng thành không chọn phe GUI hay CLI — họ dùng đúng công cụ cho đúng tình huống. Postman cho suite lớn có tổ chức, curl/HTTPie cho những cú gọi nhanh, chính xác, ở bất cứ đâu.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi