postwoman/README.md
2023-10-12 18:28:05 +02:00

4.9 KiB

PostWoman

A CLI api tester and request builder, compatible with Postman collection format

Why

Since newer postman requires registration to use most useful features, I decided to build my own tool reusing their format, to be compatible with my coworkers' collections. Also, I'd much rather use a CLI tool than a bundled webpage.

Usage

Add alias pw=postwoman to your .bashrc because I'll be referring to it as pw from now on.

pw expects a postwoman.json collection in your cwd. A different file or path can be specified with the global -c option.

pw supports 2 actions as of now:

  • show which will display on your CLI the collection structure
  • test which will execute all requests concurrently

Both actions support a -v switch to print more stuff (body, headers, descriptions...) and a -p switch to prettify json outputs.

Both actions also work with a filter: just type your regex as argument and only requests with matching urls will be displayed/executed

Examples

All coming examples are run with provided example postwoman.json in their cwd.

Show

$ pw show
─┐ Sample Postman Collection
 ├ * GET https://api.alemi.dev/dump?source=sample-collection
 ├─┐ POST requests
 │ ├ * POST https://api.alemi.dev/dump
 │ ├ * POST https://api.alemi.dev/dump
 │ ╵
 ╵
$ pw show -v
─┐ Sample Postman Collection
 │   A sample collection to demonstrate collections as a set of related requests
 │
 ├ * GET https://api.alemi.dev/dump?source=sample-collection
 │
 ├─┐ POST requests
 │ │
 │ ├ * POST https://api.alemi.dev/dump
 │ │   [ content-type:text/plain ]
 │ │   Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium...
 │ │
 │ ├ * POST https://api.alemi.dev/dump
 │ │   [ content-type:application/json ]
 │ │   {"length":100,"text":"Lorem ipsum"}
 │ │
 │ ╵
 ╵
$ pw show -v -p
─┐ Sample Postman Collection
 │   A sample collection to demonstrate collections as a set of related requests
 │
 ├ * GET https://api.alemi.dev/dump?source=sample-collection
 │
 ├─┐ POST requests
 │ │
 │ ├ * POST https://api.alemi.dev/dump
 │ │   [
 │ │     content-type:text/plain
 │ │   ]
 │ │   Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium...
 │ │
 │ ├ * POST https://api.alemi.dev/dump
 │ │   [
 │ │     content-type:application/json
 │ │   ]
 │ │   {
 │ │     "length": 100,
 │ │     "text": "Lorem ipsum"
 │ │   }
 │ │
 │ ╵
 ╵

Test

$ pw test
─┐ Sample Postman Collection
 ├ ✓ 200 >> GET https://api.alemi.dev/dump?source=sample-collection
 ├─┐ POST requests
 │ ├ ✓ 200 >> POST https://api.alemi.dev/dump
 │ ├ ✓ 200 >> POST https://api.alemi.dev/dump
 │ ╵
 ╵
$ pw test -v -p
─┐ Sample Postman Collection
 │   A sample collection to demonstrate collections as a set of related requests
 │
 ├ ✓ 200 >> GET https://api.alemi.dev/dump?source=sample-collection
 │   {
 │     "body": "",
 │     "headers": {
 │       "accept": [
 │         "*/*"
 │       ],
 │       "connection": "close",
 │       "user-agent": "postwoman/0.2.0",
 │       "x-forwarded-proto": "https",
 │       "x-real-ip": "xxx.xxx.xxx.xxx",
 │       "x-real-port": xxxxx
 │     },
 │     "method": "GET",
 │     "path": "/dump?source=sample-collection",
 │     "time": 0.2629528,
 │     "version": "HTTP/1.0"
 │   }
 │
 ├─┐ POST requests
 │ │
 │ ├ ✓ 200 >> POST https://api.alemi.dev/dump
 │ │   {
 │ │     "body": "Duis posuere augue vel cursus pharetra. In luctus a ex nec pretium...",
 │ │     "headers": {
 │ │       "accept": [
 │ │         "*/*"
 │ │       ],
 │ │       "connection": "close",
 │ │       "content-length": "69",
 │ │       "content-type": "text/plain",
 │ │       "user-agent": "postwoman/0.2.0",
 │ │       "x-forwarded-proto": "https",
 │ │       "x-real-ip": "xxx.xxx.xxx.xxx",
 │ │       "x-real-port": xxxxx
 │ │     },
 │ │     "method": "POST",
 │ │     "path": "/dump",
 │ │     "time": 0.2708838,
 │ │     "version": "HTTP/1.0"
 │ │   }
 │ │
 │ ├ ✓ 200 >> POST https://api.alemi.dev/dump
 │ │   {
 │ │     "body": "{\"text\":\"Lorem ipsum\", \"length\":100}",
 │ │     "headers": {
 │ │       "accept": [
 │ │         "*/*"
 │ │       ],
 │ │       "connection": "close",
 │ │       "content-length": "36",
 │ │       "content-type": "application/json",
 │ │       "user-agent": "postwoman/0.2.0",
 │ │       "x-forwarded-proto": "https",
 │ │       "x-real-ip": "xxx.xxx.xxx.xxx",
 │ │       "x-real-port": xxxxx
 │ │     },
 │ │     "method": "POST",
 │ │     "path": "/dump",
 │ │     "time": 0.2888672,
 │ │     "version": "HTTP/1.0"
 │ │   }
 │ │
 │ ╵
 ╵