httpie 的口号是「面向人类的 HTTP 客户端」。它干的事和 curl 一样:发请求、看响应。区别在两件事上:命令短,输出好看。代价是每次启动要多等一秒。
装完是一个 http.exe
它是个 Python 包,装完之后命令行里多一个 http.exe。版本 3.2.4,不是单文件,依赖 Python 环境。
pip install httpie
http --version
→ 3.2.4
如果你不想污染全局环境,装进 venv 或者用 pipx install httpie 隔离,后者更适合当成日常命令用。
命令比 curl 短一半
同样的请求,两种写法:
curl -X GET https://httpbin.org/json -H "Accept: application/json"
http GET https://httpbin.org/json Accept:application/json
它省掉了 -X、省掉了引号,请求头直接写 名字:值。GET 这个动词可以省略,因为默认就是 GET,只写 http 域名 也行。
发 POST 表单更明显:
http POST https://httpbin.org/post name=张三 age:=28
注意 age:=28 那个冒号等号,它表示「这个值按 JSON 数字传,不是字符串」。同样的语义在 curl 里要拼一长串 -d '{"name":"张三","age":28}'。
JSON 自动格式化
这是它最值的地方。同一个接口,curl 返回的是一行压缩的 JSON,httpie 直接给你展开、缩进、上色:
{
"slideshow": {
"author": "Yours Truly",
"date": "date of publication",
"slides": [
{
"title": "Wake up to WonderWidgets!",
"type": "all"
}
]
}
}
键名一种颜色、字符串一种颜色、数字一种颜色,一眼能看出结构。要只看响应头就加 --headers,只要正文用 --body,想连请求过程一起看用 --verbose。
代价:每次启动 1.2 秒
这是它和 curl 最大的差距。http --version 这个完全不联网的命令,连跑 5 次:
| 项目 | 耗时 | 说明 |
|---|---|---|
| http --version(5 次中位) | 1234 毫秒 | 纯启动,无网络 |
| http --version 最快 | 1224 毫秒 | 缓存全热 |
| http --version 最慢 | 1291 毫秒 | — |
1.2 秒花在 Python 解释器启动和一堆依赖 import 上。同样的场景,curl 是一个编译好的二进制,启动在几十毫秒量级。
放进真实请求里对比,同一个 https://httpbin.org/json,各跑 3 次:
| 工具 | 中位耗时 | 拆解 |
|---|---|---|
| curl | 1444 毫秒 | 几乎全是网络 |
| httpie | 2441 毫秒 | 网络 + 约 1000 毫秒启动 |
这个环境走代理,网络本身就慢,所以两边都到了 1.4 秒以上。但差值稳定在 1 秒左右,就是启动开销。
高频脚本里别用它
如果你在写循环、批量探测、CI 流水线,一次多 1 秒是致命的。100 个请求就差 100 秒。这种场景用 curl,或者用同作者出的 httpie 库模式(在 Python 代码里 import,不启进程)。
它真正舒服的场景是手工调接口:改一个参数、敲一次、看结果。这时候多等一秒完全无所谓,而格式化的 JSON 能省掉你复制到编辑器里再格式化的动作。
它还支持会话和文件上传
--session=名字 会把 cookie 和自定义头存在本地文件里,下次带同一个名字就自动带上。调需要登录的接口时,登录一次之后所有请求都不用再传 token。
上传文件用 http POST 地址 文件@路径,下载用 http --download 地址,后者带进度条和断点续传。
有一个会直接卡住的情况:如果目标站用自签证书,httpie 会直接报错退出,报的是 SSLError: certificate verify failed,不会像浏览器那样给你一个「继续访问」的选项。临时绕过要加 --verify=no,但这等于关掉了校验,只适合内网调试。
还有一处容易忽略的差异:curl 默认不跟随重定向,httpie 默认跟随,并且会在输出里显示 301 之后的最终地址。调试跳转链时这个默认值更省事,但如果你想看第一跳的响应头,要加 --follow=no,否则永远看不到原始的 302。
输出格式上,curl 给你的是服务器返回的原始字节,管道给 jq 处理很自然;httpie 会先格式化再输出,所以 http ... | jq 这种用法反而多余,它自带的 --format-options 已经能控制缩进和排序。
没测的部分列一下,4 项:会话文件的落盘格式 / 大文件上传的稳定性 / HTTPS 证书校验的细节 / 与 httpie desktop 版的差异。









