通常はルーティングブロックの戻り値にセットした文字列がbodyにセットされます。
任意の評価フローでbodyをセットしたい場合はどうすればいいでしょうか。
Sinatraには任意の評価フローでbodyをセットできる、bodyヘルパーが用意されています。
1 | get '/foo' do |
Status Codeを設定するstatusヘルパー、headerを設定するheadersヘルパーも用意されています。
1 | get '/foo' do |
引数の伴わないbody, status, headersは現在の値を確認するために使えます。
Streamingヘルパー
streamヘルパーを使うとおもしろいことができます。
レスポンスボディの部分を生成している段階でデータを送信することができます。
この仕組みを使ってストリーミングAPIを実装することもできます。
1 | get '/' do |
以下は、ストリーミングAPIのサンプルです。
1 | # app.rb |
ストリーミングはThinやRainbowsなどのイベント型サーバーでないと動かないので注意が必要です。
サーバーを起動させてみます。
1 | $ gem insatall thin |
別のターミナルを開いて、以下を実行します。
1 | $ curl http://localhost:4567/subscribe |
何もレスポンスがありませんが、接続が維持された状態となります。
別のタブを開いて以下の実行してみましょう。
1 | $ curl http://localhost:4567/message -X POST -d "message=hello" |
すると、subscribeのほうにhelloと表示されて接続が切れます。
これは、/messageのout.closeを実行しているからです。
試しに、out.closeをコメントアウトしてサーバーを起動すると接続維持されたままになります。