12 个稳定版本
2.0.0 | 2024 年 4 月 17 日 |
---|---|
1.6.1 | 2023 年 4 月 7 日 |
1.6.0 | 2022 年 1 月 21 日 |
1.5.1 | 2021 年 8 月 10 日 |
0.1.8 | 2020 年 7 月 7 日 |
#70 在 HTTP 客户端 中
每月 30 次下载
165KB
4K SLoC
:imagesdir: doc ifdef::env-github[] :imagesdir: https://raw.githubusercontent.com/Leopard2A5/fhttp/master/doc endif::[]
:toc
这是什么?
基于文件的命令行 HTTP 客户端。
FHTTP 不是 curl 的替代品。它是一个开发者工具,用于发送 http 请求并将它们存储为文件,通常与接受 http 请求的应用程序一起存储在源代码仓库中。它受到了 Postman、Insomnia 和 IntelliJ http 客户端等工具的启发。
|=== |特性 |CUrl |FHTTP |Postman |Insomnia |Intellij
|GUI |✕ |✕ |✓ |✓ |✕ |请求集合 |✕* |✓ |✓ |✓ |✓ |版本控制 |✕* |✓ |✕ |✕ |✓ |可脚本化 |✓ |✓ |✕ |✕ |✕ |环境变量 |✓ |✓ |✕ |✕ |✓ |配置文件 |✕ |✓ |✓ |✓ |✕ |Pass 密码 |✕* |✓ |✕ |✕ |✕ |在一次操作中运行多个请求 |✕ |✓ |✓ |✕ |✕ |共享集合 |✕* |✓ |✓** |✕ |✓ |完整 JavaScript 响应处理 |✕ |✕ |✓ |✕ |✓ |插件 |✕ |✕ |✕ |✓ |✕ |GraphQL 模式自动完成 |✕ |✕ |✕ |✓ |✕
|=== $$*$$ 如果使用 shell 脚本与 CUrl 结合使用则可用
$$**$$ 需要帐户
安装
有几种方法可以安装 FHTTP
- homebrew . 运行
brew tap Leopard2A5/fhttp && brew install fhttp
- 通过 cargo . 运行
cargo install fhttp
(注意:在 ubuntu 上,您需要 apt 软件包build-essential
、pkg-config
和libssl-dev
) - 手动 . 下载最新版本 这里 . 重命名下载的文件 . 使文件可执行 . 确保它在您的 PATH 上
Linux 用户:如果您在
加载共享库时遇到错误:libssl.so.1.0.0:无法打开共享对象文件:没有找到文件或目录
您需要安装 libssl1.0.0: sudo apt-get install libssl1.0.0
特性
- 在 *.http 文件中简单地编写请求
- 直接在项目仓库中保存请求集合
- 使用配置文件轻松切换环境
- 在请求中解析(环境)变量
- 解析存储在 pass 中的机密
- 添加请求之间的依赖关系
- 支持 GraphQL 请求
- 支持多部分文件上传
- 导出为 cURL 命令
请求文件结构
HTTP 格式
请求文件如下所示:[源代码]
METHOD URL
HEADERS?
BODY?
RESPONSE_HANDLER?
唯一必需的部分是方法(get、post、patch等)和URL。您可以使用#
作为前缀来忽略该行。
示例请求:[源代码]
POST https://oauth2tokenendpoint
content-type: application/json; charset=UTF-8
{
"client_id": "foo",
"client_secret": "bar"
}
> {%
json $.access_token
%}
JSON 和 YAML
从版本 1.6 开始,FHTTP 支持在 json 和 yaml 文件格式中编写请求。这些格式的主要优势是它们是众所周知的,并且允许您以更大的控制创建多部分请求。它们也是 FHTTP 中唯一可以混合文件部分和表单数据部分的多部分请求的方式。它们的格式和结构相同。
由于 JSON 的冗长性和 YAML 改进的多行字符串处理功能,建议使用 YAML 格式。
.Graphql请求
method: post
url: https://127.0.0.1/graphql
headers:
authorization: Bearer ${request("token.http")}
content-type: application/json
body: |
{
"query": "query($series: String!) { characters(series: $series) { name } }",
"variables": {
"series": "Breaking Bad"
}
}
response_handler:
json: "$.data.characters"
.多部分JSON请求
{
"method": "post",
"url": "https://127.0.0.1/upload",
"body": [
{
"name": "metadata",
"text": "{ \"foo\": \"bar\" }",
"mime": "application/json"
},
{
"name": "file",
"filepath": "image.png"
}
]
}
与 *.http 文件一样,方法和 URL 是必需的,而标题、正文和 response_handler 是可选字段。
请注意,与 *.gql.http 请求不同,json 和 yaml 格式没有 GraphQL 便利函数。
body 属性可以是普通字符串或对象列表,用于创建多部分请求。每个对象需要一个 name
以及一个 text
或 filepath
。您可以通过 mime
属性为该部分强制设置内容类型。
输出
FHTTP 会方便地将日志消息打印到 stderr,将响应正文打印到 stdout。例如
>fhttp get-实体.http
[源代码]
> fhttp request.http
POST https://auth-server/token... 200 OK
GET https://server/entities... 200 OK
{
"payload": 123
}
在这个例子中 get-entities.http
依赖于另一个请求来获取认证令牌,该令牌首先执行。然后 FHTTP 使用 token.http
中的数据预处理 get-entities.http
并执行它,将结果打印到 stdout。
您可以通过传递 -P
或 --print-paths
标志来告诉 FHTTP 打印执行请求文件的路径,而不是方法和 URL。这在处理将多个查询和突变组合在单个路径(/graphql)下的 GraphQL 服务器时特别有用。
详细选项
通过使用 -v
选项增加详细程度,您可以告诉 FHTTP 也记录 pass 机密的使用。如果 FHTTP 似乎很慢,这可能很有用,因为 pass 查找可能需要一些时间。
它是如何工作的?
当您调用 FHTTP 时,以下操作将发生
- 查找配置文件,加载默认配置文件,加载请求的配置文件(如果有)
- 对于每个给定的请求,查找引用的请求,找到最佳执行顺序
- 对于每个请求,解析变量,插入依赖结果,发送请求,如果有的话,应用响应处理器,保存结果,打印结果,除非此请求是依赖项,并且在调用 FHTTP 时用户没有明确指定
请求预处理
您可以在请求文件中使用表达式。表达式的形式为 ${expression}
。以下表格提供了一个当前支持的概述。
预处理表达式 |=== | 表达式 | 描述 | 可用位置
| ${env(NAME)}
| 插入环境变量 NAME,或具有该名称的配置变量。如果找不到变量,FHTTP 将提示您,除非您已激活 --no-prompt
选项。 | 方法,URL,头部,正文
| ${env(NAME, "default")}
| 插入环境变量 NAME,或如果未设置环境变量,则插入给定的默认值。 | 方法,URL,头部,正文
| ${randomInt(lower, upper)}
| 插入一个随机整数。下限和上限是可选的;如果您想给出上限,则必须给出下限。 | 方法,URL,头部,正文
| ${uuid()}
| 插入随机生成的 UUID。 | 方法,URL,头部,正文
| ${request("PATH")}
| 插入由 PATH 指定的请求文件的预处理正文。PATH 可以是绝对路径,也可以是相对于包含 request(...)
表达式的文件的位置。 | 方法,URL,头部,正文
| ${include("PATH")}
| 插入由 PATH 指定的文件的内容。FHTTP 在包含文件时将删除单个尾随换行符。
您可以在包含的文件中使用所有表达式,包括 include
本身,这在处理 GraphQL 片段时特别有用。 | 方法,URL,头部,正文
| ${include_indent("PATH")}
| 与 include
类似,但保留包含文本中调用点的缩进。特别适用于 yaml 请求,因为在正常包含中可能会使 yaml 文档无效。 | 查看 ${include("PATH")}
| ${file("NAME", "PATH")}
| 仅支持在请求体的段中。替换除了其他 file(...)
表达式之外的所有内容。使用此功能发送多部分请求,上传指定的文件。 | body |===
响应处理器/后期处理
每个请求可以包含一个响应处理器表达式。要指定响应处理器,在正文后留一个空行,然后将表达式放在 > {% handler %}
中。例如
[源代码]
POST http://localhost:8080
{
"foo": "bar"
}
> {%
json $.path.inside.response
%}
.支持的响应处理器 |=== | 处理器 | 描述
| json | 接受一个应用于响应体的 jsonpath 表达式。 | deno | *** Deno 不再受支持。 *** |===
配置文件
您可以通过创建配置文件来避免每次调用 FHTTP 时手动提供变量。配置文件允许您轻松切换请求的目标环境。默认情况下,如果存在名为 fhttp-config.json
的文件,FHTTP 将使用该文件。一个配置文件可能看起来像这样
[source,json]
{
"default": {
"variables": {
"URL": "https://127.0.0.1:8080"
}
},
"localhost": {
"variables": {
"token": "NO_AUTH"
}
},
"testing": {
"variables": {
"URL": "https://testing.myapp.com",
"CLIENT_ID": "clientid",
"CLIENT_SECRET": {
"pass": "path/to/clientsecret/in/passwordstore"
},
"token": {
"request": "get_token.http"
}
}
}
}
您可以通过使用 --profile-file
选项来更改要使用的配置文件。
您可以使用 --profile
选项来指定要使用的配置文件。如果存在默认配置文件,则始终加载它,并且其值会被您指定的任何其他配置文件覆盖。
配置文件中的变量可以有不同的形式
.配置变量 |=== | 变量 | 描述 | 示例
| 字符串 | 将变量设置为该字符串。 a| [source]
"var": "string"
| 解密密码 | 使用 pass 密码存储解析变量。 a|[source,json]
{
"pass": "path/in/pass"
}
| 请求 | 解析请求并使用后期处理的响应体作为变量。绝对路径或从配置文件的位置相对路径。 a| [source,json]
{
"request": "path/to/request/file"
}
|===
GraphQL
GraphQL 请求以 json 格式发送到服务器,因此一个简单的 graphql 请求文件可能看起来像这样
[源代码]
POST http://graphqlserver
Content-Type: application/json
{
"query": "query($var1: String!) { foo(var1: $var1) { field1 } }",
"variables": {
"var1": "val1"
}
}
这并不十分美观,尤其是对于较长的 graphql 查询,因为我们需要在 json 中转义换行符。然而,FHTTP 支持直接使用 graphql 请求。只需将文件的扩展名更改为 *.gql.http 或 *.graphql.http,然后像这样修改即可
[源代码]
POST http://graphqlserver
query($var1: String!) {
foo(var1: $var1) {
field1
}
}
{
"var1": "val1"
}
FHTTP 会自动设置内容类型为 application/json,转义查询字符串,并使用查询和变量构造 json 负载数据。响应处理器也支持 graphql 请求。GraphQL 请求也支持完整的预处理表达式范围。
命令行标志和选项
.命令行标志 |=== | 短 | 长 | 描述
| -h | --help | 打印帮助屏幕。
| | --no-prompt | 在提示输入之前失败,而不是在缺少环境变量时。
| -P | --print-paths | 打印请求文件路径而不是方法和 URL。
| -c | --curl | 打印 cURL 命令而不是执行请求。仍然执行依赖项,仅命令行上列出的请求被导出为 cURL 命令。秘密将被导出为评估,例如 $(pass secretpath)
。
| -q | --quiet | 抑制日志输出。
| -v | --verbose | 控制日志详细程度。
| -V | --version | 打印应用程序的版本。
|===
.命令行选项 |=== | 短 | 长 | 描述
| -p | --profile | 要使用的配置文件名。
默认为 "default"。
可以被环境变量 FHTTP_PROFILE 覆盖。
| -f | --profile-file | 要使用的配置文件路径。
默认为 fhttp-config.json。
可以被环境变量 FHTTP_PROFILE_FILE 覆盖。
| -t | --timeout-ms | 为每个请求设置超时时间(毫秒)。
| -o | --out | 将 stdout 输出写入的路径。
将会创建新文件或覆盖现有文件的正文。
|===
依赖项
~16–30MB
~500K SLoC