dot-http
dot-http is a text-based scriptable HTTP client. It is a simple language that resembles the actual HTTP protocol but with just a smidgen of magic to make it more practical for someone who builds and tests APIs.
Installation
Script
Enter the following in a command prompt:
curl -LSfs https://japaric.github.io/trust/install.sh | sh -s -- --git bayne/dot-http
Binary releases
The easiest way for most users is simply to download the prebuilt binaries. You can find binaries for various platforms on the release page.
Cargo
First, install cargo. Then:
$ cargo install dot-http
You will need to use the stable release for this to work; if in doubt run
rustup run stable cargo install dot-http
Usage
See dot-http --help
for usage.
Vim
See this plugin to use dot-http within vim.
The request
The request format is intended to resemble HTTP as close as possible. HTTP was initially designed to be human-readable and simple, so why not use that?
simple.http
GET http://httpbin.org
Accept: */*
Executing that script just prints the response to stdout:
$ dot-http 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"
}
Variables
Use variables to build the scripts dynamically, either pulling data from your environment file or from a previous request's response handler.
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"
}
}
Note that the variables are replaced by their values
$ dot-http 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"
}
Environment file
Use an environment file to control what initial values variables have
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}}
Specifying different environments when invoking the command results in different values for the variables in the script
$ dot-http -e dev env_demo.http
GET http://localhost
X-Auth-Token: SuperSecretToken
$ dot-http -e prod env_demo.htp
GET http://example.com
X-Auth-Token: ProductionToken
Response handler
Use previous requests to populate some of the data in future requests
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}}
}
Data from a previous request
$ dot-http 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"
}
Can populate data in a future request
$ dot-http -l 16 test.http
PUT http://httpbin.org/put
HTTP/1.1 200 OK
access-control-allow-credentials: true
access-control-allow-origin: *
content-type: application/json
date: Sat, 18 Jan 2020 21:02:28 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: 336
connection: keep-alive
{
"args": {},
"data": "{\r\n \"id\": 237\r\n}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "19",
"Host": "httpbin.org",
"X-Auth-Token": "sometoken"
},
"json": {
"id": 237
},
"url": "https://httpbin.org/put"
}
Contributing
Contributions and suggestions are very welcome!
Please create an issue before submitting a PR, PRs will only be accepted if they reference an existing issue. If you have a suggested change please create an issue first so that we can discuss it.