HTTPie介绍——一个轻量级HTTP客户端

HTTPie 是一个用于与 HTTP 服务器进行交互的命令行客户端。

概览

HTTPie(发音为 H-T-T-派)是一个基于命令行的 HTTP 客户端,可以提供更加人类友好的命令行交互,HTTPie 可用于测试、调试以及与 HTTP 服务器进行交互。

HTTPie 提供了一个 http 命令,这个命令可以使用简单自然的语法发送任意 HTTP 请求,并以精美的彩色输出作为响应结果。

在这篇文章中,我们将学习如何使用此工具访问 REST 服务。

功能

作为一个现代化命令行工具,HTTPie 提供了如下功能:

  • 简单、直观的 HTTP 命令语法
  • 漂亮的格式化输出
  • 天然的 JSON 支持
  • 表单和文件上传
  • 支持自定义 HTTP 头
  • 主流操作系统支持 —— Linux、macOS、Windows
  • 通过插件扩展额外功能

在后边的文章中,你将看到这些功能的介绍。

安装

可以通过多种方式来安装 HTTPie。

macOS

1
brew install httpie

Linux(Ubuntu)

1
apt-get install httpie

Windows

1
2
pip install --upgrade pip setuptools
pip install --upgrade httpie

或者

1
easy_install httpie

使用

现在 HTTPie 已经安装在了本地电脑上,可以来调用各种 HTTP 接口。

后边的文章中,我将会使用下边三个网站来演示相关功能:

调用 http

HTTPie 提供 http 命令来访问 HTTP 服务器。以下是 http 命令最基本的用法,返回了 HTTP 响应头和其他服务器信息。

1
2
3
4
5
6
7
8
9
10
11
12
➜ http httpie.org

HTTP/1.1 301 Moved Permanently
CF-RAY: 543ebdd4cad6eb79-LAX
Cache-Control: max-age=3600
Connection: keep-alive
Date: Thu, 12 Dec 2019 09:41:15 GMT
Expires: Thu, 12 Dec 2019 10:41:15 GMT
Location: https://httpie.org/
Server: cloudflare
Transfer-Encoding: chunked
Vary: Accept-Encoding

获取数据

最常见的 HTTP 操作是从服务器检索信息,通常通过 HTTP GET 方法来实现。HTTP GET 请求的查询参数是可选的。

下边是一个 HTTPie 的 GET 方法示例(无查询参数):

1
http GET http://httpbin.org/get

但是,不带查询参数的 GET 请求很少见。可以通过在原始请求后边追加 param==value 的方式来添加参数。

下边的示例演示了如何在 GET 请求中携带参数。我们来获取 userId 为 1 的所有帖子。

1
➜ http https://jsonplaceholder.typicode.com/posts userId==1

下边是多个参数的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
➜ http https://jsonplaceholder.typicode.com/posts userId==1 id==9

HTTP/1.1 200 OK
// 忽略响应头

[
{
"body": "consectetur animi nesciunt iure dolore\nenim quia ad\nveniam autem ut quam aut nobis\net est aut quod aut provident voluptas autem voluptas",
"id": 9,
"title": "nesciunt iure omnis dolorem tempora et accusantium",
"userId": 1
}
]

在 HTTP 请求头中携带信息是很常见的做法,在 HTTPie 中我们可以使用 Header:Value 格式添加 HTTP 请求头,如下所示:

1
http example.org X-Foo:Bar Sample:Value

发布和更新数据

HTTP 的 POST 方法通常用于在服务器上创建资源,下边的示例演示了如何使用内联方式提供 JSON 数据并发送 POST 请求,注意:非字符串类型参数的格式为 Param:=Value

1
2
3
4
5
6
7
8
9
10
11
➜ http POST https://jsonplaceholder.typicode.com/posts title=foo body=bar userId:=9

HTTP/1.1 201 Created
// 忽略响应头

{
"body": "bar",
"id": 101,
"title": "foo",
"userId": 9
}

HTTPie 允许我们将 JSON 数据存入文件中,并在命令行中指定这个文件的路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜ cat data.txt
{
"title": "foo",
"body": "bar",
"userId": 9
}

➜ http POST https://jsonplaceholder.typicode.com/posts data=@data.txt

HTTP/1.1 201 Created
// 忽略响应头

{
"data": "{\n \"title\": \"foo\",\n \"body\": \"bar\",\n \"userId\": 9\n}\n",
"id": 101
}

HTTP PUT 方法通常用于更新服务器中已存在的资源,用法和 POST 类似:

1
➜ http PUT https://jsonplaceholder.typicode.com/posts/10002 data=@data.txt

删除数据

HTTP DELETE 方法用于删除 HTTP 服务器中的资源,示例如下:

1
➜ http DELETE https://jsonplaceholder.typicode.com/posts/1

通过 HTTPie 进行认证

上边的示例中我们演示了 HTTPie 的核心用法,在这些示例中,我们假设资源都是可以在不需要任何身份认证的情况下就能够访问的。但在实际场景中很少有这种情况,大多数服务都有安全防护,并强制要求它的用户在访问资源前进行身份认证。

现代化 HTTP 客户端程序为多种认证模式提供了很好的支持,HTTPie 也不例外,支持主流如:Basic、摘要、密码等认证类型。

使用 Basic 认证访问资源

HTTP Basic 认证是 HTTP 协议中的身份验证方案。在 Basic 认证中,HTTP Authorization 请求头设置为 Basic,用户名和密码以明文形式提供。Basic 认证总是需要配合其他安全机制,如:HTTPS。

以下示例演示如何访问一个要求用户通过 Basic 认证来进行身份验证的资源:

1
2
3
4
5
6
➜ http --default-scheme=https https://httpbin.org/basic-auth/username/password

HTTP/1.1 401 UNAUTHORIZED
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
// 其他响应头

可以看到,请求在未提供用户名和密码的情况下,服务器的响应状态码为 401 UNAUTHORIZED。HTTPie 通过以 -a username:password 的方式提供 Basic 认证所需要的用户名密码:

1
2
3
4
5
6
7
8
9
10
11
➜ http --default-scheme https https://httpbin.org/basic-auth/username/password -a username:password
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
// 其他响应头

{
"authenticated": true,
"user": "username"
}

使用摘要认证访问资源

Basic 认证的主要问题是它将用户名和密码以明文的方式发送至服务器。摘要认证略有不同,在摘要认证而非明文模式中,它采用基于哈希的方法与服务器传递凭据。

以下是摘要认证的流程:

  1. 客户端请求一个需要认证的页面,但是不提供用户名和密码。
  2. 服务器返回 401 Unauthorized 响应代码,并提供认证域(realm),以及一个随机生成的、只使用一次的数值,称为密码随机数 nonce。
  3. 客户端以上一步中得到的随机数(nonce)、用户名、密码和 realm 的哈希值作为响应
  4. 服务器利用这些信息对客户端进行身份验证,如果身份验证成功,则返回客户端所请求的资源

HTTPie 使用 -A 摘要标志 并通过 -a 参数提供相应的用户名和密码即可进行摘要认证,如下所示:

1
2
3
4
5
6
7
8
9
10
11
➜ http --default-scheme https -A digest -a aa:bb https://httpbin.org/digest-auth/auth/aa/bb
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
// 其他响应头

{
"authenticated": true,
"user": "aa"
}

插件方面,HTTPie 还支持其他身份验证机制,如:jwt-auth、OAuth 等。

总结

HTTPie 是一个轻量但强大的工具,可以轻松与 HTTP 服务器通信。通过 http 命令并配合合理参数调用各种 HTTP 方法的能力使其成为 RESTful 和微服务生态的理想选择。