HTTPie


软件官网 //httpie.org/doc
在线demo //httpie.org/run
这个小朋友可能用不到,
HTTPie 是 HTTP 命令行客户端,CLI 与 Web services 交互更友好,提供 http 命令,
自然的表述发送HTTP请求输出代码高亮,HTTPie测试与HTTP 交互,httpie 取代curl的绝佳工具
自然语句,格式化高亮显示输出
内置 JSON 支持
表单和文件上传
HTTPS, 代理和授权验证
多样化的请求数据格式
自定义headers 头
持久 sessions 存储
类wget下载模式
兼容Python 2.6 2.7 3.x
支持 Linux/macOS/Windows
插件支持
安装
macOS系统用 Homebrew安装 brew install httpie
MacPorts 安装 port install httpie
Linux 包管理组件安装
#Debian Linux构建版 如 Ubuntuapt-get install httpie
# 基于 RPM Linux 的构建版yum install httpie
# Arch Linux 系统pacman -S httpie
pip 通用 Windows  MacOS  Linux
#最新版本的 pip 和 setuptools ,
windows 7 D:\Python\Python36-32\Scripts\
pip install --upgrade
pip setuptoolspip install --upgrade httpie
开发版本github安装
# Homebrewbrew install httpie --HEAD
# pippip install --upgrade https://github.com/jkbrzt/httpie/archive/master.tar.gz

Python安装 HTTPie保证新功能(如[SNI](#服务器名称指示-sni-server-name-indication) )开箱即用
Python 3 在 Homebrew 0.9.4 版本以上 成为了默认的 Python 版本
http --debug 查看 HTTPie 用的python 版本
用法 http httpie.org
http [flags] [METHOD] URL [ITEM [ITEM]]
http --help  查看用方法
[windows 7  D:\Python\Python36-32\Scripts\http --help]
HTTP 方法 HTTP 头和 JSON 数据
http PUT example.org X-API-Token:123 name=John
表单提交 http -f POST example.org hello=World
用输出参数 -v 查看请求信息 默认不显示 http -v example.org
用 Github API 向 issue发送评论 需要授权验证参数
http -a USERNAME POST https://api.github.com/repos/jkbrzt/httpie/issues/83/comments body='HTTPie is awesome! :heart:'
命令行的输入重定向上传文件
http example.org < file.json
wget 风格下载文件
http --download example.org/file
命令会话对同一 host 进行请求持久通信
http --session=logged-in -a username:password httpbin.org/get API-Key:123http --session=logged-in httpbin.org/headers
自定义请求 host 头
http localhost:8000 Host:example.com

HTTP 方法的名称在 URL 参数之前
http DELETE example.org/todos/7
HTTP 请求发送的文本一样
DELETE /todos/7 HTTP/1.1
请求 URL
HTTPie 唯一必传参数是请求 URL  默认的方案 是 http://  请求时缺省
http example.org
Querystring 参数
命令行手动构建 URLs 用 param==value 添加参数的方式比较方便
不需担心命令行中转义链接字符串 &问题 参数的特殊字符 被自动转义(除非已转义过)
命令搜索 HTTPie logo 可在google 图片上结果
http www.google.com search=='HTTPie logo' tbm==ischGET /?search=HTTPie+logo&tbm=isch HTTP/1.1
localhost 的 URL 缩写
支持 类似 curl 的 localhost 缩写 用 :3000代替 http://localhost:3000  不传入端口号 80 默认
http :/fooGET /foo HTTP/1.1Host: localhost
http :3000/barGET /bar HTTP/1.1Host: localhost:3000
http :GET / HTTP/1.1Host: localhost
自定义默认方案
用 --default-scheme <URL_SCHEME> 参数 指定非 HTTP其它协义 alias https='http --default-scheme=https'
请求项
不同的请求项类型提供一种便捷的方法来指定 HTTP 头 简单的 JSON 表单数据 文件 URL参数
URL 参数后面紧随的是 键/值 对参数都会被拼装成请求发送不同类型的 键/值 对分割符号分别
=, :=, @, =@, :=@ 用 @ 分割的参数表示文件路径
项类型(item type)    描述(Description)
HTTP 头参数
Name:Value    任意的 HTTP 头 如 X-API-Token:123
URL 参数
name==value    通过分割符 == 表示查询字符串的 键/值 对
数据域
field=value,
field=@file.txt    请求默认会被序列化成 JSON 的数据域 或者表单类型 form-encoded(--form, -f)
纯 JSON 域
field:=json,
field:=@file.json    当需要指定域参数类型 boolean, number .. 时非常有用  如meals:='["ham","spam"]' or pies:=[1,2,3] (注意引号)
Form 表单文件域    仅当传入参数 --form, -f 时有效 如 screenshot@~/Pictures/img.png 文件内容将被序列化成 multipart/form-data 发送
数据域不是唯一的指定请求数据的方式 重定向输入也可
字符转义规则
用 \ 转义不应该被用于分割符的情况如 foo\==bar 会被转义成个数据键值对(foo= 和 bar)而不是 URL 参数
用引号包围值 如 foo='bar baz'
若有个域的名字或者 header 以减号开头 需要把这些参数放在个特殊符号 --
后面  这样做是为了和 --arguments 区分开
http httpbin.org/post  --  -name-starting-with-dash=foo -Unusual-Header:barPOST /post HTTP/1.1-Unusual-Header: barContent-Type: application/json{"-name-starting-with-dash": "value"}
JSON 是 web services 通用规范 HTTPie 默认遵循 不严格的数据类型
http PUT example.org name=John email=john@example.orgPUT / HTTP/1.1Accept: application/json, **
明确的 JSON
命令行参数 --json, -j 明确地设置 Accept 为 application/json 而无需在意发送的数据是什么(快捷方式 也可用普通的 header 注解http url Accept:'application/json, **Content-Type: application/jsonHost: api.example.com{"age": 29,"hobbies": ["http","pies"],"description": "John is a nice guy who likes pies.","married": false,"name": "John","bookmarks": {"HTTPie": "http://httpie.org",}}
当发送复杂数据时 这个例子用的语法会显得很笨重 重定向输入 将会更合适
http POST api.example.com/person/1 < person.json
表单
提交表单和发送 JSON 请求很相似  唯一的不同是添加额外的 --form
-f 参数  确保数据域和 Content-Type 被设置成 application/x-www-form-urlencoded; charset=utf-8
普通的表单
http --form POST api.example.org/person/1 name='John Smith'POST /person/1 HTTP/1.1Content-Type: application/x-www-form-urlencoded; charset=utf-8name=John+Smith
文件上传表单
文件域 序列化方式和 content type 会是 multipart/form-data
http -f POST example.com/jobs name='John Smith' cv@~/Documents/cv.pdf
和下面的 HTML 表单发送请求是一样
<form enctype="multipart/form-data" method="post" action="http://example.com/jobs"><input type="text" name="name" /><input type="file" name="cv" /></form>
注意 @ 用来模拟文件上传域 而 =@ 是把文件内容以文本的方式嵌入到数据域的值里面
HTTP 头
可用 Header:Value 注解的形式来添加自定义头信息
http example.org  User-Agent:Bacon/1.0  'Cookie:valued-visitor=yes;foo=bar'  \X-Foo:Bar  Referer:http://httpie.org/GET / HTTP/1.1Accept: **Accept-Encoding: gzip, deflateUser-Agent: HTTPie/<version>Host: <taken-from-URL>
空头和重新设置默认头
用 Header取消上面的几个默认头信息
http httpbin.org/headers Accept: User-Agent:
请求中的 Accept 和 User-Agent 头都会被移除 用 Header; 表示添加个为空的头信息 注意须用引号
http -v httpbin.org/headers 'Host;'GET /headers HTTP/1.1Accept: **Accept-Encoding: gzip, deflateContent-Type: application/jsonHost: httpbin.orgUser-Agent: HTTPie/0.2.7dev{"hello": "world"}HTTP/1.1 200 OKConnection: keep-aliveContent-Length: 477Content-Type: application/jsonDate: Sun, 05 Aug 2012 00:25:23 GMTServer: gunicorn/0.13.4{[…]}
哪部分的 HTTP 请求内容应该打印出来
所有HTTP 输出选项都属于更强大的 --print, -p 参数的快捷方式--print, -p
接受个字符串 字符串的每个字母都表示下面的 HTTP 某一部分
字符    代表
H    请求头
B    请求体
h    响应头
b    响应体
打印请求头和响应头
http --print=Hh PUT httpbin.org/put hello=world

查看中间的请求/响应
用 --all 参数查看 HTTP 通信所有信息 中间HTTP 通信包括跟随重定向(参数--follow)和用 HTTP 摘要授权时第一次未授权的请求(用参数
--auth=diggest)
# 包括最终响应之前的所有响应信息http --all --follow httpbin.org/redirect/3
中间请求/响应默认会用 --print, -p 参数指定的值格式化用--history-print, -P 指定  参数和 --print, -p 是一样的
但这只实用于 中间请求
# 中间请求/响应信息用 H 格式化 最终请求/响应信息用 Hh 格式化:http -A digest -a foo:bar --all -p Hh -P H httpbin.org/digest-auth/auth/foo/bar
条件化的 body 内容下载
做为个优化项 响应体在仅作为输出一部分时才会被下载 这和 HEAD 类型的请求类似(除了 HEAD 可用在任何 HTTP 请求中)
如有个 API 更新后会返回整个资源 但只对更新后响应头中的状态码感兴趣
http --headers PATCH example.org/Really-Huge-Resource name='New Name'
当响应头接收完成的时候服务器连接就会被关闭 带宽和时间不会浪费在下载响应体 可不必在意响应头总是会被下载的无论是不是输出部分
重定向输入
直接从 stdin (标准输入)管道传入请求数据是大部分人认为比较好的方法
这些数据被缓冲而且不需要更多的操作就可做为请求体被用 用管道有下面几个好用的方法:
从个文件重新定向
http PUT example.com/person/1 X-API-Token:123 < person.json
或者从其它程序的输出
grep '401 Unauthorized' /var/log/httpd/error_log | http POST example.org/intruders
可用 echo 命令来传简单数据
echo '{"name": "John"}' | http PATCH example.com/person/1 X-API-Token:123
可用 web services
http GET https://api.github.com/repos/jkbrzt/httpie | http POST httpbin.org/post
可用 cat 命令来输入多行文本
cat | http POST example.com<paste>^D
cat | http POST example.com/todos Content-Type:text/plain- buy milk- call parents^D
在 macOS 中可用 pbpaste 命令把剪贴板中的内容做为数据发送
pbpaste | http PUT example.com
通过 stdin 传递数据的方式 不能 和指定数据域的方式混合用
echo 'data' | http POST example.org more=data   # 不可
从个文件中取请求数据
指定文件路径(@/path/to/file)方式可替代上面用 stdin 的方式
这个方法有个优点 Content-Type 可根据提供的文件扩展名自动设置成对应的如
下面的请求会被设置头 Content-Type: application/xml
http PUT httpbin.org/put @/data/file.xml

命令行输出
HTTPie 默认做一些事情 目的是为了让命令行输出内容有更高的可读性
颜色和格式化
语法高亮会应用在 HTTP 请求的 headers 和 body 里面
若不喜欢默认的配色方案用 --style 参数自定义(用http --help命令查看更多选项)
几个格式化规则会被用
HTTP 头会按名称排序
JSON 数据会有缩进 并且按 key 名排序 unicode 序列会被转换成实际字符
参数可用在处理输出结果中
命令行参数    描述
--pretty=all    应用颜色和格式化 默认
--pretty=colors    仅应用颜色
--pretty=format    仅应用格式化
--pretty=none    不用颜色和格式化 重定向时默认用

二进制数据
二进制数据在命令行中会被禁止 会使处理响应返回的二进制数据变得更安全 重定向时
也禁止二进制数据 但会被装饰输出 一旦当 知道响应体是二进制数据时 连接会关闭
http example.org/Movie.mov
下面的提示
HTTP/1.1 200 OKAccept-Ranges: bytesContent-Encoding: gzipContent-Type: video/quicktimeTransfer-Encoding: chunked+-----------+| NOTE: binary data not shown in terminal |+-------------------+
重定向输出
与命令行输出相比 重定向输出用了不同的默认值 不同之处在于
格式化和种颜色默认不会用(除非--pretty被指定)
只输出响应体(除非指定了输出参数)
二进制结果不会被禁止
原因是为了把 HTTPie 的结果直接 piping 到其它程序 且使下载文件不需要额外的参数标识多数情况下输出重定向时只有响应体有意义
下载文件 http example.org/Movie.mov > Movie.mov
下载 Octocat 图片 用 ImageMagick 修改大小 上传到其它地方
http octodex.github.com/images/original.jpg | convert - -resize 25% -  | http example.org/Octocats
强制用格式化与颜色 在 less 的分页中显示请求和响应
http --pretty=all --verbose example.org | less -R
-R 标识告诉 less 命令解析 HTTPie 输出中的颜色序列
可用下面的 bash 函数代码建立个调用 HTTPie 分页格式化且高亮输出的快捷方式
function httpless {# `httpless example.org'http --pretty=all --print=hb "$@" | less -R;}

下载模式
HTTPie 具有下载模式 这和 wget 命令类似用 --download, -d 标识启用 响应头会打印到命令行 下载响应体的进度条也会显示
http --download https://github.com/jkbrzt/httpie/archive/master.tar.gz
HTTP/1.1 200 OKContent-Disposition: attachment; filename=httpie-master.tar.gzContent-Length: 257336Content-Type: application/x-gzipDownloading 251.30 kB to "httpie-master.tar.gz"Done. 251.30 kB in 2.73862s (91.76 kB/s)
下载文件的文件名
若没有指定参数 --output, -o 文件名将由 Content-Disposition 决定 或者通过 URL 及其 Content-Type 若名字已占用 HTTPie 会添加唯一后缀
下载的同时 piping
即使响应头和进度状态显示在命令行中 仍然可将响应重定向到其它的程序
http -d https://github.com/jkbrzt/httpie/archive/master.tar.gz |  tar zxf -
恢复下载
若指定 --output, -o 可 --continue, -c恢复部分下载
不过仅当服务器支持 Range 请求而且响应返回 206 Partial Content才可 若服务器不支持这个功能 那就只会下载整个文件
http -dco file.zip example.org/file
其它注意事项
--download 仅更改响应正文的处理方式
仍然可用自定义 header 头、用 session 会话 --verbose, -v 等
--download 意味着启用 --follow
若文件没有被完全下载完 HTTPie 将会返回错误状态码 1 并退出
Accept-Encoding 不能和 --download 一起用
流式响应
响应体会被以块的形式下载和打印 这使程序在不用大量内存情况下进行流式传输和下载然而若用颜色和格式化参数 整个 响应体会被缓冲 然后立即处理
禁用缓冲
可用 --stream, -S 进行下面的操作
输出内容以更小的块更新 不需要任何缓冲 这使得 HTTPie 表现的像 tail -f 命令一样
即使输出被美化 流也会启用:它将应用于响应的每一行并立即更新这样就可为持续 时间长的请求提供个漂亮的输出 例如个 Twitter 的流 API
示例
修饰过的流响应 http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track='Justin Bieber'
像 tail -f 一样小块的流输出
http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track=Apple \| while read tweet; do echo "$tweet" | http POST example.org/tweets ; done
会话
默认 同个 host 每个 HTTPie 发出的请求完全独立 然而 HTTPie 支持用 --session=SESSION_NAME_OR_PATH 参数进行持久会话
在同个 host 的会话 自定义 header(除了以Content- 和 If- 开头)、authorization、cookies(手动指定或者服务器发送) 会持续保存
# 创建个新会话http --session=/tmp/session.json example.org API-Token:123# 复制用已存在的会话 API-Token 会自动设置http --session=/tmp/session.json example.org
所有的会话数据都会被存储成纯文本 这表示会话文件可用编辑器手动添加或者修改其实就是 JSON 数据
具名会话
每个 host 都可建个或者多个会话 如 将为 host 是 example.org的请求建个名为 name1 的会话
http --session=user1 -a user1:password example.org X-Foo:Bar
从现在起 就通过名字来选择会话 当选择用个会话时 之前用过的授权HTTP头都会被自动添加
http --session=user1 example.org
创建或者重用不同的会话 只需要指定不同的名字即可:
http --session=user2 -a user2:password example.org X-Bar:Foo
具名会话将被以 JSON 的数据格式存储在 ~/.httpie/sessions/<host>/<name>.json
(windows下则是 %APPDATA%\httpie\sessions\<host>\<name>.json)
匿名会话
不同与具名会话 也可直接用个文件路径来指定会话文件的存储地址 这也可在不同的 host 间复用会话
http --session=/tmp/session.json example.orghttp --session=/tmp/session.json admin.example.orghttp --session=~/.httpie/sessions/another.example.org/test.json example.orghttp --session-read-only=/tmp/session.json example.org
只读会话
若复用个会话又不想更新会话信息 可通过指定--session-read-only=SESSION_NAME_OR_PATH 来实现
配置
HTTPie 用了个简单的 JSON 配置文件
配置文件路径
默认的配置文件路径在 ~/.httpie/config.json (window 在%APPDATA%\httpie\config.json) 配置文件的路径也可通过修改环境变量
HTTPIE_CONFIG_DIR 来更改 可用 http --debug 命令查看当前配置文件路径
可配置的参数
JSON 配置文件包含以下的键default_options
参数默认值数组(默认为空) 数组里面的参数会被应用于每次 HTTPie 的调用
如可用这个选项改变默认的样式和输出参数"default_options": ["--style=fruity", "--body"]  另外个常用的默认参数是 "--session=default"
这会让 HTTPie 总是用会话(名称为default)也可用 --form 改变默认 不严格的 JSON 类型为 form 类型__meta__
HTTPie 自动存储了一些它自己的元数据 不要动它
取消之前指定的参数
配置文件中的参数和其它任何指定参数的方法 都可用 --no-OPTION 参数来取消 如--no-style 或者 --no-session
脚本
当在 shell 脚本中用 HTTPie 的时候 --check-status 标识会比较好用这个标识 将告知 HTTPie 若响应状态码是 3xx, 4xx, 5xx 时程序将退出并显示对应的错误
码 3(除非 --follow 参数被指定), 4, 5
#!/bin/bashif http --check-status --ignore-stdin --timeout=2.5 HEAD example.org/health &> /dev/null; thenecho 'OK!'elsecase $? in2) echo 'Request timed out!' ;;3) echo 'Unexpected HTTP 3xx Redirection!' ;;4) echo 'HTTP 4xx Client Error!' ;;5) echo 'HTTP 5xx Server Error!' ;;6) echo 'Exceeded --max-redirects=<n> redirects!' ;;*) echo 'Other Error!' ;;esacfi
最佳实践
在非交互式调用的情况下通常不希望用 stdin 的默认行为 可用--ignore-stdin 参数来禁止
若没有这个选项 HTTPie 可能会挂起 这是个常见的问题发生的场景可能是 如
从定时任务中调用HTTPie时 stdin 未连接到终端因此 重定向输入的规则适用 即
HTTPie 开始读取它 希望请求体将被传递由于没有数据也没有 EOF 它会被卡住
因此除非将一些数据传递给 HTTPie 否则应在脚本中用此标志
当然用 --timeout 参数手动设置(默认30秒)延迟时间是个比较好的做法
元信息接口设计
命令行参数的设计与通过网络发送 HTTP 请求的过程密切相关
HTTPie 的命令更容易记忆
HTTP 请求串连到一行就很自然的形成了 HTTPie的命令行参数
如 下面这个原生 HTTP 请求
POST /collection HTTP/1.1X-API-Key: 123User-Agent: Bacon/1.0Content-Type: application/x-www-form-urlencodedname=value&name2=value2
和用 HTTPie 命令发送同样的参数
http -f POST example.org/collection \X-API-Key:123 \User-Agent:Bacon/1.0 ame=value ame2=value2
两者的顺序和参数都非常相似 并且只有一小部分命令用于控制
HTTPie(-f 表示让 HTTPie 发送个 from 请求) 并且不直接对应于请求的任何部分
两种模式:--pretty=all(命令行中默认)、--pretty=none(重定向输出时默认)
对交互式用和脚本调用都比较友好 HTTPie 在这过程中作为通用的 HTTP 客户端