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 日

#70HTTP 客户端

每月 30 次下载

MIT 许可证

165KB
4K SLoC

:imagesdir: doc ifdef::env-github[] :imagesdir: https://raw.githubusercontent.com/Leopard2A5/fhttp/master/doc endif::[]

:toc

link

这是什么?

基于文件的命令行 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-essentialpkg-configlibssl-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 以及一个 textfilepath。您可以通过 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 时,以下操作将发生

  1. 查找配置文件,加载默认配置文件,加载请求的配置文件(如果有)
  2. 对于每个给定的请求,查找引用的请求,找到最佳执行顺序
  3. 对于每个请求,解析变量,插入依赖结果,发送请求,如果有的话,应用响应处理器,保存结果,打印结果,除非此请求是依赖项,并且在调用 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