#http-request #requests #response #file #tool #fhttp

fhttp-test-utils

为fhttp工具提供测试工具库

2个稳定版本

2.0.0 2024年4月17日
1.6.1 2023年4月7日

#14 in #response


用于 fhttp

MIT 许可证

150KB
3.5K 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请求
  • 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以及一个textfilepath。您可以通过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时,以下操作将会发生

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