
image-20251111221251940
最近在调试接口的时候,突然想起来之前一个粉丝朋友推荐过的工具——HTTPie。说实话,当时我还挺不以为然的(再次感谢粉丝大哥的分享),毕竟curl用了这么多年,已经形成肌肉记忆了。但是前几天遇到一个复杂的POST请求,需要传JSON数据还要带各种header,curl命令写得我头都大了,这才想起来试试HTTPie。

不试不知道,一试吓一跳!这玩意儿确实比curl好用太多了。今天就来跟大家分享一下我这段时间使用HTTPie的心得体验。
官方文档地址:https://httpie.io/docs/desktop
HTTPie是一个用Python写的命令行HTTP客户端,专门用来测试、调试和与HTTP服务器交互。它的设计理念就是简单易用,语法直观,输出美观。相比curl那一堆参数,HTTPie的语法更接近自然语言。
我记得第一次用curl的时候,光是记住那些参数就花了好长时间。-X指定方法,-H添加header,-d传数据...每次都要翻文档。HTTPie就不一样了,基本上看一眼就能明白什么意思。
安装过程很简单,支持多种方式:
# 使用pip安装
pip install httpie
# macOS用户可以用brew
brew install httpie
# Ubuntu/Debian
sudo apt install httpie
# CentOS/RHEL
sudo yum install httpie我一般习惯用apt装,因为可以装到最新版本。装完之后就可以用http命令了,注意不是httpie。

image-20251111221428839

image-20251111221507706
HTTPie的基本语法格式是这样的:
http [方法] URL [项目]最简单的GET请求:
http httpbin.org/get就这么简单!不需要指定GET方法,因为默认就是GET。输出结果还是彩色的,JSON格式也会自动美化,看起来特别舒服。
如果要发POST请求:
http POST httpbin.org/post name=张三 age:=25注意这里的语法,name=张三表示发送表单数据,age:=25表示发送JSON数据(注意冒号)。这比curl的-d参数直观多了。
发送JSON数据超级简单:
http POST api.example.com/users name=john email=john@example.com age:=30 active:=true这会自动生成JSON格式:
{
"name": "john",
"email": "john@example.com",
"age": 30,
"active": true
}如果你已经有现成的JSON文件,也可以直接读取:
http POST api.example.com/users < user.json发送表单数据用等号:
http --form POST httpbin.org/post name=张三 password=123456或者简写:
http -f POST httpbin.org/post name=张三 password=123456上传文件也很方便:
http --form POST httpbin.org/post file@/path/to/file.txt我之前用curl上传文件,总是记不住那个-F参数的格式,HTTPie这种方式就很直观。
添加请求头用冒号:
http GET api.example.com/data Authorization:"Bearer token123" Content-Type:application/json常用的认证方式HTTPie也有简化写法:
# Basic认证
http -a username:password GET api.example.com/protected
# Bearer token
http GET api.example.com/data Authorization:"Bearer $(cat token.txt)"我经常需要调试需要认证的API,这个功能真的很实用。
HTTPie有个很棒的功能叫会话(Session),可以在多个请求之间保持状态。比如登录后的cookie、认证信息等。
创建一个会话:
http --session=mysession POST api.example.com/login username=admin password=secret然后在后续请求中使用这个会话:
http --session=mysession GET api.example.com/profile这样就不用每次都重新输入认证信息了。会话文件默认保存在~/.httpie/sessions/目录下。
HTTPie的输出控制很灵活,可以选择显示什么内容:
# 只显示响应体
http --body GET httpbin.org/get
# 只显示响应头
http --headers GET httpbin.org/get
# 显示请求和响应的所有内容
http --verbose GET httpbin.org/get
# 不显示响应体(适合大文件)
http --headers GET example.com/bigfile.zip还可以控制输出格式:
# 不美化JSON输出
http --json GET httpbin.org/get
# 输出原始内容
http --raw GET httpbin.org/get我最常用HTTPie的场景就是调试REST API。比如测试一个用户管理接口:
# 获取用户列表
http GET localhost:8080/api/users
# 创建新用户
http POST localhost:8080/api/users name=测试用户 email=test@example.com
# 更新用户信息
http PUT localhost:8080/api/users/1 name=更新后的用户名
# 删除用户
http DELETE localhost:8080/api/users/1语法清晰明了,比curl舒服多了。
测试webhook的时候,经常需要模拟各种POST请求:
http POST webhook.site/unique-id event=user_created user_id:=123 timestamp:=$(date +%s)虽然wget和curl下载文件很方便,但HTTPie也可以:
http --download GET example.com/file.zip会显示下载进度,文件名也会自动识别。
HTTPie支持配置文件,可以设置默认的行为。配置文件位置在~/.httpie/config.json:
{
"default_options": [
"--style=monokai",
"--timeout=60"
],
"implicit_content_type": "json"
}我一般会设置超时时间和默认的颜色主题。HTTPie支持多种颜色主题,可以用http --style=help查看所有可用主题。
HTTPie还有插件系统,可以扩展功能。比如:
# 安装JWT认证插件
pip install httpie-jwt-auth
# 使用JWT认证
http --auth-type=jwt --auth=secret GET api.example.com/protected虽然我用插件不多,但这个扩展性还是很不错的。
说了这么多HTTPie的好处,也不是说curl就没用了。curl功能更强大,支持的协议更多,在脚本中使用也更稳定。但是对于日常的HTTP调试工作,HTTPie确实更方便。
举个例子,同样是发送一个带认证的POST请求:
curl的写法:
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer token123" \
-d '{"name":"john","age":30}' \
https://api.example.com/usersHTTPie的写法:
http POST api.example.com/users Authorization:"Bearer token123" name=john age:=30哪个更简洁一目了然。
我在.bashrc里设置了一些常用的别名:
alias httpj='http --json'
alias httpf='http --form'
alias httpd='http --download'这样用起来更快。
HTTPie的JSON输出已经很美观了,但有时候需要提取特定字段,可以结合jq:
http GET api.github.com/users/octocat | jq '.name'调试的时候经常需要保存请求响应内容:
http GET httpbin.org/get > response.json或者同时保存请求和响应:
http --verbose GET httpbin.org/get > debug.log 2>&1可以把常用的URL或token设置为环境变量:
export API_BASE=https://api.example.com
export API_TOKEN=your_token_here
http GET $API_BASE/users Authorization:"Bearer $API_TOKEN"这样切换不同环境就很方便了。
用HTTPie这段时间也踩了一些坑,分享给大家避免重复踩坑。
URL中有特殊字符的时候需要注意转义,特别是查询参数:
# 错误的写法
http GET api.example.com/search q=hello world
# 正确的写法
http GET api.example.com/search q=="hello world"注意双等号的用法。
JSON中的数字要用:=,不然会被当作字符串:
# 这样age会是字符串"25"
http POST api.example.com/users name=john age=25
# 这样age才是数字25
http POST api.example.com/users name=john age:=25我刚开始用的时候经常忘记这个,导致后端接收到错误的数据类型。
处理中文的时候偶尔会遇到编码问题,一般设置一下环境变量就好了:
export LC_ALL=en_US.UTF-8下载大文件的时候,默认HTTPie会把整个响应加载到内存中,可能会导致内存不足。这时候用--download参数:
http --download GET example.com/bigfile.zipHTTPie支持任意的HTTP方法:
http PATCH api.example.com/users/1 name=newname
http OPTIONS api.example.com/users默认HTTPie会跟随重定向,可以控制这个行为:
# 不跟随重定向
http --follow=0 GET example.com
# 最多跟随5次重定向
http --max-redirects=5 GET example.com需要通过代理访问的时候:
http --proxy=http:http://proxy.example.com:8080 GET api.example.com或者设置环境变量:
export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080网络不好的时候可以调整超时时间:
http --timeout=30 GET slow-api.example.com最后分享一个实际的使用案例。前段时间我们要调试AWS Lambda函数,需要测试各种触发场景和参数组合。
我们有个Lambda函数用来处理用户注册事件,需要测试不同的输入参数和边界情况。虽然可以在AWS控制台测试,但用HTTPie调试Function URL更直观快捷。
首先配置Lambda函数的Function URL(这个在AWS控制台设置),然后就可以用HTTPie直接调用了:
# 测试正常的用户注册
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
event_type=user_register \
user_id:=12345 \
email=test@example.com \
username=testuser测试异常情况,比如缺少必要参数:
# 测试缺少email参数的情况
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
event_type=user_register \
user_id:=12345 \
username=testuser测试不同的事件类型:
# 测试用户登录事件
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
event_type=user_login \
user_id:=12345 \
login_time:=$(date +%s) \
ip_address=192.168.1.100
# 测试用户注销事件
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
event_type=user_logout \
user_id:=12345 \
session_duration:=3600有时候需要测试大量数据的处理:
# 批量用户数据处理
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
event_type=batch_process \
users:='[{"id":1,"name":"user1"},{"id":2,"name":"user2"}]' \
batch_size:=100调试Lambda函数的时候,HTTPie的输出格式化特别有用。Lambda返回的错误信息、执行时间、内存使用情况都能清晰地看到:
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
invalid_param=test返回结果类似:
{
"errorMessage": "Missing required parameter: event_type",
"errorType": "ValidationError",
"requestId": "12345-abcde-67890",
"stackTrace": [
"..."
]
}我还会用HTTPie测试Lambda的性能,比如冷启动时间:
# 连续调用几次,观察响应时间差异
time http POST https://abcd1234.lambda-url.us-east-1.on.aws/ event_type=ping
sleep 300 # 等待5分钟让函数冷却
time http POST https://abcd1234.lambda-url.us-east-1.on.aws/ event_type=ping对于需要认证的Lambda函数,可以配合AWS CLI获取临时token:
# 获取临时token
TOKEN=$(aws sts get-session-token --query 'Credentials.SessionToken' --output text)
# 带认证调用Lambda
http POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
Authorization:"Bearer $TOKEN" \
event_type=protected_action \
user_id:=12345还可以测试Lambda函数的超时处理:
# 测试长时间运行的任务
http --timeout=30 POST https://abcd1234.lambda-url.us-east-1.on.aws/ \
event_type=long_task \
duration:=25用HTTPie调试Lambda比在控制台点来点去快多了,特别是需要频繁测试不同参数组合的时候。而且可以很容易地把测试命令保存成脚本,方便回归测试。
整个调试过程用HTTPie特别顺畅,比用Postman或者直接写SDK代码都要快。特别是那个JSON格式化输出,Lambda返回的复杂数据结构看起来很清晰。
我觉得它最大的优点就是简单直观。语法接近自然语言,输出美观易读,对于日常的API调试工作来说真的很方便。特别是那个会话功能,调试需要认证的API时特别有用。
当然curl作为老牌工具,在某些场景下还是不可替代的,比如复杂的脚本、性能测试、支持更多协议等。但对于大部分开发者的日常HTTP调试需求,HTTPie绝对是个更好的选择。
如果你还在用curl调试API,强烈建议试试HTTPie。相信我,用过之后你就回不去了...就像当年从记事本切换到IDE一样,工具的进步确实能提高工作效率。
HTTPie还有很多高级功能我这里没有涉及到,比如插件系统、自定义认证方式等。大家可以去官网看看文档,或者直接http --help查看帮助。另外HTTPie还有桌面版本叫HTTPie Desktop,提供图形界面,不过我还是更喜欢命令行版本,毕竟习惯了敲命令。
你们平时都用什么工具调试API呢?有没有其他好用的命令行工具推荐?