调接口时 curl 要拼三行,httpie 一行搞定,但有三个地方会坑你
把 curl 那一堆 -H、-d、转义引号换成 http POST url key=value,请求和响应都是彩色 JSON。但类型、参数位置和会话这三块,各有一次让我排查了半天。
问题
我经常在脚本里调接口。curl 写起来是这样的:
curl -X POST https://httpbin.org/post \
-H "Content-Type: application/json" \
-d '{"name":"test","count":3,"enabled":true}'
三个地方容易出错:外层单引号里再嵌双引号,Windows 的 cmd 和 PowerShell 转义规则还不一样;-d 传的是字符串,想让 count 是数字得自己保证 JSON 合法;响应是一整行,想看某个字段得再接 | python -m json.tool 或 | jq。
httpie 写成一行:
http POST https://httpbin.org/post name=test count:=3 enabled:=true
响应直接是着色的 JSON。
第一个坑:= 和 := 不是一回事
这是最容易踩的,四个写法对应四种类型:
name=test→ 字符串"test"count:=3→ 数字3enabled:=true→ 布尔truenothing:=null→null
我第一次写 count=3,接口收到的是字符串 "3",服务端校验没过,报「类型错误 expected integer」。当时以为是接口的问题,查了半天请求体才发现。
记住一条:带冒号的是原始 JSON,不带的是字符串。:= 后面必须能按 JSON 解析,写 count:=abc 会直接报错 Invalid JSON: abc。
第二个坑:四种分隔符容易串
同一行里能同时出现 body 字段、URL 参数、请求头和文件上传,符号只差一两个字符:
a=1JSON body 里的字段a==1URL 查询参数?a=1A:1请求头A: 1a@file.txt把文件当该字段上传a=@file.txt文本字段取文件内容
我有一次把请求头写成 body 里的字段,服务端直接 400,因为 Content-Type 没发出去。
第三个坑:--session 存的是明文
--session 能把 cookie 和请求头存在 ~/.httpie/sessions/ 下,纯文本。方便,但共享机器上等于把登录态摊开;多账号测试也容易串号,因为默认 session 名固定。
临时用完就丢可以这样:
http --session-read-only=/tmp/a.json GET url
别用默认名往家目录里写。
三个常用场景
只拼请求不发送,用来检查自己写对了没:
http --offline --pretty=all POST https://httpbin.org/post name=test count:=3
它会打印完整请求头和格式化后的 body,一个包都不发。
下载文件看进度:
http --download https://example.com/大文件.zip
接口报错时看原始响应,不带格式化:
http --print=h Hb POST url name=test
h 是响应头,b 是 body。默认会加格式化,排查 gzip 或编码问题时反而碍事。
我的选择
脚本里批量调用还是 curl,因为不依赖装别的东西,服务器上一定有;手动排查接口一律 httpie,改一个参数只动一个词,不用重新拼引号。
装法:pip install httpie 或 brew install httpie,Windows 上用 pip 最省事。
- 点赞
- 收藏
- 关注作者
评论(0)