文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

HTTPie: 一个命令行、类 cURL 的工具

HTTPie (发音 aitch-tee-tee-pie) 是一个命令行的 HTTP 客户端工具。其目的是提供一个跟 Web 服务进行方便友好交互的命令行程序。它提供了简单的 http 命令用来发送任意的 HTTP 请求,使用简单而且易于理解的语法,输出内容使用颜色进行高亮。HTTPie 可方便用于测试、调试以及常规的 HTTP 服务交互。

HTTPie 使用 Python 语言开发,基于超棒的 Python 库 RequestsPygments 实现。

主要特性

  • 富有表现力以及直观的语法
  • 格式化以及彩色化的终端输出
  • 内建对 JSON 的支持
  • 支持表单和文件上传
  • 支持 HTTPS、代理以及认证
  • 任意请求数据
  • 自定义 headers
  • 持久化 sessions
  • 类似 Wget 的下载
  • 支持 Python 2.6, 2.7 和 3.x
  • 支持 Linux, Mac OS X 和 Windows 系统
  • 支持插件
  • 文档详细
  • 测试覆盖率高
第 1 段(可获 1.66 积分)

安装

在 Mac OS X上, 可以通过 Homebrew (推荐)安装HTTPie:

$ brew install httpie

 MacPorts port 也可以:

$ port install httpie

大部分的 Linux 发行版提供了安装包,可以使用系统的包管理器来安装, 如

# Debian-based distributions such as Ubuntu:
$ apt-get install httpie

# RPM-based distributions:
$ yum install httpie

通用的做法 (适用于 Windows, Mac OS X, Linux, …, 并提供最新版本) 就是使用进行 pip安装:

# Make sure we have an up-to-date version of pip and setuptools:
$ pip install --upgrade pip setuptools

$ pip install --upgrade httpie
第 2 段(可获 0.7 积分)

(如果因为某种原因使用pip安装失败, 你可以尝试使用 easy_install httpie .)

 

开发版

可以从GitHub上直接安装 最新的开发版本 :

# Mac OS X via Homebrew
$ brew install httpie --HEAD

# Universal
$ pip install --upgrade https://github.com/jkbrzt/httpie/archive/master.tar.gz

 

Python 版本

虽然 Python 2.6 和 2.7 也支持, 如果有可能的话,还是推荐使用Python 3.x来安装HTTPie.它可以确保一些新的HTTP特性,例如 SNI (服务器名称指示), 拿来即可用. 从0.9.4开始安装Homebrew默认的就需要的Python 3.查看 HTTPie 版本,可以使用 run http --debug.

使用

Hello World:

$ http httpie.org

简单介绍:

$ http [flags] [METHOD] URL [ITEM [ITEM]]

See also http --help.

 

例子

自定义 HTTP 方法, HTTP头 和 JSON 数据:

$ http PUT example.org X-API-Token:123 name=John

提交 表单:

$ http -f POST example.org hello=World

查看请求日志,可以添加一个 输出参数:

$ http -v example.org

使用 Github API 回复一个问题 ,并带上授权信息:

$ http -a USERNAME POST https://api.github.com/repos/jkbrzt/httpie/issues/83/comments body='HTTPie is awesome! :heart:'

使用 redirected进行文件上传:

第 3 段(可获 1.76 积分)
$ http example.org < file.json

下载文件,并使用 重定向保存文件:

$ http example.org/file > file

使用wget下载文件:

$ http --download example.org/file

使用 sessions 来保存会话信息,从而允许我们与同一主机持久通信:

$ http --session=logged-in -a username:password httpbin.org/get API-Key:123

$ http --session=logged-in httpbin.org/headers

设置自定义头用来解决缺少的DNS信息:

$ http localhost:8000 Host:example.com

下面是详细的文档. 它包含了命令的语法,高级用法并且还提供了额外的例子。

第 4 段(可获 0.73 积分)

HTTP 方法

HTTP 方法名的正确位置是在URL参数之前:

$ http DELETE example.org/todos/7

这看起来与 Request-Line 情形类似:

DELETE /todos/7 HTTP/1.1

如果在命令行中,方法参数被省略了,HTTPie 默认值是 GET (不带请求数据) 或 POST (带请求数据).

 

Request URL

HTTPie 执行请求时唯一需要的就是 URL. 不出所料,它的默认协议是  http://, 并且可以被省略掉 – http example.org 也可以正常工作.

此外,, curl-like 支持缩写localhost. 这意味着, 例如 :3000 代表 http://localhost:3000, 如果端口被省略, 那么它的端口是80.

第 5 段(可获 1.23 积分)
$ http :/foo
GET /foo HTTP/1.1
Host: localhost
$ http :3000/bar
GET /bar HTTP/1.1
Host: localhost:3000
$ http :
GET / HTTP/1.1
Host: localhost

如果你要自己构建URL里面的请求参数(querystring parameters),你可以按照 param==value 这个语法来添加,同时不需要在中间添加 & 符号。 与此同时,httpie也能自动转换特殊字符(已经转义的除外)。如果想在Google Image搜索HTTPie的logo,你能使用这个命令:

第 6 段(可获 0.84 积分)
$ http www.google.com search=='HTTPie logo' tbm==isch
GET /?search=HTTPie+logo&tbm=isch HTTP/1.1

你可以使用 --default-scheme <URL_SCHEME> 参数,来创建其它协议(除了 HTTP)的别名:

$ alias https='http --default-scheme=https'

 

请求项

不同请求项类型之间有一些小的差异,它提供了一种机制方便设置HTTP头, 简单的 JSON 和表单数据, 文件, 和URL参数.

它们是URL后边指定的 键/值 对. 它们有一个共性:成为发送请求的一部分, 并且类型的唯一区别是使用分隔符: :, =, :=, ==, @, =@, 和 :=@.  带有 @ 的表示它的值是一个文件路径.

第 7 段(可获 1.09 积分)
Item TypeDescription

HTTP 头

名称:值

任意 HTTP 头, 如. X-API-Token:123.

URL 参数

名称==值

将键/值对做为查询参数追加到URL后.  使用== 作为分隔符.

数据字段

字段=值,

字段=@file.txt

请求的数据字段将序列化为JSON对象(默认的), 或将被编码 (--form, -f).

原生JSON字段

字段:=json, 字段:=@file.json

发送 JSON时会很有用,并且一个或多个字段应该是布尔, 数字, 嵌套对象, 或数组, 例如., meals:='["ham","spam"]'pies:=[1,2,3] (注意引号).

表单文件字段

字段@/dir/file

只能用于 --form, -f. 例如screenshot@~/Pictures/img.png. 表示一个文件字段与值存在于multipart/form-data 请求中.
第 8 段(可获 1.13 积分)

你可以使用\来转义那些不需要做为分隔符的字符(或其它部分). 例如, foo\==bar 将成为键/值对数据 (foo= 和 bar),而不会做为 URL 参数.

通常需要用引号将值引起来, 如. foo='bar baz'.

如果任何字段名称或头 以减号开头 (如., -fieldname), 在特殊标记--之后,你需要将它们引起来, 防止与 --参数混淆:

$ http httpbin.org/post  --  -name-starting-with-dash=foo --Weird-Header:bar
POST /post HTTP/1.1
--Weird-Header: bar

{
    "-name-starting-with-dash": "value"
}
第 9 段(可获 0.88 积分)

注意,数据字段并不是指定请求数据的唯一方式 : Redirected input 允许通过请求发送任意的数据.

 

JSON

JSON 是现代web服务的 通用语 ,并且它也是隐含的内容类型, 被HTTPie默认使用:

如果你的命令包含一些数据项, 默认的将会被序列化为JSON对象. HTTPie 还会自动设置下面的标题, 两者都可以被覆盖:

Content-Typeapplication/json
Acceptapplication/json, */*

你可以使用 --json, -j 将显示的设置接受 application/json, 不管你是否发送数据 (这是用通用的标题符号来设置头的简写形式 – http url Accept:application/json, */*). 另外, 即使 Content-Type 是设置为错误text/plain 或未知类型,HTTPie 也将尝试检测 JSON 返回值.

第 10 段(可获 1.49 积分)

简单示例:

$ http PUT example.org name=John email=john@example.org
PUT / HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Content-Type: application/json
Host: example.org

{
    "name": "John",
    "email": "john@example.org"
}

非字符串字段使用:= 分隔符, 它允许你嵌入原始的JSON到返回值对象中. 文件和原始的JSON文件也可以被嵌入到字段中,通过使用 =@:=@:

$ http PUT api.example.com/person/1 \
    name=John \
    age:=29 married:=false hobbies:='["http", "pies"]' \  # Raw JSON
    description=@about-john.txt \   # Embed text file
    bookmarks:=@bookmarks.json      # Embed JSON file
第 11 段(可获 0.39 积分)
PUT /person/1 HTTP/1.1
Accept: application/json, */*
Content-Type: application/json
Host: 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",
    }
}

发送 保存在文件中的JSON 数据 (更多示例请查看 redirected input ):

$ http POST api.example.com/person/1 < person.json

 

表单

提交表单与发送 JSON 请求非常类似. 通常唯一的区别是添加 --form, -f 参数, 这确保了数据的字段都会被序列化为JSON, 并且 Content-Type将设置为, application/x-www-form-urlencoded; charset=utf-8.

通过配置 文件隐式的设置内容类型,然后提交表单数据,这也是可以实现的.

 

普通表单

$ http --form POST api.example.org/person/1 name='John Smith' \
    email=john@example.org cv=@~/Documents/cv.txt
POST /person/1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8

name=John+Smith&email=john%40example.org&cv=John's+CV+...

 

文件上传表单

如果有一个或多个文件需要上传, 序列化与内容类型就是 multipart/form-data:

$ http -f POST example.com/jobs name='John Smith' cv@~/Documents/cv.pdf
第 12 段(可获 1.01 积分)

上面的请求与我们通过下面的表单提交的效果是一样的:

<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.1
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: valued-visitor=yes;foo=bar
Host: example.org
Referer: http://httpie.org/
User-Agent: Bacon/1.0
X-Foo: Bar

有一些HTTPie设置的默认的头信息:

GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: HTTPie/<version>
Host: <taken-from-URL>

任何一个默认的头可以被重写,并且也可以被删除.

删除一个已经设置了的头信息 (例如一个默认的头), 使用 Header::

$ http httpbin.org/headers Accept: User-Agent:

发送一个空的头, 使用 Header;:

$ http httpbin.org/headers 'Header;'
第 13 段(可获 1.21 积分)

身份验证

当前支持的身份验证方案是 Basic 与 Digest (更多请查看 身份验证插件 ). 有两个参数影响身份验证:

--auth, -a通过输入username:password做为参数. 或者, 如果你只指定了用户名 (-a username), 在发送请求之前,将提示你输入密码. 发送一个空的密码, 可以使用 username:.  最好的方式是使用URL 语法 username:password@hostname(但使用-a 凭证, 有更高的优先级).
--auth-type, -A指定身份验证机制. 可能的值是 basic 和 digest. 默认值是 basic, 所以它通常可以省略.

 

基本认证:

$ http -a username:password example.org

摘要认证:

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

输入密码:

$ http -a username example.org

可以很荣幸的从你的~/.netrc 文件中获取到授权信息:

$ cat ~/.netrc
machine httpbin.org
login httpie
password test

$ http httpbin.org/basic-auth/httpie/test
HTTP/1.1 200 OK
[...]
第 14 段(可获 1.26 积分)

身份验证插件

HTTP 重定向

默认情况下, HTTP 重定向不会继续执行,且只展示第一个响应. To instruct HTTPie to follow the Location header of 30x responses and show the final response instead, use the --follow, -F option.

If you additionally wish to see the intermediary requests/responses, then use the --all option as well.

To change the default limit of maximum 30 redirects, use the --max-redirects=<limit> option.

$ http --follow --all --max-redirects=5 httpbin.org/redirect/3

 

代理

你可以通过 --proxy 参数来设置要使用的代理服务器(支持多个代理,包括值中需要重定向的协议):

第 15 段(可获 1.43 积分)
$ 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

配置代理也可以通过设置环境变量 HTTP_PROXY 和 HTTPS_PROXY, 并且底层的请求将会使用这两个变量. 如果你想通过环境变量禁用特定主机的代理,可以设置置 NO_PROXY.

在你的~/.bash_profile文件内添加:

export HTTP_PROXY=http://10.10.1.10:3128
export HTTPS_PROXY=https://10.10.1.10:1080
export NO_PROXY=localhost,example.com

SOCKS

要启用 SOCKS 代理,请使用pip安装requests[socks] :

$ pip install -U requests[socks]

使用方法和 proxies类似:

$ http --proxy=http:socks5://user:pass@host:port --proxy=https:socks5://user:pass@host:port example.org

 

HTTPS

 

服务器SSL证书验证

跳过 主机的SSL证书验证, 你可以传入 --verify=no (默认值为 yes):

$ http --verify=no https://example.org

你还可以使用 --verify=<CA_BUNDLE_PATH> 来设置 自定义CA文件路径:

$ http --verify=/ssl/custom_ca_bundle https://example.org
第 16 段(可获 1.15 积分)

通过环境变量REQUESTS_CA_BUNDLE 也可以配置路径(将会被底层的python-requests库使用):

$ REQUESTS_CA_BUNDLE=/ssl/custom_ca_bundle http https://example.org

 

客户端SSL证书

使用客户端证书的SSL通信, 你可以通过 --cert参数传入证书文件路径:

$ http --cert=client.pem https://example.org

如果证书文件中没有包含私钥,你需要通过 --cert-key参数传入密钥文件路径:

$ http --cert=client.crt --cert-key=client.key https://example.org
第 17 段(可获 0.78 积分)

SSL 版本

通过 --ssl=<PROTOCOL> 可以指定想要使用的的协议版本. 它的默认值为安全级别最高的协议 SSL v2.3 ,并且服务器与你的安装的OpenSSL都支持. 可用的协议是 ssl2.3, ssl3, tls1, tls1.1, tls1.2. (实际可用的一组协议可能取决于你安装的OpenSSL.)

# Specify the vulnerable SSL v3 protocol to talk to an outdated server:
$ http --ssl=ssl3 https://vulnerable.example.org

 

SNI (服务器名称标识)

如果你使用 HTTPie 且 Python 版本 低于 2.7.9 (可以通过 http --debug来验证) ,并且需要通过 SNI (服务器名称标识) 与服务器交互,那么你需要安装一些额外的依赖:

$ pip install --upgrade pyopenssl pyasn1 ndg-httpsclient

您可以使用下面的命令来测试SNI的支持情况:

$ http https://sni.velox.ch
第 18 段(可获 1.26 积分)

输出选项

HTTPie默认只输出最后响应,整个响应消息将被打印(头部也是包体(body)的一部分)。

你可以通过下列选项控制打印内容:

--headers, -h只打印响应头(header)
--body, -b只打印响应体(body)
--verbose, -v打印整个HTTP交换的过程(请求和响应)。这个选项也允许  --all (如下)
--print, -p选择部分HTTP交换过程

--verbose 在调试请求的时候经常被用到,例子:

$ http --verbose PUT httpbin.org/put hello=world
PUT /put HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Content-Type: application/json
Host: httpbin.org
User-Agent: HTTPie/0.2.7dev

{
    "hello": "world"
}


HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 477
Content-Type: application/json
Date: Sun, 05 Aug 2012 00:25:23 GMT
Server: gunicorn/0.13.4

{
    […]
}

所有其他选项都是--print , -p 的缩写,他接受一个由以下字符组成的字符串,每个字符表示HTTP交换过程的一个部分:

第 19 段(可获 1.29 积分)
CharacterStands for
H请求头
B请求体
h响应头
b响应体

打印请求和响应的header:

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

 

查看请求/响应中间过程

为了看到HTTP通信所有过程,如:最终请求/响应以及任何可能的中间请求/响应,使用 --all 选项。 HTTP通信的中间过程包含重定向(使用了--follow选项时), 如在使用了HTTP摘要认证(--auth=digest)的请求中的第一次未认证请求情况。

# Include all responses that lead to the final one:
$ http --all --follow httpbin.org/redirect/3
第 20 段(可获 0.78 积分)

中间过程的请求/响应都是按照--print, -p (简写)选项的默认格式打印的。如果你不想使用默认格式打印,就得使用 --history-print, -P 选项。它与 --print, -p是一样的参数配置,但仅仅应用于中间请求。

# Print the intermediary requests/responses differently than the final one:
$ http -A digest -a foo:bar --all -p Hh -P H httpbin.org/digest-auth/auth/foo/bar

 

条件响应体下载

作为一个优化,下载的自服务器响应体只有是输出的一部分。这有点类似于执行 HEAD 请求, 不同于你使用其它HTTP方法。

第 21 段(可获 0.96 积分)

假设有一个API,当更新一个资源时,它返回整个资源,但你只对包含更新状态码有关的响应头感兴趣:

$ http --headers PATCH example.org/Really-Huge-Resource name='New Name'

因为我们只打印HTTP头,在响应头接收到后服务器就会尽快关闭这个链接。 因此就不会浪费带宽和时间来下载你不感兴趣的响应体。

响应头总是会下载,即使它们不是输出的一部分。

第 22 段(可获 1.14 积分)

重定向输入

向请求传入数据的一个通用方式是通过重定向到 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

你甚至可以用管道符把几个HTTPie连着使用:

$ 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

在 OS X系统中,你可以使用 pbpaste发送剪贴板中的内容:

$ pbpaste | http PUT example.com

在命令行通过stdin传递数据不能指定数据的字段:

$ echo 'data' | http POST example.org more=data   # This is invalid

为了防止HTTPie读取标准输入数据可以使用——ignore-stdin选项。

第 23 段(可获 1.36 积分)

发送文件中的数据

一种替代重定向到stdin是指定一个文件名 (as @/path/to/file)其内容是来自stdin。

它的优势是Content-Typeheader 是根据文件名的后缀自动设置的 。 例如, 以下就是使用 Content-Type: application/xml 来发送XML文件中的内容:

$ http PUT httpbin.org/put @/data/file.xml

 

终端输出

HTTPie默认做几件事来让终端输出更容易阅读。

 

颜色和格式

语法高亮被用于HTTP headers 和bodies (这是有意义的)。如果你不喜欢默认的颜色, 你可以--style 选项来选择你自己颜色方案 (通过$ http --help 可以看到有哪些可设置的值)。

同时,会使用以下格式:

  • HTTP headers会以名称排序
  • JSON 数据会缩进, 会按照 key排序, 同时会转换Unicode转义符说代表的字符

这些选项可以用于控制输出处理:

--pretty=all同时应用颜色和格式。作为终端的默认输出
--pretty=colors应用颜色
--pretty=format应用格式
--pretty=none禁用输出处理。使用默认的重定向输出。
第 24 段(可获 2.15 积分)

二进制数据

二进制数据不会在终端输出, 这使得它可以安全地执行请求发回数据。在重定向中二进制数据也是禁用的,但可以美化(格式化)输出。一旦我们知道响应体是二进制,连接就关闭了

$ http example.org/Movie.mov

你就会立刻看到这样的东西:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Encoding: gzip
Content-Type: video/quicktime
Transfer-Encoding: chunked

+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+
第 25 段(可获 0.7 积分)

重定向输出

terminal output相比,HTTPie在重定向输出中可以使用多种默认方式:

  • 格式和颜色不适用 (除非使用 --pretty选项).
  • 只有响应正文被打印 (除非有一个 output options 被设置).
  • 当然, 二进制数据是可输出的.

原因是不需要其他开关就可以通过管道把 HTTPie的输出重定向到另一个程序下载文件。 大多数时候,只有原始响应体是我们感兴趣的才会重定向输出。

下载一个文件:

$ http example.org/Movie.mov > Movie.mov

从 Octocat下载一个图片,然后使用ImageMagick重新调整大小,最后把它上传到另外一个地方:

第 26 段(可获 1.19 积分)
$ 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输出中的颜色转义符。

你可以创建一个调用 HTTPie着色和页面化输出的快捷方式: ~/.bash_profile:

function httpless {
    # `httpless example.org'
    http --pretty=all --print=hb "$@" | less -R;
}

 

下载模式

HTTPie的下载模式类似于wget。

当使用--download(简写-d) 选项时,响应header就会打印在终端里(stderr:标准错误输出),并且在响应体内容保存为文件的过程有一个进度条显示出来。

$ http --download https://github.com/jkbrzt/httpie/archive/master.tar.gz
HTTP/1.1 200 OK
Content-Disposition: attachment; filename=httpie-master.tar.gz
Content-Length: 257336
Content-Type: application/x-gzip

Downloading 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会添加一个唯一的后缀。

第 27 段(可获 1.46 积分)

你也可以把响应体重定向到另外一个程序,但响应header和进度条任然会显示在终端中:

$ 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 选项只改变响应体如何处理
  • 使用sessions, --verbose, -v, 等选项是,任然可以自定义header
  • --download 总是意味着--follow (遵循重定向).
  • 如果响应体还没有完全下载,HTTPie 存在状态码: 1 (错误)
  • 不能同时使用Accept-Encoding与 --download
第 28 段(可获 1.28 积分)

流式响应

以块的方式下载或打印响应,能够使得下载一个大文件而不占用太多内存。 然而,当应用颜色和格式时,整个响应是被缓存的,只处理一次。

你可以使用--stream(简写 -S)选项来做如下两件事:

  1. 输出被刷新在更小的块,而没有任何缓存,这有点像 tail -f 处理 URL.
  2. 流一旦开启,即使设置了美化格式,响应的每一行都会应用上且立即输出。针对唱活动链接而言这可能是一个很好的输出方式,比如: Twitter streaming API。
第 29 段(可获 1.4 积分)

美化流式响应:

$ http --stream -f -a YOUR-TWITTER-NAME https://stream.twitter.com/1/statuses/filter.json track='Justin Bieber'

流式输出就像使用 tail -f一样一小段一小段的输出:

# Send each new tweet (JSON object) mentioning "Apple" to another
# server as soon as it arrives from the Twitter streaming API:
$ 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

 

会话

默认情况下, 每一个请求都完全独立于以前的任何一个请求。 HTTPie 也支持持久性会话, 在同一个主机下,自定义的headers (除了以 Content- 或 If-开头的)、授权、cookies (手动指定或由服务器发送) 会被保存下来。

第 30 段(可获 0.66 积分)

命名的会话

example.org创建一个名叫user1的会话:

$ http --session=user1 -a user1:password example.org X-Foo:Bar

现在你可以通过名称来使用这个session,上一次的认证信息和header会被自动的设置则本次请求中:

$ http --session=user1 example.org

为了创建或重用不同的session,你可以指定不同的名称:

$ http --session=user2 -a user2:password example.org X-Bar:Foo

为了仅使用而不修改首次请求响应的时创建的session,应该使用 --session-read-only=SESSION_NAME 

命名session的数据是以JSON文件的方式存储在如下目录中: 

 ~/.httpie/sessions/<host>/<name>.json

(Windows系统是这样的格式:%APPDATA%\httpie\sessions\<host>\<name>.json ).

 

匿名会话

代替命名session,你可以直接使用一个session文件。它可以在不同的主机间重用:

$ http --session=/tmp/session.json example.org
$ http --session=/tmp/session.json admin.example.org
$ http --session=~/.httpie/sessions/another.example.org/test.json example.org
$ http --session-read-only=/tmp/session.json example.org

警告: 所有的session 数据, 包括:credentials, cookie 数据和自定义headers 都是以明文的方式存储的(安全问题)。

第 31 段(可获 1.5 积分)

请注意, session 文件也是可以使用文本编辑器手动创建和编辑的; 它们是普通的JSON文件。

详情请阅读Config.

 

配置

HTTPie 使用了一个简单的JSON对象格式的配置文件,包含的key如下:

 

__meta__

是HTTPie 自动存储元数据。不能修改。

 

default_options

这是一个数组格式的默认选项 (默认情况下是空的),应用于每一个 HTTPie调用。

例如,你可以使用这个选项来修改默认的样式和输出选项:"default_options": ["--style=fruity", "--body"] 另一个有用的默认选项: "--session=default" 可以使HTTPie 总是使用 sessions (会自动使用一个名叫 default的 session)。 或者你可以用"--form"选项改变请求的默认内容类型从JSON改为form。

第 32 段(可获 1.45 积分)

在命令行中,某些特殊的调用,可以使用 --no-OPTION 参数来重置配置文件中的默认选项,如: ( --no-style 或 --no-session)。配置文件的默认位置是: ~/.httpie/config.json (在Windows系统是:%APPDATA%\httpie\config.json )。配置文件的目录位置是可以通过环境变量HTTPIE_CONFIG_DIR来修改的。

 

脚本

当在 shell脚本中使用HTTPie时,,它可以方便的设置 --check-status 标记。它表示 HTTPie退出时HTTP的一个响应状态: 3xx, 4xx, or 5xx对应的退出状态码分布将是 3 (除非设置了--follow )、 4,、 5来表示。

--ignore-stdin 选项是为了防止HTTPie 从 stdin读取数据,在非交互式调用下,从stdin读取数据是不可取的。

另外, --timeout 选项可以覆盖默认的30秒超时:

#!/bin/bash

if http --check-status --ignore-stdin --timeout=2.5 HEAD example.org/health &> /dev/null; then
    echo 'OK!'
else
    case $? in
        2) 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!' ;;
    esac
fi
第 33 段(可获 1.4 积分)

接口设计

如果命令的参数与实际的HTTP请求语法相对应,会更容易记住和阅读。 通常可以将HTTP请求转换为一个HTTPie请求参数列表的内联。例如,这个HTTP请求:

POST /collection HTTP/1.1
X-API-Key: 123
User-Agent: Bacon/1.0
Content-Type: application/x-www-form-urlencoded

name=value&name2=value2

对应的HTTPie 命令:

$ http -f POST example.org/collection \
  X-API-Key:123 \
  User-Agent:Bacon/1.0 \
  name=value \
  name2=value2
第 34 段(可获 0.8 积分)

注意,元素的顺序和语法非常相似, 这只是一小部分用来控制HTTPie的命令,它不直接对应于请求的任何部分 (这里的 -f 选项要求HTTPie发送一个 form格式的请求)。

两种模式: --pretty=all (终端默认的) 和--pretty=none (重定向输出的默认的), 允许对用户友好的交互式使用和脚本使用,HTTPie 可以作为一个通用的HTTP 客户端。

HTTPie仍在不断的发展,与1.0的最终版相比 现在的命令行语法和某些选项 --OPTIONS可能会有轻微的变化 。所有的变化都被记录到了更新日志 (change log)中.

第 35 段(可获 1.39 积分)

支持

请使用如下渠道来获取相应支持:

作者

Jakub Roztocil (@jkbrzt) 创建了 HTTPie 项目,贡献者请看 这里

Logo

请看 claudiatd/httpie-artwork

贡献

请看 CONTRIBUTING.

改进记录

请看 CHANGELOG.

许可证

See LICENSE.

相关项目

  • jq — 一个命令行的 JSON 处理器,可以很好的跟 HTTPie 一起工作
  • http-prompt — 一个交互式的 SHELL 让 HTTPie 提供自动完成和命令的语法高亮功能
第 36 段(可获 1.24 积分)

文章评论