xhの使い方完全ガイド【インストールから応用まで】
開発者の皆さん、日々のAPIテストやデバッグで、HTTPクライアントツールをどのように使い分けていますか?
curlは強力ですが、複雑なリクエストには多くのオプション指定が必要です。コマンドが長くなりがちで、可読性も低くなりがちです。PostmanやInsomniaなどのGUIツールは便利です。しかし、CLIでの素早い確認や、シェルスクリプトへの組み込みには不向きです。
もし、これらのツールの良いところをCLIで手軽に利用できたらどうでしょう?
そんな悩みを解決するのが、今回ご紹介するxhです。xhは、HTTPieの優れた使いやすさを持ちながら、curlに匹敵する高速性を実現します。xhは、開発者のHTTPリクエストとの向き合い方を大きく変えるでしょう。
xhとは
xhは、コマンドラインでHTTPリクエストを送信するための超高速なCLIツールです。Rust言語で開発されており、そのパフォーマンスは特筆すべき点です。
このツールの特徴は、人気のあるHTTPieクライアントと高い互換性を持つことです。HTTPieの直感的で人間が読みやすいリクエスト構文を継承しています。
これにより、curlの複雑なオプション指定から解放され、より簡潔にHTTPリクエストを記述できます。
APIのテスト、Webサービスのデバッグ、簡単なHTTP通信の確認など、様々なシーンで活躍します。 xhは、単なるcurlの代替ではありません。開発者のワークフローを加速する強力なアシスタントとなるでしょう。
インストール方法
xhのインストールは非常に簡単です。主要なOS向けに複数のインストール方法が提供されています。ご自身の環境に合った方法を選んでください。
macOS / Linux の場合
Homebrewを使用するのが最も手軽な方法です。
brew install xh
Homebrewを利用できない場合や、別の方法を好む場合は、インストールスクリプトも利用できます。
curl -sfL https://raw.githubusercontent.com/ducaale/xh/master/install.sh | sh
Windows の場合
Windows環境では、Scoop、Chocolatey、Wingetなどのパッケージマネージャーを利用できます。
Scoopを利用する場合:
scoop install xh
Chocolateyを利用する場合:
choco install xh
Wingetを利用する場合:
winget install ducaale.xh
Powershellスクリプトでのインストールも可能です。
iwr -useb https://raw.githubusercontent.com/ducaale/xh/master/install.ps1 | iex
その他のインストール方法
Rustがインストールされている環境であれば、Cargoを使ってビルドすることも可能です。Rust 1.85以降が必要です。
cargo install xh --locked
詳細なインストール方法やその他のパッケージマネージャーについては、公式のGitHubリポジトリを参照してください。
基本的な使い方
xhの基本的な使い方は非常に直感的です。ここでは、最低限知っておきたいコマンドを5つ紹介します。
1. GETリクエストの送信
最も基本的な使い方は、URLを指定するだけでGETリクエストを送信することです。
xh https://httpbin.org/get
このコマンドは、httpbin.org/getに対してGETリクエストを送信します。
レスポンスヘッダーやボディが、色付きで整形されて表示されます。
2. POSTリクエストとJSONボディの送信
xhは、データ項目をキーと値のペアで指定するだけで、自動的にJSONボディとして送信します。これはデフォルトの挙動です。
xh https://httpbin.org/post name=Alice age=30
上記コマンドは、https://httpbin.org/postに対し、{"name": "Alice", "age": 30}というJSONボディを含むPOSTリクエストを送信します。Content-Type: application/jsonヘッダーも自動的に付与されます。
3. HTTPヘッダーの追加
リクエストにHTTPヘッダーを追加するには、Header-Name:Value形式で指定します。
xh https://httpbin.org/headers Authorization:'Bearer YOUR_TOKEN' Custom-Header:Hello
この例では、AuthorizationヘッダーとCustom-Headerがリクエストに追加されます。
値にスペースが含まれる場合は、クォーテーションで囲む必要があります。
4. クエリパラメータの追加
URLにクエリパラメータを追加するには、param==valueの形式で指定します。
xh https://httpbin.org/get search==keyword page==1
このコマンドは、https://httpbin.org/get?search=keyword&page=1へのGETリクエストを送信します。==を使用することで、自動的にURLエンコードされます。
5. フォームデータ(application/x-www-form-urlencoded)の送信
JSONではなく、通常のフォームデータとしてデータを送信したい場合は、--form(または-f)オプションを使用します。
xh --form https://httpbin.org/post username=bob password=secret
このコマンドは、username=bob&password=secretというボディを持つPOSTリクエストを送信します。Content-Type: application/x-www-form-urlencodedヘッダーが自動的に付与されます。
便利な使い方・応用例 3選
xhは基本的な機能だけでなく、開発者のワークフローを効率化する便利な機能が多数あります。ここでは、特におすすめの応用例を3つ紹介します。
1. curlコマンドへの変換と共有 (--curlオプション)
xhで試行錯誤して作成したリクエストを、標準的なcurlコマンドに変換できます。これは、他の開発者との共有や、既存のシェルスクリプトへの組み込みに非常に便利です。
例えば、以下のようにPOSTリクエストをxhで記述します。
xh --curl POST https://api.example.com/data user=john pass=doe
このコマンドを実行すると、実際にリクエストを送信することなく、対応するcurlコマンドが出力されます。
# 出力例:
curl 'https://api.example.com/data' \
--json '{"pass":"doe","user":"john"}' \
--request POST
複雑なリクエストでも、xhのシンプルな構文で作成し、必要に応じてcurl形式で共有できるため、非常に強力な機能です。
2. リクエスト内容のオフライン検証 (--offlineオプション)
リクエストを実際に送信する前に、構築されたHTTPリクエスト全体を確認したい場合があります。--offlineオプションを使用すると、リクエストをネットワークに送らず、その内容を表示できます。これは、デバッグや、意図したリクエストが正しく構築されているかを確認する際に役立ちます。
xh --offline POST https://example.com/upload @./my_file.txt Content-Type:text/plain
このコマンドは、my_file.txtの内容をボディとして、text/plainヘッダーを持つPOSTリクエストを構築します。--offlineのおかげで、実際にファイルをアップロードすることなく、リクエストヘッダーとボディの全てを確認できます。
例えば、以下のような出力が得られます。
# 出力例:
POST /upload HTTP/1.1
Content-Type: text/plain
Host: example.com
User-Agent: xh/0.20.0
これはテストファイルの内容です。
複数行にわたるテキストを送信します。
送信前にリクエストの全貌を把握できるため、予期せぬ挙動を防ぐのに役立ちます。
3. レスポンスの個別検査とスクリプト連携
xhは、レスポンスの特定の部分のみを表示するオプションを提供します。これにより、シェルスクリプト内でxhの出力を加工しやすくなり、自動化に役立ちます。
ヘッダーのみ表示 (
--headersまたは-h):xh --headers https://httpbin.org/getこのコマンドは、レスポンスボディを表示せず、ヘッダーのみを出力します。 例えば、特定のヘッダーの値を確認する際に便利です。
xh -h https://httpbin.org/get | grep 'Content-Type'ボディのみ表示 (
--bodyまたは-b):xh --body https://httpbin.org/getレスポンスヘッダーを省略し、ボディのみを出力します。JSONレスポンスを
jqなどのツールで処理する際に特に有効です。ステータスコードのみ表示 (
--quietまたは-q):xh --quiet https://httpbin.org/status/200このコマンドは、レスポンスのステータスコードのみを出力します。 例えば、APIのヘルスチェックをシェルスクリプトで行う場合に役立ちます。
STATUS=$(xh -q https://api.example.com/health) if [ "$STATUS" -eq 200 ]; then echo "API is healthy." else echo "API returned status: $STATUS" fi
これらのオプションを組み合わせることで、xhは単なるHTTPクライアント以上の、強力なスクリプトツールとなります。
他ツールとの組み合わせ
xhは単体でも強力ですが、他のCLIツールと組み合わせることで、その真価を発揮します。ここでは、特に相性の良いツールとその組み合わせ方を紹介します。
1. jqとの連携(JSONレスポンスの処理)
xhのデフォルト出力は整形されたJSONですが、特定のフィールドを抽出したり、フィルタリングしたりしたい場合はjqが最適です。
例えば、ユーザー一覧を取得し、特定の条件に合致するユーザー名のみを抽出する場合を考えます。
xh https://jsonplaceholder.typicode.com/users | jq '.[] | select(.id < 5) | .name'
このコマンドは、jsonplaceholder.typicode.com/usersからJSONデータを取得します。
その後、jqを使ってIDが5未満のユーザーを抽出し、そのnameフィールドのみを出力します。xh --bodyと組み合わせることで、jqが処理しやすい純粋なJSONボディを渡すこともできます。
xh --body https://jsonplaceholder.typicode.com/users | jq '.[0].email'
2. grepとの連携(テキストベースの検索)
レスポンスヘッダーやボディから特定のキーワードを検索したい場合、grepが役立ちます。
例えば、レスポンスヘッダーにSet-Cookieヘッダーが含まれているか確認したい場合です。
xh --headers https://example.com | grep 'Set-Cookie'
このコマンドは、example.comへのリクエストのレスポンスヘッダーのみを取得します。
そして、その中からSet-Cookieという文字列を含む行を抽出して表示します。
3. シェルスクリプトとの連携(自動化)
xhは、CI/CDパイプラインでのAPIテストや、定期的なヘルスチェックなどの自動化タスクに非常に適しています。--quietオプションは特に有用です。
例えば、複数のエンドポイントのヘルスチェックを行うシェルスクリプトを作成できます。
#!/bin/bash
ENDPOINTS=(
"https://api.example.com/health"
"https://api.another.com/status"
)
for URL in "${ENDPOINTS[@]}"; do
echo "Checking $URL..."
STATUS=$(xh --quiet "$URL")
if [ "$STATUS" -eq 200 ]; then
echo " -> OK (Status: $STATUS)"
else
echo " -> ERROR (Status: $STATUS)"
fi
done
このようなスクリプトは、定期実行ツール(cronなど)と組み合わせることで、システムの健全性を継続的に監視できます。
よくある設定・カスタマイズ
xh自体には、複雑な設定ファイルによるカスタマイズ機能は多くありません。しかし、シェルのエイリアスを活用することで、xhをより便利に、自分好みにカスタマイズできます。
シェルのエイリアス設定
頻繁にアクセスするAPIのベースURLや、よく使うオプションをエイリアスとして登録しておくと、コマンド入力の手間を省けます。~/.bashrcや~/.zshrcなどのシェル設定ファイルに追記します。
例1: 特定のAPIのベースURLを短縮する
# ~/.zshrc または ~/.bashrc に追記
alias myapi='xh https://api.mycompany.com/v1'
設定を反映した後、新しいターミナルを開くか、source ~/.zshrc(またはsource ~/.bashrc)を実行します。
これで、以下のようにコマンドを実行できます。
myapi /users
# これは 'xh https://api.mycompany.com/v1/users' と同じ意味になります
例2: 特定のヘッダーを常に含める
認証トークンなど、常に特定のヘッダーを送信したい場合にエイリアスが役立ちます。
# ~/.zshrc または ~/.bashrc に追記
alias auth_api='xh Authorization:"Bearer YOUR_FIXED_TOKEN"'
これで、認証が必要なAPIリクエストを簡潔に記述できます。
auth_api https://api.example.com/protected_resource
例3: デバッグ用のオプションをまとめる
リクエストとレスポンスの詳細を常に確認したい場合、--verbose(詳細表示)や--offline(オフライン検証)を組み合わせたエイリアスを作成できます。
# ~/.zshrc または ~/.bashrc に追記
alias xhdebug='xh --verbose --offline'
これにより、デバッグ時に複雑なオプションを毎回入力する手間が省けます。
xhdebug POST https://example.com/data param=value
これらのエイリアスを工夫することで、xhをよりパーソナルなツールとして活用できます。
今日からできる実行プラン
xhの導入は非常に簡単です。以下の3ステップで、今日からxhをあなたの開発ワークフローに取り入れてみましょう。
ステップ1: xhをインストールする
まずは、ご自身のOSに合った方法でxhをインストールしてください。macOSやLinuxユーザーであればHomebrewが最も簡単です。WindowsユーザーであればScoopやChocolateyがおすすめです。
# macOS/Linuxの場合
brew install xh
# Windowsの場合
scoop install xh
インストール後、ターミナルでxh --versionと入力し、バージョン情報が表示されれば成功です。
ステップ2: 基本的なリクエストを試す
インストールが完了したら、公開されているテストAPI(例: httpbin.orgやjsonplaceholder.typicode.com)を使って、基本的なGETリクエストやPOSTリクエストを送信してみましょう。
# GETリクエストを試す
xh https://httpbin.org/get
# JSONボディを含むPOSTリクエストを試す
xh https://httpbin.org/post user=test password=123
これらのコマンドを実行し、xhが色付きで整形されたレスポンスを返してくれることを確認してください。
ステップ3: 既存の作業をxhに置き換える
普段curlやGUIツールで実行している簡単なHTTPリクエストを、xhに置き換えてみてください。例えば、社内APIのヘルスチェックや、開発中のAPIエンドポイントへのテストリクエストなどです。
例えば、curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://localhost:8080/apiのようなコマンドを、
xh POST http://localhost:8080/api key=value
のように、xhのより簡潔な構文で記述してみましょう。
この置き換えを通じて、xhの直感的な操作性と高速さを実感できるはずです。慣れてきたら、--curlや--offlineなどの応用機能も試してみてください。
xhは、あなたのAPI開発やデバッグの作業を、より快適で効率的なものに変える可能性を秘めています。ぜひ今日から活用を始めてみてください。
参考文献
- ducaale/xh - GitHub
- HTTPie - CLI for HTTP & APIs
- curl - Command line tool and library for transferring data with URLs
- jq - Command-line JSON processor