HTTPie 命令语法速查

HTTPie 是一个基于命令行的 HTTP 客户端,类似于 Linux 系统中的 curl 工具。
它凭借非常简单直观的语法和着色的格式化输出等特性,提供了一种友好的与 Web 服务交互的方式。

一、安装

HTTPie 的安装方法有很多种,可以通过 pip 命令以 Python 模块的方式安装,相对简单且通用:
$ pip install httpie

语法格式:
$ http [flags] [METHOD] URL [ITEM [ITEM]]

基本示例
  • $ http httpie.org 以 GET 方法访问 Web 服务,获取 HTML 文档或其他类型的响应
  • $ http PUT example.org X-API-TOKEN:123 name=John 自定义 HTTP 请求头、HTTP 方法及上传的 JSON 数据
    在上面的示例中,PUT 为自定义的请求方法,X-API-Token 为请求头选项,name=John 即通过 PUT 方法提交的 JSON 数据。
  • $ http -f POST example.org hello=world 提交 form 表单
  • $ http example.org < file.json 通过重定向上传文件
  • http --download exmaple.org/file 下载文件(类似 wget 命令)

二、语法详解

HTTP 方法

http 命令默认使用 GET 方法(无请求数据时)或 POST 方法(有提供请求数据时)访问 Web 服务,也支持 PUTDELETE 等标准的 HTTP 动词:http <method> <url>

如:$ http DELETE example.org/todos/7
实际向服务器发送了类似这样的请求:DELETE /todos/7 HTTP/1.1

Request 选项

http 允许在请求命令中添加 HTTP 请求头、JSON 或表单数据、文件和 URL 参数等请求选项。参考下表:

Item 类型 描述
HTTP 请求头 Name:Value X-API-Token:123
URL 参数 name==value 通过 == 符号向 URL 中附加 query string 参数
Data Fields field=value, field=@file.txt 此类数据在提交时会序列化为 JSON 对象,或者编码为 form 格式上传(--form, -f
Raw JSON field:=json, field:=@file.json 用于提交 BooleanNumberArray 等原始格式的 JSON 数据。如 meals:='["ham","spam"]'
表单文件 file@/dir/file 配合 --form-f 使用,以 multipart/form-data 的形式提交文件
Querystring

对于 URL 链接中包含的 querystring 参数(如 /?param1=value1&param2=value2),http 命令可以通过简单的 param==value 语法来指定。

$ http www.google.com search=='HTTPie logo' tbm==isch
效果类似于 GET /?search=HTTPie+logo&tbm=isch HTTP/1.1

Non-string JSON

http 命令中包含的请求数据默认都会序列化为 JSON 格式再提交给服务器,即请求头中 Content-TypeAccept 选项的默认值都为 application/json

可以使用 := 操作符提交非字符串形式的 JSON 数据;
Text 和 JSON 文件则可以分别使用 =@:=@ 嵌入到请求中。如:

1
2
3
4
5
$ http PUT api.example.com/person/1 \
name=John \ # Text JSON
age:=29 married:=false hobbies:='["http", "pies"]' \ # Raw JSON
description=@about-john.txt \ # Embed text file
bookmarks:=@bookmarks.json # Embed JSON file

表单

常规表单
提交表单和发送 JSON 请求的方式非常相似,只是需要在命令中添加 --form-f 选项,以确保请求数据的 Content-Type 被设置为 application/x-www-form-urlencoded; charset=utf-8

$ http -f POST api.example.org/person/1 name='John Smith'

1
2
3
4
POST /person/1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8

name=John+Smith

文件上传表单
如果表单请求中有包含文件项,则该请求的 Content-Type 会被设置成 multipart/form-data

$ http -f POST example.com/jobs name='John Smith' cv@~/Documents/cv.pdf
上述命令的效果等同于如下 HTML 表单:

1
2
3
4
<form enctype="multipart/form-data" method="post" action="http://example.com/jobs">
<input type="text" name="name" />
<input type="file" name="cv" />
</form>

其他常用语法

Cookies
$ http example.org 'Cookie:sessionid=foo;another-cookie=bar'

基本认证
$ http -a username:password example.org

Digest 认证
$ http -A digest -a username:password example.org

提示手动输入密码
$ http -a username example.org

代理
$ http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org

带认证的代理
$ http --proxy=http:http://user:pass@10.10.1.10:3128 example.org

SOCKS 代理
需安装依赖库:$ pip install requests[socks]
$ http --proxy=http:socks5://user:pass@host:port --proxy=https:socks5://user:pass@host:port example.org

跳过 SSL 证书认证
$ http --verify=no https://example.org

自定义 CA
$ http --verify=/ssl/custom_ca_bundle https://example.org

客户端 SSL 证书
$ http --cert=client.pem https://example.org
$ http --cert=client.crt --cert-key=client.key https://example.org

三、命令输出

默认情况下,http 命令会输出最终的完整响应信息(包含 headers 和 body),可以通过如下选项控制显示的结果:

选项 含义
--headers, -h 只输出响应头信息
--body, -b 只输出响应中的 body 信息
--verbose, -b 输出所有的 HTTP 交互信息(包含请求和响应)
--print, -p 自由组合需要显示的部分

--print-p 选项可以携带多个不同的字符对应特定的内容进行显示:

字符 含义
H 请求头
B 请求体
h 响应头
b 响应体

如:http --print=Hh PUT httpbin.org/put hello=world

输出重定向

保存文件:
$ http example.org/Movie.mov > Movie.mov

保存图片后使用 ImageMagick 改变大小再上传:
$ http octodex.github.com/images/original.jpg | convert - -resize 25% - | http example.org/Octocats

下载模式(响应头定向至 stderr,传输过程中显示进度条):
http --download https://github.com/jakubroztocil/httpie/archive/master.tar.gz

下载过程中使用管道重定向:
$ http -d https://github.com/jakubroztocil/httpie/archive/master.tar.gz | tar zxf -

参考资料

HTTPie Documentation