2个稳定版本
2.0.0 | 2024年4月17日 |
---|---|
1.6.1 | 2023年4月7日 |
#14 in #response
用于 fhttp
150KB
3.5K 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请求
- multipart文件上传
- 导出为cURL命令
请求文件的解剖结构
HTTP格式
请求文件看起来像这样:[source]
METHOD URL
HEADERS?
BODY?
RESPONSE_HANDLER?
唯一必需的部分是方法(get、post、patch、...)和URL。您可以使用#
作为前缀来忽略该行的头部。
示例请求:[source]
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中唯一可以将文件部分和表单数据部分混合到多部分请求中的方式。它们的格式和结构相同。
推荐使用YAML格式,因为JSON冗长,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"
.Multipart 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是可选字段。
请注意,json和yaml格式不像*.gql.http请求那样有一个方便的graphQL函数。
body属性可以是普通字符串或对象列表,用于创建多部分请求。每个对象需要一个name
以及一个text
或filepath
。您可以通过mime
属性强制为该部分指定内容类型。
输出
FHTTP方便地将日志消息打印到stderr,并将响应体打印到stdout。例如
>fhttp get-实体.http
[source]
> 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)下的多个查询和突变的服务器时,这特别有用。
详细选项
通过增加详细程度使用-v
选项,您可以告诉FHTTP记录pass秘密的使用。如果FHTTP似乎很慢,这可能很有用,因为pass查找可能需要一些时间。
它是如何工作的?
当您调用FHTTP时,以下操作将会发生
- 查找配置文件,加载默认配置文件,加载请求的配置文件,如果有的话
- 对于每个给定的请求,查找引用的请求,查找最佳执行顺序
- 对于每个请求,解析变量,插入依赖结果,发送请求,如果有的话,应用响应处理器,保存结果,打印结果,除非此请求是依赖项且用户在调用FHTTP时没有明确指定
请求预处理
您可以在请求文件中使用表达式。表达式的形式为 ${expression}
。下表提供了一个当前支持的概述。
.预处理表达式 |=== | Expression | Description | Usable in
| ${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 %}
。例如
[source]
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
选项指定要使用的配置文件。如果存在默认配置文件,它将始终被加载,其值将被您指定的任何其他配置文件覆盖。
配置文件中的变量可以有不同的形式
.配置文件变量 |=== | 变量 | 描述 | 示例
| String | 将变量设置为这个字符串。 | a| [source]
"var": "string"
| Pass secret | 使用 pass 密码存储解析变量。 | a|[source,json]
{
"pass": "path/in/pass"
}
| Request | 解析请求并使用后处理响应体作为变量。绝对路径或从配置文件位置相对路径。 | a| [source,json]
{
"request": "path/to/request/file"
}
|===
GraphQL
GraphQL 请求作为 json 传输到服务器,因此一个简单的 graphql 请求文件可能看起来像这样
[source]
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,并按如下方式更改
[source]
POST http://graphqlserver
query($var1: String!) {
foo(var1: $var1) {
field1
}
}
{
"var1": "val1"
}
FHTTP 会自动将内容类型设置为 application/json,转义查询字符串,并使用查询和变量构建 json 有效负载。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 的路径。
将会创建文件或覆盖现有文件的內容。
|===
依赖
~15–32MB
~491K SLoC