Flash で外部から XML とかを取ってくる時に
とりあえず手元で試したい、というときって結構あると思う。それに、作ってる途中で毎回変動するようなデータが送られてくるとどっちが悪いんだ、ということもあるだろうし。
で、ぼくは Ruby厨だし、sinatra厨なので、 sinatra でサクっと書くんだけど、crossdomain.xml とか用意しなきゃいけないし、何より毎回書くのが面倒なので、ちょっとだけ汎用的に動くようなスクリプトを書いてみた。
これだ
ソース
#!/usr/bin/env ruby require 'rubygems' require 'sinatra' ############################# # !!!README!!! # /hoge で任意のファイルを content-type:text で返却します # /xml/hoge.xml で content-type:xml で返却します # /swf/hoge.swf で content-type:application/x-shockwave-flash で返却します # どのファイルにしても、このファイルと同じ階層を基点とします。 # たとえば、 /xml/hoge.xml なら、このファイルと同じ階層に hoge.xml を、 # /xml/hoge/fuga.xml なら、 このファイルのあるディレクトリの中の、hoge ディレクトリ内のファイルになります。 ############################# # クロスドメインファイルの定義をしておくよ before do @crossdomain = <<EOS <?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <site-control permitted-cross-domain-policies="all"/> <allow-access-from domain="*" /> </cross-domain-policy> EOS end # ここのリクエスト名が GET する XML のファイル名になる get '/:filename' do # クロスドメインだったら、下のリクエストへ pass if params[:filename] == 'crossdomain.xml' # ファイルパス作成 path = File.dirname(__FILE__) + '/' + params[:filename] if File.file? path file = File.read(path) else file = "not found => #{path}" end content_type :text file end # クロスドメイン用 get '/crossdomain.xml' do content_type :xml @crossdomain end # http://localhost:4567/xml/hoge.xml でアクセスできるよ get '/xml/:filename' do # ファイルパス作成 path = File.dirname(__FILE__) + '/' + params[:filename] if File.file? path file = File.read(path) else file = "<?xml version=\"1.0\"?><message>not found => #{path}</message>" end content_type :xml file end # http://localhost:4567/swf/hoge.xml でアクセスできるよ get '/swf/:filename' do path = File.dirname(__FILE__) + '/' + params[:filename] if File.file? path file = File.open(path, "rb") {|f| f.read } else file = "" end content_type "application/x-shockwave-flash" file end
使い方
sinatra が入っていれば、上記ファイルに実行権限を付けて、ファイルを実行するか、ruby hoge.rb*1 とすれば良い。
README と書いた所にウダウダ書いてある通りで、 http://localhost4567/xml/* で、XML 用のレスポンスを、 http://localhost:4567/swf/* で SWF 用のレスポンスを返す。
とりあえず、 http://localhost:4567/* にアクセスしたら text で返すようにしてる。
アクセスされた時は、上記スクリプトと同じ階層を基点にファイルを探します。
例えば、 http://localhost:4567/xml/hoge.xml なら、スクリプトと同じ階層にある hoge.xml を見に行きます。
というわけで
完全に自分用のメモですが、ruby と rubygems と、sinatra を入れてるような希有な方は使ってみると良いかもしれないです。
Windows で Ruby をインストールするなら
*1:上記スクリプトが hoge.rb だった場合