curl vs HTTPie
The main differences as I (Daniel Stenberg) see them. Please consider my bias towards curl since after all, curl is my baby.
Please let me know if you have other thoughts or comments on this document. File issues or pull-requests if you find problems or have improvements.
What both commands do
- Perform HTTP(S) operations specified as URLs
- Require an option to follow redirects
- Support
-v
to show sent request headers - Support HTTP and SOCKS proxies
- HTTP Range requests
- netrc support
Transfer performance comparsion
Tranfering 80GB from a localhost Apache HTTP server to /dev/null on Linux.
httpie 0.9.8 needed 153 seconds. 535 MB/sec
curl 7.51.0 needed 25 seconds. 3276 MB/sec
curl
- Written in C and uses libcurl
- supports many other protocols as well apart from HTTP(S)
- supports any amount of URLs on the command line
- can send binary POSTs
- Supports multiple HTTP methods in a single command line for different URLs
- Documented in a man page for offline documentation
- supports HTTP/1.0 requests
- features URL "globbing" for ranges and sequences
- Allows more invasive header modifications, like passing in invalid letters in custom headers (
Höst:
), replacingContent-Length:
in a POST and removing theHost:
header from a request. Or just adding a header without a space after the colon. - Supports happy eyeballs or explicit ipv4/ipv6 use
- Supports custom connection tricks like with --resolve and --connect-to
- HTTP/2 support (for both HTTP:// and HTTPS:// URLs)
- HTTP/3 support
- Offers compression using gzip, brotli and zstd
- Ships by default in macOS and Windows 10
HTTPie "cURL-like tool for humans"
- Written in Python and uses Requests
- Supports only a single URL on the command line!
- Has JSON support
- Colored output (curl only does bold headers)
- Assumes "name=value" for POSTS. "name:value" or just "data" is impossible to send as arguments and has to be sent to stdin (not to mention POSTing
Connection:
- which instead will be intepreted as remove that header please) - Can you do a multipart POST with two text-only fields?
- Forbids UTF-8 symbols in HTTP request headers
- Doesn't allow a user to change the Content-Length: header
- Has an "Auth plugin" system that supports many more auth types than curl
- Can't send the same header field name multiple times in a request.
- Has no official man page
- No HTTP/2 support
- No HTTP/3 support
- No Happy eyeballs
- Lacks HTTPS proxy support (HTTPS to the proxy, independently of the server's protocol)
- Missing brotli and zstd support
Updated: November 8, 2024 13:47 (Central European, Stockholm Sweden)