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 服务,也支持 PUT
、DELETE
等标准的 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 |
用于提交 Boolean 、Number 、Array 等原始格式的 JSON 数据。如 meals:='["ham","spam"]' |
表单文件 file@/dir/file |
配合 --form 或 -f 使用,以 multipart/form-data 的形式提交文件 |
Querystring
对于 URL 链接中包含的 querystring 参数(如 /?param1=value1¶m2=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-Type
和 Accept
选项的默认值都为 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
4POST /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 -