我为什么会用httpie?

644 阅读2分钟

前不久HTTPie由于不小心将其仓库私有化,导致项目十年来的Star数目全部丢失。虽然项目组找到Github官方寻求帮助希望恢复数据,却未能如愿。周末的时候看到官方博客发的这篇事后分析文章How we lost 54k GitHub stars,作者从UI、数据库设计到社区关系等问题进行了反思。其实作为一个CLI工具能排进Github TOP100是非常优秀的。基于平时经常使用httpie进行HTTP接口调测,特地写一篇httpie和其它工具简单比较的文章。

如果工作中平时涉及到WEB HTTP接口开发,那么在调试API接口时肯定会使用到某种HTTP客户端工具。最常用的有curlpostman或者编写.httpfile结合idea扩展进行调测,还有上面提到的httpie

curl

应该是所有人接触到的第一个HTTP客户端工具,通常linux系统中都会自带curl命令,可能有些人对curl的认知还只停留在http客户端工具上,如果用man命令查看curl,会发现curl异常强大,支持各种常见协议,如telnet、mqtt等等。如下所示为用curl代替telnet测试端口连通性:

$ curl -vv telnet://192.168.1.101:80
# *   Trying 192.168.1.101:80...
# * Connected to 192.168.1.101 (192.168.1.101) port 80 (#0)

正因为其功能强大,导致使用上相对会比较复杂繁琐。例如:在进行POST提交json时,总是需要添加-H 'Content-Type: application/json',因为-d, --data默认是以表单方式application/x-www-form-urlencoded进行提交,这会让整个命令显得非常冗余。值得开心的是,官方在2022/03/05发布最新的版本7.82.0中添加了--json选项增强了对json的支持,详情查看changelog,简单地说,以后可以不需要使用-d-H 'Content-Type: application/json'来提交json了,如下所示:

# 7.82.0版本之前
$ curl -X  POST 'localhost:80/anything' -H 'Content-Type: application/json' -d '{"name":"echooymxq"}'
# 7.82.0版本开始
$ curl -X  POST 'localhost:80/anything' --json '{"name": echooymxq}'

postman

postman应该是绝大多数人日常用的,它也不再仅仅是一个HTTP客户端工具,而是一个API文档、调试、Mock、自动化测试协同平台,有WorkspaceCollections等概念,Code功能能够将HTTP请求转换生成其他第三方代码,然而对我吸引最大的还是它支持GraphQL

http client

jetbrains的HTTP Client插件允许在IDEA中创建编辑.http.rest文件,并直接发起HTTP请求。如下所示:

http_request.png

比较让人吸引的一点是,可以在编写代码的时候直接编写HTTP测试请求,并且可以和代码放在一个repo下进行管理。

httpie

httpie作为一个终端CLI,和curl使用上基本没有太大的区别,但是它大大的简化了使用语法,降低了使用者的心智负担,并且还支持语法高亮,下面简单列举几点:

  • 默认请求schema为http://,这点和curl保持一致,具体在使用时可省略schema
$ http localhost:80/get
  • 方法是可选的,当有body参数时,默认为POST,没有body时,默认为GET,方法名不区分大小写。
$ http localhost:80/get
$ http POST localhost:80/post
  • 查询参数为name==value,Header为Name:Value,请求json用法field=value,加--form, -f为表单提交
# 查询参数,等价于http://localhost/get?id=1
$ http localhost:80/get id==1
# 添加Header,X-Date today
$ http localhost:80/get X-Date:today id==1
# 提交jsob请求体 {"name":"echooymxq"}
$ http post localhost:80/post name=echooymxq
# 以表单方式提交"name": "echooymxq"
$ http post localhost:80/post name=echooymxq -f
  • 省略localhost,在本地开发时,这点是我最喜欢的了,再也不用写localhost了。
# 省略localhost
$ http :80/get
# 如果端口是80,可以省略端口
$ http :/get

总结

有了curl,为什么还需要httpie?curl因为强大的功能和复杂的协议支持,平时在使用的时候需要记住比较多的选项和编写较长的命令。而httpie专注于HTTP,大大简化了使用者的操作,使得发起一个HTTP请求非常简单和轻量。jetbrains支持的HTTP Client在日常也用得非常多,它主要能够像代码一样编写和维护API调测用例。而postman,桌面版的使用就显得相对比较繁重了。相较于curl和httpie,postman和国内一些商业公司的产品如apifox,都是在朝着API开放平台来做,就连httpie也在推出自己的桌面和WEB版。综上,httpie是一个非常不错的库,在日常用它调试API接口是非常方便的。

本文所有调用的测试服务接口均为在本机使用docker启动httpbin提供。

Reference