ksauzz weblog

technical note....

Cowboy clientを使う

ErlangのWebフレームワークCowboyにはcowboy_clientというクライアントモジュールが含まれています。 今回はこのcowboy_clientの基本的な使い方を紹介します。

利用方法

cowboy_clientは以下の流れで利用します。

  1. clientレコードの生成 (init/1)
  2. 接続の確立 (connect/4)
  3. リクエスト送信 (request/3, request/4, request/5)
  4. レスポンスヘッダーの取得 (response/1)
  5. レスポンスの取得 (response_body/1)

これを実際のコードで表現すると、こんな感じです。

1
2
3
4
5
{ok, Client1} = cowboy_client:init([]),
{ok, Client2} = cowboy_client:connect(cowboy_tcp_transport, "localhost", 8080, Client1),
{ok, Client3} = cowboy_client:request(<<"GET">>, <<"/contents.html">>, [], Client2),
{ok, Status, Headers, Client4} = cowboy_client:response(Client3),
{ok, Body, Client5} = cowboy_client:response_body(Client4),

以降でinit/1以外の各行を個別に確認してゆきます。

接続の確立 (connect/4)

Transport, Host, Portを指定してコネクションを生成します。 恐らくSSL通信の場合はcowboy_ssl_transportを利用すると思われます。

1
{ok, Client2} = cowboy_client:connect(cowboy_tcp_transport, "localhost", 8080, Client1),

HTTPリクエスト (request/4)

request関数は3種類用意されています。 リクエストヘッダー、リクエストボディ設定の有無でこれらを使い分けます。

  • request(Method, Url, Client)
  • request(Method, Url, Headers, Client)
  • request(Method, Url, Headers, Data, Client)
1
{ok, Client3} = cowboy_client:request(<<"GET">>, <<"/contents.html">>, [], Client2),

なお、Headerは以下のようなリストで指定します。

1
[{<<"connection">>, <<"close">>}]

HTTPレスポンス (response/1, response_body/1)

ヘッダー、ステータスコードの取得(response/1)とボディの取得(response_body/1)は、個別に行う必要があります。 必要に応じてコールします。

1
2
{ok, Status, Headers, Client4} = cowboy_client:response(Client3),
{ok, Body, _Client5} = cowboy_client:response_body(Client4),

以上がリクエスト送信からレスポンス受信までの流れです。

その他

POSTリクエスト

POSTする場合は、request/4を使用してPOSTメソッドの指定、リクエストボディを指定します。

1
2
3
4
5
Method = <<"POST">>,
Url = <<"/post_content">>,
Headers = [],
Data = <<"key=value">>
{ok, Client3} = cowboy_client:request(Method, Url, Headrs, Data, Client2),

raw_request/2

cowboy_clientでは生のHTTPリクエストを送信するraw_request/2関数が用意されています。 テスト目的でイレギュラーなHTTPリクエストを送信するときに便利です。

1
2
3
4
5
{ok, Client1} = cowboy_client:init([]),
{ok, Client2} = cowboy_client:connect(cowboy_tcp_transport, "localhost", 8080, Client1),
{ok, Client3} = cowboy_client:raw_request(<<"GET /contents.html HTTP/1.1\r\nHost: localhost\r\n\r\n">>, Client2),
{ok, Status, Headers, Client4} = cowboy_client:response(Client3),
{ok, Body, _Client5} = cowboy_client:response_body(Client4),

以上、大雑把なcowboy_clientの紹介でした。

そもそもcowboyのテストを書くために書かれたモジュールのようなので、 基本的にはHTTP周りのテストを書く際に利用すると良いかと思います。

Comments