相较于curl那把瑞士军刀的小巧和强大,httpie则只是在http client端进行了改进,如果你需要的功能是一个客户端,能够与提供rest api接口的后端进行交互实现常见的GET/PUT/DELET/POST等操作,通过json/xml文件与之进行交互,设定HTTP Header,可能同时会使用HTTPS方式等这样常见的需求,使用curl命令足够了,唯一缺点是使用起来稍显繁琐,希望这种场景下的简化需求则可以考虑httpie是否是你所需要的,这篇文章将会进行简单地使用介绍。
Httpie概要信息如下表所示:
项目 | 说明 |
---|---|
官网 | https://httpie.org |
开源/闭源 | 开源 |
源码管理地址 | https://github.com/jakubroztocil/httpie |
License类别 | BSD-3-Clause License |
开发语言 | python |
当前稳定版本 | 1.0.2 (2018/11/14) |
操作系统支持 | 跨平台,支持Linux/Windows/Mac |
下载地址:github release | https://github.com/jakubroztocil/httpie/releases |
Httpie包含多种功能特性,诸如:
httpie提供多种安装方式,包括使用操作系统提供的包管理工具或者pip进行安装。
安装命令:brew install httpie
安装命令:yum install httpie
安装命令:apt-get install httpie
安装命令:pip install --upgrade httpie
以下是在MacOS上使用pip进行安装的日志示例
liumiaocn:~ liumiao$ pip install --upgrade httpie
Collecting httpie
...省略
Installing collected packages: httpie
Successfully installed httpie-1.0.2
liumiaocn:~ liumiao$
安装后使用version选项进行版本确认,是目前的最新稳定版本1.0.2
liumiaocn:~ liumiao$ http --version
1.0.2
liumiaocn:~ liumiao$
curl命令示例:
curl -i -X PUT httpbin.org/put -H Content-Type:application/json -d ‘{“hello”: “world”}’
http命令示例:
http -v PUT httpbin.org/put API-Key:foo hello=world
使用格式:http [设定选项] [HTTP动作] URL地址 [设定项]
httpie就是更为简便写法的curl的http client,体现在URL的写法上,相信看了下面两个示例即可了解一二。
http http://localhost:32044/login = http :32044/login
http http://localhost:80/login = http :/login
可以通过设定default-scheme来设定https
设定方式:http --default-scheme=https 其他内容
设定alias可以更加便利的操作,这样就像HTTPIE的HTTPS版命令一样,可以直接使用https即可操作,不必每次执行都要加上default-scheme=https的设定
alias https=‘http --default-scheme=https’
常见的HTTP请求经常需要用到如下几种设定需要:
类型 | 设定方式 | 备注 |
---|---|---|
设定Http header,比如Content-Type | 设定项目名称:设定项目值 | - |
设定URL的传入参数 | 设定项目名称==设定项目值 | 使用==来表示这种情况 |
设定JSON对象或文件 | field=设定值 或 field=@设定值 | 设定值为JSON对象或者可以转化的JSON文件名(与-f或者--form结合使用) |
设定JSON数据 | field:=设定值 或 field:=@设定值 | 直接传入JSON设定内容 |
设定form表单 | field@设定值 | 仅与-f或者--form结合使用 |
JSON是Web服务的无冕的通用数据类型,在Httpie中也是对Http Header其进行了如下缺省设定,当然这些都可以进行覆盖。
设定内容 | 设定值 |
---|---|
Content-Type | application/json |
Accept | application/json, */* |
表单方式的提交与JSON类似,通过--form或者-f来进行,httpie会将其转化会Content-Type: application/x-www-form-urlencoded; charset=utf-8的设定之后进行处理,简化了用户的设定
命令:http URL/headers header设定项:
liumiaocn:~ liumiao$ http httpbin.org/headers Accept: User-Agent:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 99
Content-Type: application/json
Date: Sun, 14 Apr 2019 12:46:16 GMT
Server: nginx
{
"headers": {
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org"
}
}
liumiaocn:~ liumiao$
liumiaocn:~ liumiao$
liumiaocn:~ liumiao$ http httpbin.org/headers
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 130
Content-Type: application/json
Date: Sun, 14 Apr 2019 12:46:39 GMT
Server: nginx
{
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "HTTPie/1.0.2"
}
}
liumiaocn:~ liumiao$
命令:http URL/headers ‘Header;’
liumiaocn:~ liumiao$ http httpbin.org/headers 'Header;'
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 136
Content-Type: application/json
Date: Sun, 14 Apr 2019 12:47:06 GMT
Server: nginx
{
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Header": "",
"Host": "httpbin.org",
"User-Agent": "HTTPie/1.0.2"
}
}
liumiaocn:~ liumiao$
Http客户端将cookies像Http Header一样发送至服务端,这意味这Httpie对于cookie的操作像普通的Header一样, 多项cookie设定中间用分号隔开
命令:http URL ‘Cookie:设定项1=设定值1;设定项2=设定值2’
可以通过用户名/密码的Basic认证方式的,可以使用-a通过用户名和密码进行登录,使用方式如下:
命令:http -a 用户名:密码 URL
如果不设定密码时,则会提示密码的输入
命令:http -a 用户名 URL
另外可以活用.netrc文件来保存认证信息
文件位置:~/.netrc
- 内容示例
machine URL
login 用户名
password 密码
可使用如下设定示例进行http或者https的proxy的设定
命令示例:
http --proxy=http:http://10.10.1.10:3128 --proxy=https:https://10.10.1.10:1080 example.org
需要使用用户名和密码的proxy场景可尝试如下方式:
命令示例:http --proxy=http:http://user:[email protected]:3128 example.org
环境变量方式:同样也可以使用环境变量方式进行设定,这并非httpie的功能
命令示例:
export HTTP_PROXY=http://10.10.1.10:3128
export HTTPS_PROXY=https://10.10.1.10:1080
export NO_PROXY=localhost,example.com
依赖事项:pip install -U requests[socks]
命令示例:
http --proxy=http:socks5://user:pass@host:port --proxy=https:socks5://user:pass@host:port example.org
命令示例:http --verify=no https://example.org
命令示例:http --verify=/ssl/custom_ca_bundle https://example.org
命令示例:http --cert=client.pem https://example.org
命令示例:http --cert=client.crt --cert-key=client.key https://example.org
命令示例:http --ssl=ssl3 https://vulnerable.example.org
命令格式:http --headers URL
http -h URL
命令格式:http --body URL
http -b URL
命令格式:http --verbose URL
http -v URL
缺省的输入是通过stdin标准输入来进行,可通过<进行重定向,也可以使用|管道进行传递
使用示例:http PUT example.com/person/1 X-API-Token:123 < person.json
使用示例:echo ‘{“name”: “John”}’ | http PATCH example.com/person/1 X-API-Token:123
通过如下设定选项可以设定终端输出格式:
设定项目 | 设定说明 |
---|---|
--pretty=colors | 设定颜色 |
--pretty=format | 设定格式 |
--pretty=all | 设定颜色和格式,缺省行为 |
--pretty=none | 颜色与格式不设定,重定向时的缺省行为 |
使用-d或者--download可以像wget一样进行下载
命令:http -d URL
liumiaocn:~ liumiao$ http -d www.baidu.com
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xbadab11d00183a3d
Cache-Control: private
Connection: Keep-Alive
Content-Type: text/html
Cxy_all: baidu+c18d2d97de93704b5bdacad076dfc57a
Date: Sun, 14 Apr 2019 12:47:48 GMT
Expires: Sun, 14 Apr 2019 12:46:57 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
Set-Cookie: BAIDUID=6BC656666AB4C0A81F799554CFCE9871:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=6BC656666AB4C0A81F799554CFCE9871; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1555246068; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1424_21088_28773_28723_28558_28836_28584_28603_28605; path=/; domain=.baidu.com
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Downloading to "index.html"
Done. 149.83 kB in 0.21465s (698.04 kB/s)
liumiaocn:~ liumiao$
命令示例:http --session=/tmp/session.json example.org API-Token:123
命令示例:http --session=/tmp/session.json example.org
命令示例:http --session=user1 -a user1:password example.org X-Foo:Bar
*使用既存的session(Name Session)
命令示例:http --session=user1 example.org
https://httpie.org/
https://httpie.org/doc
https://github.com/jakubroztocil/httpie