読者です 読者をやめる 読者になる 読者になる

銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Azure Mobile Services のスクリプトでWeb APIをたたいてXMLをパースする

Azure Mobile Services は Azure の Backend As A Service で、Windows Store Appや Windows Phone はもちろん iOS,Androidへのプッシュ通知、Web APIエンドポイントの作成、データの格納などさまざまな機能を簡単に利用可能になっています。スケジュールで実行したり、DB操作のタイミングで登録したスクリプトを実行することもできます。スクリプトの書き方などはこちらをば => Work with server scripts in Mobile Services

じゃあ、そのスクリプトでどこかのWeb APIでもたたいてその結果をパースして処理をしたいですね、という気持ちになります。そして、APIの返り値がJSONならあまり問題もないのですが、XMLで返ってくるケースはしばしばあります。すると割と厄介です。

HTTPリクエストを投げる方法は HTTP 要求の送信 にあるんですが、XMLをパースするサンプルは探した範囲ではありませんでした。が、このスクリプトではNode.js の一部のモジュールを使うことはできるとあります。xml2jsというNode.js のモジュールは利用可能だったのでこれを使うことにします。(Node.js に関するドキュメントというリンクを開くと Node.js v0.6.20 という古いバージョンに飛ぶのがあれげですが...)

というわけでサンプルコードです。Mobile Serviceのスケジュールに登録して実行する用に書きました。(スケジュール1つまでは無料枠で使えるはず)

function samplejob() {
    var httpRequest = require('request');
    var url = 'http://d.hatena.ne.jp/exist?mode=xml&url=http://tech.tanaka733.net/';
    var xml2js = require('xml2js');
    var parser = new xml2js.Parser();
    httpRequest.get({
        url: url
    }, function(err, response, body) {
        if (err) {
            console.warn('Unable to connect to hatena.');
        } else if (response.statusCode !== 200) {
            console.warn('Something wrong.');
        } else {
            parser.parseString(body, function(err, result) {
                if (err) {
                    console.warn(err);
                } else {
                    console.info(result.existxml.count[0]._);
                }
            });
        }
    });
}

今回は認証なしにお気軽に使えるAPIとして はてなexist API - Hatena Developer Center を使いました。xml2js を require して、パースして、件数をconsoleに出しています。consoleに出力しておくと、Azureのダッシュボードからログとして確認できます。

実際にはスケジュールでこんな感じに登録して、「一度だけ実行する」を押しまして...

f:id:tanaka733:20131115011307p:plain

で、ログを見ると表示されています。

f:id:tanaka733:20131115011331p:plain

かんたんですね。Azure Mobile Servicesのスクリプトで使える(requireできる)Node.js のモジュール一覧とかあると、いいと思います。