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 次:

工具中位耗时拆解
curl1444 毫秒几乎全是网络
httpie2441 毫秒网络 + 约 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 版的差异。