#scriptable #api-testing #http-api #api #javascript #http-request #http

bin+lib dothttp

dothttp 是一个基于文本的脚本化HTTP客户端。它是对 dot-http 的分支。它是一种类似于实际HTTP协议的简单语言,但增加了使它在构建和测试API时更实用的功能。

7个版本 (破坏性更新)

0.9.0 2024年2月26日
0.8.1 2024年2月26日
0.7.0 2023年11月29日
0.6.0 2023年11月9日
0.4.1 2023年10月28日

#103 in HTTP客户端

Apache-2.0

130KB
3.5K SLoC

这是现有工具 dot-http 的分支

dothttp

codecov Crates.io build nix

dothttp 是一个基于文本的脚本化HTTP客户端。它是一种类似于实际HTTP协议的简单语言,但增加了一些魔法使其在构建和测试API时更实用。

dot-http 的不同之处在于 dothttp 旨在与 IntelliJ Http Client 完全兼容。

当前功能支持列表

  • 环境文件
  • 变量
  • 特殊变量: $random$timestamp$isoTimestamp
  • 响应处理器
  • 响应单元测试
  • 从文件中发送请求体
  • 请求前脚本
  • 请求前变量块
  • Cookie
  • gRPC请求
  • WebSocket请求
  • GraphQL

需要考虑的事项

  • ratatui 的终端UI
  • 压力测试支持

安装

二进制发布

对于大多数用户来说,最简单的方法是下载预构建的二进制文件。您可以在 发布 页面上找到各种平台上的二进制文件。

Cargo

首先,安装 cargo。然后

$ cargo install dothttp

您需要使用稳定版本才能使此功能正常工作;如有疑问,请运行

rustup run stable cargo install dothttp

Nix

您还可以使用 nix(与flakes一起)来运行和使用 dothttp

$ nix run github:alisa101rs/dothttp

用法

查看 dothttp --help 了解用法。

请求

请求格式旨在尽可能接近HTTP。HTTP最初设计为人类可读和简单,为什么不使用它呢?

simple.http

GET http://httpbin.org
Accept: */*

执行该脚本将直接将响应打印到标准输出

$ dothttp simple.http
GET http://httpbin.org/get

HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-type: application/json
date: Sat, 18 Jan 2020 20:48:50 GMT
referrer-policy: no-referrer-when-downgrade
server: nginx
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
content-length: 170
connection: keep-alive

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org"
  },
  "url": "https://httpbin.org/get"
}

变量

使用变量动态构建脚本,可以从环境文件或之前请求的响应处理器中获取数据。

simple_with_variables.http

POST http://httpbin.org/post
Accept: */*
X-Auth-Token: {{token}}

{
    "id": {{env_id}}
}

http-client.env.json

{
    "dev": {
        "env_id": 42,
        "token": "SuperSecretToken"
    }
}

注意,变量将被它们的值替换

$ dothttp simple_with_variables.http
POST http://httpbin.org/post

HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-type: application/json
date: Sat, 18 Jan 2020 20:55:24 GMT
referrer-policy: no-referrer-when-downgrade
server: nginx
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
content-length: 342
connection: keep-alive

{
  "args": {},
  "data": "{\r\n    \"id\": 42\r\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "18",
    "Host": "httpbin.org",
    "X-Auth-Token": "SuperSecretToken"
  },
  "json": {
    "id": 42
  },
  "url": "https://httpbin.org/post"
}

环境文件

使用环境文件来控制变量的初始值

http-client.env.json

{
    "dev": {
        "host": localhost,
        "token": "SuperSecretToken"
    },
    "prod": {
        "host": example.com,
        "token": "ProductionToken"
    }
}

env_demo.http

GET http://{{host}}
X-Auth-Token: {{token}}

在调用命令时指定不同的环境会导致脚本中变量的值不同

$ dothttp -e dev env_demo.http
GET https://127.0.0.1
X-Auth-Token: SuperSecretToken

$ dothttp -e prod env_demo.htp
GET http://example.com
X-Auth-Token: ProductionToken

响应处理器

使用以前的请求来填充未来请求中的一些数据

response_handler.http

POST http://httpbin.org/post
Content-Type: application/json

{
    "token": "sometoken",
    "id": 237
}

> {%
   client.global.set('auth_token', response.body.json.token);
   client.global.set('some_id', response.body.json.id);
%}

###

PUT http://httpbin.org/put
X-Auth-Token: {{auth_token}}

{
    "id": {{some_id}}
}

来自以前请求的数据

$ dothttp test.http
POST http://httpbin.org/post

HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-type: application/json
date: Sat, 18 Jan 2020 21:01:59 GMT
referrer-policy: no-referrer-when-downgrade
server: nginx
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
content-length: 404
connection: keep-alive

{
  "args": {},
  "data": "{\r\n    \"token\": \"sometoken\",\r\n    \"id\": 237\r\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "46",
    "Content-Type": "application/json",
    "Host": "httpbin.org"
  },
  "json": {
    "id": 237,
    "token": "sometoken"
  },
  "url": "https://httpbin.org/post"
}

贡献

欢迎贡献和建议!

在提交PR之前,请先创建一个issue,只有引用了现有issue的PR才会被接受。如果您有建议的更改,请先创建一个issue,以便我们可以讨论。

许可协议

Apache License 2.0

依赖项

~32–48MB
~700K SLoC