RackReferenceJa
RubyのためのWebサーバインターフェイス、Rackの日本語リファレンスです。
rack 1.3.0 (Rackプロトコル 1.1) 対応。
Rackがどういうものなのかについては Route 477 - 5分でわかるRack を参照してください。
概要
Hello Rack
インストール:
$ gem install rack
hello.rb:
require 'rubygems' require 'rack'
class HelloApp def call(env) [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]] end end
hello.ru:
require './hello.rb' run HelloApp.new
サーバ起動:
$ rackup hello.ru
ブラウザで http://localhost:9292/ にアクセスしてみよう。「Hello, Rack」と表示されたはず。
Rackの規格書
envの扱いかたなどの取り決めは以下に書かれている。
Rackミドルウェア
Rackのレイヤでいろいろな機能を追加することができる。
- CodeRack 2009年に行われたRackのミドルウェアコンテストの跡地。ネタ系から実用系までたくさんのミドルウェアが掲載されている。
Rackのソース
クラスごとにファイル分けされている。
Rack::Request
req = Rack::Request.new(env) とか。
データ
req.params() | GETやPOSTで送られてきたデータをHashとして返す。 |
req.[](key) | params[key]と同じ。 |
req.[]=(key, value) | params[key] = value と同じ。 |
req.values_at(k1, k2...) | 指定したキーに対応するデータを配列で返す。 |
req.cookies() | クッキーを表すHashを返す。 |
req.query_string() | HTTP GETのクエリストリングを返す。 |
req.body() | HTTP POSTのリクエストボディを返す。 |
req.GET() | HTTP GETのクエリストリングをHashにしたものを返す。 |
req.POST() | HTTP POSTのリクエストボディをHashにしたものを返す。multipart対応。 |
URL
req.url() | リクエストされたURLを、環境変数から再構築して返す。 |
req.scheme() | URLのスキーム部分を返す。 |
req.host() | URLのホスト名を返す。 |
req.port() | URLのポート部分を整数で返す。 |
req.fullpath() | URLのパス部分を返す。 |
リクエストメソッド
req.request_method() | HTTPのリクエストメソッドを返す。 |
req.delete?() | HTTP DELETEならtrueを返す。 |
req.get?() | HTTP GETならtrueを返す。 |
req.post?() | HTTP POSTならtrueを返す。 |
req.put?() | HTTP PUTならtrueを返す。 |
req.xhr?() | Ajax通信(XmlHttpRequest)ならtrueを返す。 |
その他
req.path_info() | ENV["PATH_INFO"] を返す。 |
req.path_info=(s) | ENV["PATH_INFO"] を設定する。 |
req.referer() | ENV["HTTP_REFERER"]か、"/" を返す。 |
req.referrer() | referer()と同じ。{{fn "こちらの方が英語としては正しいが、技術用語としてはrefererが広く使われている。"}} |
req.script_name() | ENV["SCRIPT_NAME"] を返す。 |
req.script_name=(s) | ENV["SCRIPT_NAME"] を設定する。 |
Rack::Response
res = Rack::Response.new() とか。
Response.new(body=[], status=200, header={}) {|self if block_given?| ...} | 新しいレスポンスオブジェクトを作る。 |
res.[]=(key, value) | レスポンスヘッダのkeyに対応するデータを設定する。 |
res.[](key) | レスポンスヘッダのkeyに対応するデータを返す。 |
res.write(str) | bodyに文字列を追加する。 |
res.empty? | 現在のbodyが空ならtrueを返す。 |
res.set_cookie(key, value) | クッキーを設定する。 |
res.delete_cookie(key, value) | クッキーを削除する? |
res.finish | resに溜めたデータを [200, {}, []] 形式で返す。 |
res.to_a | finishと同じ。 |
res.each{...} | body.eachを呼ぶ。 |
res.close | bodyがファイル等のとき、body.closeを呼ぶ。 |
以下はRack::Request::Helpersのメソッド。
res.content_length() | レスポンスのcontent_lengthを整数で返す。 |
res.content_type() | レスポンスのcontent_typeを文字列で返す。 |
res.location() | レスポンスヘッダのLocationを返す。 |
res.include?(header) | レスポンスヘッダにheaderというキーがあればtrueを返す。 |
res.informational?() | ステータスコードが100台ならtrueを返す。 |
res.successful?() | ステータスコードが200台ならtrueを返す。 |
res.redirection?() | ステータスコードが300台ならtrueを返す。 |
res.client_error?() | ステータスコードが400台ならtrueを返す。 |
res.server_error?() | ステータスコードが500台ならtrueを返す。 |
res.invalid?() | ステータスコードが不正(100未満か600以上)ならtrueを返す。 |
res.ok?() | ステータスコードが200ならtrueを返す。 |
res.empty?() | ステータスコードが201, 204, 304のいずれかならtrueを返す。 |
res.redirect?() | ステータスコードが301, 302, 303, 307のいずれかならtrueを返す。 |
res.forbidden?() | ステータスコードが403ならtrueを返す。 |
res.not_found?() | ステータスコードが404ならtrueを返す。 |
ユーティリティ
Rack::Utils
include Rack::Utils として使う。
escape_html(s) | 文文字列をHTMLに含めるためにエスケープする。 |
escape(s) | 文字列をURLに含めるためにエスケープする。 |
unescape(s) | URLエンコードされた文字列を元に戻す。 |
parse_query(s, d='&;') | クエリストリングを分解したハッシュを返す。 |
Rack::MockRequest
架空のリクエストを作る。テスト用。
Rack::MockResponse
架空のレスポンスを作る。テスト用。
ミドルウェア (抜粋)
Rack::Auth::Basic
Basic認証を行う。
protected_app = Rack::Auth::Basic.new(app) do |username, password| 'j230ru80u' == password end
もしくは
use Rack::Auth::Basic { |username, password| 'j230ru80u' == password }
みたいに書けると思う(未確認)。
Rack::Auth::Digest
Digest認証を行う。
Rack::Reloader
リクエスト時に、Rubyスクリプトが更新されていたらリロードする。 (ただし、重くなるのを避けるため、一度リロードしたら10秒間はリロードしない。 この秒数は設定可能。)
use Rack::Reloader, 20
Rack::File
静的ファイルを表示させるためのアプリケーション(ミドルウェアではない!)。
Rack::Cascadeと組み合わせると、「ファイルが存在しなかったときだけ 俺アプリを呼び出す」のようなことができる。
use Rack::Cascade, Rack::File.new("./public/html/"), MyApp.new
「/cssや/imagesだけ静的ファイル」のような場合はRack::Staticの方が向いている。
Rack::Cascade
複数のアプリケーションを並べて、「404だったら次のを試す」のような動作をする。
オプションで、キャッチするステータスコードを指定することができる(デフォルトは404)。
Rack::Static
指定したディレクトリだけ静的ファイルを表示させる。
use Rack::Static, :urls => ["/css", "/images"], :root => "public"
Rack::Lint
自分のアプリケーションが、RequestとResponseを正しく使っているかチェックしてくれる。
use Rack::Lint
Rack::ShowExceptions
アプリケーションで例外が起きたときに詳細なエラーページを表示する。 使うのは開発中だけにしよう(セキュリティ的な意味で)。
use Rack::ShowExceptions
Rack::ShowStatus
アプリケーションが、ステータスコードが400台・500台の空のレスポンスを返したとき、 エラーページを表示する。 env["rack.showstatus.detail"] に情報を入れておくとそれも表示される。
use Rack::ShowStatus
Rack::CommonLogger
Apacheのcommon log形式でアプリケーションのログを取る。
use Rack::CommonLogger
もしくは
use Rack::CommonLogger, MyLogger.new
loggerは << というメソッドが定義されているものなら何でもいい。(例えばStringとか)
Rack::Recursive
アプリケーション内から別のパスに飛ばせるようにする。
use Rack::Recursive
自分のアプリケーションでリダイレクトしたくなったら
raise Rack::ForwardRequest.new("/notfound")
とすると、"/notfound" に対応したアプリケーションが実行される。
Rack::Session::Cookie
クッキーベースのセッション管理を提供する。 セッションデータはRubyのハッシュで表され、env['rack.session']に入っている。 その中身はRubyのオブジェクトをMarshalでシリアライズしてbase64エンコードしたものになる。
use Rack::Session::Cookie
もしくは
use Rack::Session::Cookie, :key => 'rack.session', :domain => 'foo.com', :path => '/', :expire_after => 2592000
ruファイルの書き方
基本的に、Rubyスクリプトである。利便性のため、use, run, mapなど のメソッドが定義されている。
useでミドルウェアを並べて、runでアプリケーションを指定するのが基本。
require 'hello' use Rack::Lint run HelloApp.new
mapを使うと、パスごとに別のアプリケーションを割り当てることができる。
require 'foo-app' require 'bar-app' use Rack::CommonLogger map "/foo" do use Rack::Session::Cookie run FooApp.new end map "/bar" do run BarApp.new end
リンク
参考サイトです。
View on github | Report issue