FlashBuilder4でのデータとサービスでハイフンが入ったタグ名を回避する方法
きっかけ
自宅サーバーにSubsonicというミュージックサーバーを動かしていて、こいつはAPIを使っていろいろクライアントを作れたりする。
実際にいくつかクライアントが公式ページで紹介されている。
そこでAIRを使って自分で遊んでみようと思いたって作る事にした。
FlashBuilder4から新しく使えるようになった「データとサービス」を使うとWebサービスなどのデータがものすごく簡単にアクセスできるようになった。
ところがいざSubsonicのAPIを使って「戻り値の型を設定」のウィザードにある自動検出で操作を呼び出して設定しようすると下のようなエラーが出て先に進めず...
ActionScript命名規則の壁
SubsonicのAPIはXMLかMP3などのバイナリを返してきくるが、XMLのタグにハイフンが含まれているせいであるようだ。
実際にハイフンを除いてウィザードの「サンプルXML/JSON応答を入力」を選び、図の様に入力すると問題無く次に進む。
ググってみたらどうやらXMLパーサーが解析したタグの名前をプロパティ名に充てようとするために起こるらしい。
具体的に言うとXMLに"foo-tag"というタグ名があるとオブジェクトは次の様にマッピングしようとする(多分
HogeObj.foo-tag
ハイフンはマイナス演算子として扱われるためにエラーになるらしい。
回避方法としては[]を使ってインデックスに文字列を指定してアクセスすればいけるらしい。
でも今回はデータとサービスの機能を使いたいしということで却下w
Flaskでproxy的な使い方をする
まずFlaskを簡単に説明するとRubyでいうSinatraにあたるマイクロWebフレームワーク。
詳しく知りたい方はググってください。
で、具体的な方法はFlaskがSubsonicサーバーのフロントエンドになりFlaskのハンドラがurllib2でアクセスしにいってその中のXMLを書き換えるという強引な方法。
こうした理由はHTML5でも使う予定をしてるけどサーバーが返すレスポンスが少しマズいのでaudioタグで再生できないというのが有ったし、いろいろ書き換えて遊ぶためにFlaskを採用した。
まあ最もお前の趣味だろと言われれば否定しないけどw
コード
今回できたコードが以下。
とりあえうず動く確証が欲しかったのでベタ書き&ping.viewのAPIのみしか動きませんが...
#! python # -*- coding:utf-8 -*- from flask import Flask import urllib2 BASEURL = 'http://<subsonic-url>/rest/' app = Flask(__name__) @app.route("/ping.view") def do_ping(): target_action = "ping.view?u=USERNAME&p=PASSWORD&v=VERSION&c=CLIENTNAME" result = urllib2.urlopen(BASEURL + target_action) result_body = result.read() return result_body.replace("subsonic-response", "subsonicResponse") if __name__ == '__main__': app.run(debug=True)
ちなみにユーザー名とかパスワードとか(GETパラメータのu,pの部分)べた書きすればパスワード無しでAPI使えるだだ漏れミュージックサーバーができる。