🌐

Rust製のHTTPieのxhを使ってみた

2024/03/02に公開

Rust製のHTTPieのようなHTTPクライアントのxhを使ってみたので紹介します。

https://github.com/ducaale/xh

xhとは

xhはHTTPリクエストを送信するための高速で使いやすいコマンドラインHTTPクライアントです[1]
パフォーマンスの向上に重点を置いており、HTTPieの優れた設計を可能な限り再実装しています[1:1]

インストール

xhは以下のような方法でインストールすることができます[2]

Packaging status

ソースコードから

Cargoを利用してインストールすることができます。

cargo install xh

Linux

Alpine Linuxではapkを利用してインストールすることができます。

apk add xh

Arch Linuxではpacmanを利用してインストールすることができます。

pacman -S xh

DebianやUbuntuではAPTを利用してインストールすることができます。

apt install xh

FreeBSD

FreeBSDではFreshPortsからインストールすることができます。

pkg install xh

macOS

macOSではHomebrewを利用してインストールすることができます。

brew install xh

Windows

WindowsではWinGetを利用してインストールすることができます。

winget add ducaale.xh

その他

インストールスクリプトが提供されているので、これを利用してインストールすることもできます。

Linux & macOS:

curl -sfL https://raw.githubusercontent.com/ducaale/xh/master/install.sh | sh

Windows:

iwr -useb https://raw.githubusercontent.com/ducaale/xh/master/install.ps1 | iex

また、release pageでLinux、macOS、Windows向けのビルド済みバイナリが配布されているので、これを利用することもできます。

https://github.com/ducaale/xh/releases

使い方

GETリクエストを送信してみます。

xh httpbin.org/get

結果はHTTPieと同様に色付けされており、JSONがシンタックスハイライトされる点も同様です。

レスポンスの画像

その他の使い方については下記のドキュメントを参照して下さい。

https://httpie.io/docs/cli/3.2.2

HTTPieとの比較

xhはHTTPieを可能な限り再実装していますが、以下のようなHTTPieにはない特徴が存在したり、逆にxhにはない特徴が存在したりするので、紹介します[3]

長所

Rust製

スクリプト言語であるPythonで実装されているHTTPieとは異なり、xhはRustで実装されているので起動速度が向上しています。
また、Rustで実装されているのでシングルバイナリにすることも可能で、インストールや配布を簡単に行うこともできます。

HTTP/2をサポート

xhはHTTP/2をサポートしています。
HTTPieはこの記事を書いた時点ではHTTP/2をサポートしていません。

https://daniel.haxx.se/docs/curl-vs-httpie.html

https://github.com/httpie/cli/issues/692

xh -h https://example.com

レスポンスの画像

curlのコマンドへの変換機能

--curlオプションを使用することでxhのコマンドをそれと等価なcurlのコマンドに変換することができます。

xh --curl --ssl tls1.3 https://example.com

変換した結果は以下のようになります。

curl --tlsv1.3 --tls-max 1.3 https://example.com/

短所

xhはこの記事を書いた時点ではHTTPieの全ての機能を実装していません。
また、xhはプラグインには対応していません。

その他の違い

TLSバックエンド

xhはデフォルトのTLSバックエンドとしてrustlsを使用します。
rustlsはTLS 1.2以降のみをサポートしているので、デフォルトではxhでTLS 1.1などの古いプロトコルを使用することはできません。

https://github.com/rustls/rustls

xh --offline --ssl=tls1.1 :

以下のような警告が表示されます。

xh: warning: rustls does not support older TLS versions. native-tls will be enabled. Use --native-tls to silence this warning.

TLS 1.1などの古いプロトコルを使用する場合は、コンパイル時にnative-tls機能を有効にしてビルドした上で、実行時に--native-tlsオプションを指定することで、OpenSSLなどのシステムのTLSライブラリをTLSバックエンドとして使用することができます。
この場合に使用できるプロトコルは、そのTLSライブラリに依存します。

xh --offline --ssl=tls1.1 --native-tls :

出力

フォーマットされた出力は常にUTF-8です。

終わりに

Rust製のHTTPieのようなHTTPクライアントのxhを紹介しました。
起動速度が向上していることや、HTTP/2をサポートしているなどHTTPieにはない長所がかなりあると思いました。
また、古いバージョンのTLSをデフォルトではサポートしていない点も個人的には評価できます。
モダンなプロトコルをサポートした手軽に利用できるHTTPクライアントとして使ってみてはどうでしょうか。

脚注
  1. https://github.com/ducaale/xh/tree/v0.21.0?tab=readme-ov-file#xh ↩︎ ↩︎

  2. https://github.com/ducaale/xh/tree/v0.21.0?tab=readme-ov-file#installation ↩︎

  3. https://github.com/ducaale/xh/tree/v0.21.0?tab=readme-ov-file#how-xh-compares-to-httpie ↩︎

GitHubで編集を提案

Discussion