michimani.net

CLI で http リクエストするなら HTTPie が便利

2020-03-31

実装した API をコマンドラインから試す際に cURL を使用している方は多いと思います。 ただ、オプションが複雑だったりレスポンスが見づらかったり、不便さを感じている方もいると思います。まあ、僕なんですが。今回紹介する HTTPie は、直感的でわかりやすいコマンドでコマンドラインから http リクエストを送信できるツールです。

目次

HTTPie とは

cURL は HTTP 以外にも FTP や TELNET, LDAP など、様々なプロトコルに対応しているツールです。一方、今回紹介する HTTPie (読み方は エイチティーティーパイ) は、 コマンドラインでの HTTP および HTTPS 通信に特化した クライアントです。

最近ではサーバレスアーキテクチャで API を実装して、ちょっと動きを確認する みたいなことも増えてきていると思います。 HTTPie を使用することで、 API の動作確認が非常に直感的なコマンドで実施することができ、またレスポンスについても確認しやすい形で取得することができます。

ソースコードは GitHub で公開されています。

実際に使ってみる

では、実際に HTTPie を使ってみます。

インストール

HTTPie は macOS、 Linux、Windows およびその他の OS で使用することができます。

macOS の場合

macOS では Homebrew でインストール可能で、この方法が推奨されています。

$ brew install httpie

Linux の場合

Linux の場合は、各 OS ごとのパッケージマネージャを使用してインストールすることができます。例えば、 Debian または Ubuntu の場合は下記のコマンドでインストールできます。

$ apt-get install httpie

Windows およびその他の OS の場合

Windows およびその他の OS (macOS、Linux を含む) でのインストール、または安定していない最新版をインストールする場合は、 pip でインストールします。この際、 Python のバージョンは 3.6 以上である必要があります。

$ pip install --upgrade pip setuptools
$ pip install --upgrade httpie

安定していない最新版をインストールする場合は、下記のようにします。

$ pip install --upgrade https://github.com/jakubroztocil/httpie/archive/master.tar.gz

インストール方法の詳細については下記の公式ドキュメントを参照してください。


それぞれの方法でインストールができたら、バージョンを確認しておきます。

$ http --version
1.0.3

HTTPie では http コマンドで諸々の操作を行います。

では、次からは実際に http コマンド使用方法やレスポンスについて見ていきます。

なお、このブログ内ではアクセス先に https://httpbin.org のエンドポイントを利用します。これは HTTPie 公式のサンドボックスのようなものです。 HTTPie ではブラウザ上で動作を確認できるツールも公開しているので、インストールせずに試したい方は下記のツールを利用してみてください。

GET リクエスト

ではまずは GET でのリクエストを試してみます。

$ http https://httpbin.org/get

これだけです。簡単ですね。
ちなみに、実行結果は下記のようになります。特にオプションを付けたりしなくても、カラーリング、レスポンスが JSON の場合は整形もされます。

HTTPie coloring output

GET 以外のリクエスト

GET 以外のリクエストをする場合は、 http コマンドに続いて使用したいメソッドを指定します。例えば POST であれば下記のようになります。

$ http POST https://httpbin.org/post

同じ要領で、 PUT , PATCH , DELETE を指定することで、それぞれのメソッドでのリクエストを行うことができます。もちろん GET を指定することも可能です。

パラメータ付きリクエスト

続いてはパラメータを渡す場合のコマンドです。

クエリパラメータ

クエリパラメータとしてパラメータを渡す場合は、下記のようにします。

$ http https://httpbin.org/get qp1==1 qp2==2

パラメータ名と値を == で繋いで記述します。上記のコマンドは下記のコマンドと同じ意味になります。

$ http 'https://httpbin.org/get?qp1=1&qp2=2'

データフィールド

POST 時など body にパラメータを含めたい場合は、下記のようにします。

$ http POST https://httpbin.org/post data1=value1 data2=value2

フィールド名と値を = で繋いで記述します。この場合、下記のようなデータを送信したことになります。

{
  "data1": "value1",
  "data2": "value2"
}

単純な文字列であれば上記の方法で問題ないですが、 文字列 (String) ではなく 数値 (Number) として渡したい場合や 真偽値 (Boolean) または、 オブジェクト (Object)配列 (Array) を値として指定したい画面があると思います。例えば、下記のようなデータを送信したい場合を考えます。

{
  "data1": "value1",
  "data2": "value2",
  "data3": 3,
  "data4": {
    "data4_1": "value4_1",
    "data4_2": 42
  },
  "data5": [
    "data5_1",
    "data5_2",
    "data5_3"
  ]
}

この場合は、 = の代わりに := を使用して次のような形で実行します。 (適宜改行しています)

$ http POST https://httpbin.org/post \
data1=value1 \
data2=value2 \
data3:=3 \
data4:='{"data4_1": "value4_1","data4_2": 42}' \
data5:='["data5_1","data5_2","data5_3"]'

また、すでに上記のようなデータを JSON ファイル post_data.json として保存してる場合、そのファイルを指定することも可能です。

$ http POST https://httpbin.org/post @post_data.json

データ全体ではなく、フィールド名を指定して、値にファイルを指定することも可能です。

$ http POST https://httpbin.org/post data1:=@post_data_1.json

ヘッダ情報の付与

リクエストヘッダの付与は下記のような形で実行します。

$ http https://httpbin.org/get any-header:value-for-header

パラメータの指定と同じような形ですが、ヘッダ情報を指定する場合は : でヘッダ名と値を繋いで記述します。もちろん、パラメータの指定と一緒に使用することも可能です。

$ http POST https://httpbin.org/post data1=value1 data2=value2 any-header:value-for-header

AWS の API Gateway で API キーを使用した API を実行する場合は X-Api-Key ヘッダで API キーを指定するので、下記のようになります。

$ http https://httpbin.org/get x-api-key:api-key-value

https:// の省略

これまでアクセス先の URL は https:// を付けていましたが、下記のようにドメイン名からの指定も可能です。

$ http httpbin.org/get

プロトコル部分の省略は cURL でも可能ですが、 HTTPie では localhost へのアクセスを下記のように短縮することができます。

$ http :

例えば localhost:1313/get にアクセスする場合は次のようになります。

$ http :1313/get

出力オプション

デフォルトではレスポンスヘッダとレスポンスボディが出力されますが、下記のオプションを指定することで出力内容を変更することができます。

オプション 出力内容
--headers, -h レスポンスヘッダのみ
--body , b レスポンスボディのみ
--verbose, -v リクエストとレスポンスの情報両方
--print , -p 指定した情報のみ (下記参照)

-v を指定することで、レスポンスだけでなくリクエストの情報も合わせて出力されるので、 API のデバッグ時には役に立ちそうです。

HTTPie output option

--print または -p オプションを指定する場合は、合わせて下記の値を指定することで、必要な情報を明示的に指定して出力することができます。

指定する値 出力内容
H リクエストヘッダ
B リクエストボディ
h レスポンスヘッダ
b レスポンスボディ

例えば、リクエストヘッダとレスポンスヘッダのみ出力したい場合は、下記のようにします。

$ http -p Hh https://httpbin.org/get

その他のオプション

上記の内容で基本的な HTTP アクセスは可能かと思いますが、他にも HTTPie には下記のような様々なオプションが用意されています。

詳細については公式ドキュメント及び --help オプションの出力を参照してください。

まとめ

直感的で使いやすい http クライアント HTTPie の紹介でした。

cURL と比べて、メソッドやパラメータの指定がシンプルでわかりやすく、レスポンスの出力もカラーリング・整形されていて見やすいという、コマンドラインでの http 通信がかなりやりやすくなるツールです。特に API のテスト時には、 localhost 用の短縮コマンドなどもあり、非常に使いやすいツールです。

単純な http 通信試したいけど cURL のオプションとかよくわからん という方は使ってみてはどうでしょうか。


comments powered by Disqus