Adobe AIRでTwitterクライアントを作る

ActionScriptの勉強の為にTwitterクライアントを自作しようとして挫折した数日前でしたが、昨日こんなページを発見。

【連載】今からはじめるAIRプログラミング(13) HTTPリクエスト用API - Web上のサービスをローカルアプリに取り込む

今回の記事は、URLRequestのこうした機能拡張を試すため、非常に単純なTwitterのクライアントをサンプルコードとして用意した。

ちょうどよいところに!
これを使って作ってしまうのが早い!ということで作りました。が、いざ実行してみると、ユーザー名とパスワードを入力して"ログイン"ボタンを押したところで止まってしまう。

なぜだろう?ということでちゃんとソースを読んでみることに。

// ログインボタン押下字の処理
private function login():void {
    // (1) 以降のURLRequestが全て認証情報付きで行われるように、デフォルト値としてセット
    URLRequestDefaults.setLoginCredentialsForHost("twitter.com", userName.text, password.text);

    // (2) 以降、TwitterにHTTPリクエストを送信する処理
    var req:URLRequest = new URLRequest("http://twitter.com/statuses/update.xml");

    // POSTメソッドでなければいけない
    req.method = "POST";

    // Twitterは明示的に認証を行うためのAPIが提供されていないので、
    // 長さゼロの文字列でステータスを変更してみることによって代用
    var variables:URLVariables = new URLVariables();
    variables.status = "";

    // HTTPリクエストを実行。
    var loader:URLLoader = new URLLoader(req);

    // (3) HTTPレスポンスイベントを捕捉
    loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, onHTTPResponse);
}

そしてmineは気がつきました。
HTTPリクエストを実行した後にloaderにレスポンスイベントのリスナを追加しても意味ないんじゃねーの?
と。
つまり、リクエストを実行する前にレスポンスイベントを補足するリスナを追加するべきではなかろうか。
ってことでコードを以下のように書き換え。

    
    // HTTPリクエストを生成。
    var loader:URLLoader = new URLLoader();

    // (3) HTTPレスポンスイベントを捕捉
    loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, onHTTPResponse);

    // HTTPリクエストを実行。
    loader.load(req);
		

これで動くようになりました。ばんざいばんざい。
後はこれを投稿とかも出来るように改良していくのがいい気がするね!


ここ数日お世話になっている本。結構面白いです。ActionScriptJavaScript(←個人的にこれにはあまり興味が無い)、Adobe AIRについて結構しっかり学ぶことが出来ます。

Adobe AIRプログラミングガイド

Adobe AIRプログラミングガイド