🏃

Taskfile + curlをHTTPクライアントツールとして使う

に公開

この記事において、「HTTPクライアントツール」は「HTTPリクエスト情報を設定しておくことで、指定したHTTPリクエストを実行することができるツール」のことを指します。
HTTPクライアントツールには、有名なところだと以下のものがあるようです。

おそらく上記以外にもたくさんのHTTPクライアントツールがあると思われます。

モチベーション

今までInsomniaを使っていて、そこまで不便を感じることなく開発をしてきました。
しかし、ふと「もっと自分に合ったHTTPクライアントツールがあるのでは?」と思い、他の方法を考え始めました。
特に最近「HTTPリクエスト情報をテキストファイルに書いてgitにコミットしたい」という気持ちが出てきたことがきっかけとして大きいです。

  • 必須要件
    • リクエスト情報をテキストファイルに保存できる: gitで管理したい
    • 実行時にレスポンスだけでなく、リクエスト情報( URL, header, body )も見れる: HTTPリクエストも確認したいことは多々ある
    • リクエストのURL, header, bodyで変数が使える: 共通化したい
    • CLIから実行できる
  • 歓迎要件
    • シンプルな構成: HTTPクライアントツール周りでハマった時に調査しやすいと嬉しいし、長く使い続けられそう
    • リクエスト情報を書いたテキストファイルをSingle Source of Truthとする: リクエスト情報を都度import/exportするのではなく、テキストファイルを書き換えたらそのまま反映されて欲しい
    • CLIだけでなく、GUIからも実行できる: やっぱりGUIからも実行できると嬉しいよね
    • リクエストを投げる前後に任意の処理ができる: 現実問題そういうことがしたくなる時ってけっこうあるよね

そんなことを考えた結果、 タスクランナー + curlという構成を思い付きました。

Taskfile

正式には "Task" という名前のツールなのですが、非常にややこしいのでツール自体も "Taskfile" と呼びます。
Taskfileはgolang製のCLIツールで、タスクランナー/ビルドツールです。

Task is a task runner / build tool that aims to be simpler and easier to use than, for example, GNU Make.
https://taskfile.dev/

テキストファイルで設定が書けて、curlを実行できるので、構成としては非常にシンプルで良いのではないかと思いました。

Taskfileはタスクランナーの中で比較的人気のものに見えたので、とりあえず最初に試しました。
Taskfile以外にもタスクランナーは色々あると思うので、要件を満たしていれば当然他のタスクランナーでも良いと思います。
まだ試していないのですが、 just も良いかもしれません。

Taskfile.yaml

Taskfile.yaml を書きます。( yml ではなく yaml 派 )

簡単なサンプルとしては以下になります。
yamlで記述するため、構造が分かりやすくて好みです。

version: '3'

vars:
  BASE_URL: http://localhost:3000
  CONTENT_TYPE: "Content-Type: application/json"

tasks:
  index:
    cmds:
      - curl -v -H "{{.CONTENT_TYPE}}" {{.BASE_URL}}/

  create:
    cmds:
      - curl -v -H "{{.CONTENT_TYPE}}" -d '{{.JSON}}' {{.BASE_URL}}/
    vars:
      JSON: |
        {
          "message": "hello"
        }

cmds しかないタスクは short task syntax を使っても良いかもしれません。

HTTPクライアントツールの観点で気になった他の点は以下です。

tasks:
  my-address:
    cmds:
      - |
        address=$(curl -s https://checkip.amazonaws.com)
        echo "My IP address is ${address}"

  my-address2:
    cmds:
      - ./my-address.sh

所感

要件を一通り満たしていて良さそうだと思いました(小並感

  • ただのyamlファイルなので当然gitで管理できる
  • curlを実行しているだけなのでシンプル、柔軟、知見が多い
  • 最悪シェルスクリプトを書けばどうにかなる安心感

当初、VSCode REST Clientを触って「これはどうやればいいんだ?あれは出来ないのか?」と右往左往して苦労しました。
高機能なツールの使い方を頑張って学習するよりも、汎用的な既存のプログラムを組み合わせた方が、多少 ダサい 冗長に見えても便利だということを再認識しました。
各プログラムが一つのことをうまくやるようにせよ。

Discussion