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

tmytのらくがき

個人の日記レベルです

Azure Mobile ServicesのカスタムAPIでちょっと高度なURLルーティング

以前、Azure Mobile ServicesのカスタムAPIでもURLがルーティングできるよー。という話を書きましたが、実はもっと細かい指定ができるんだよー。という話。

express.jsのURLルーティングは正規表現が使えたり、パラメタ名を正規表現でマッチングさせたりわりかし高度なことができます。でもAzure Mobile Servicesだとそれができません。なぜなら、exports.registerで指定した関数に渡されるのはexpress.jsのインスタンスではないからです。

できないといったそばから実はできるんです。というのもひじょーにあれですが、できます。

Azure Mobile Servicesのregisterで渡される引数オブジェクトのgetを呼び出すと、express.jsのgetが最終的に呼ばれます。このとき、URLは正規表現でマッチされています。 たとえば、photosというAPIを作ったとするとこんな感じ。

/location/get
=> \/api\/photos\/\/location\/get

つまり、あそこに正規表現を書けば任意の形式でマッチさせることができます。 たとえば、URLに緯度,経度と指定したい場合は次のように書きます。

/location/()([0-9.]+),([0-9.]+)

ここでポイントになるのが、最初の何もキャプチャしない()。これはAzure Mobile Servicesが正規表現に展開するとき次のように展開するからです。

\/api\/photos\/\/location\/(?:)([0-9.]+),([0-9.]+)

見ての通り、なぜか1つめのグループのみキャプチャされないようになっています。かといって、すべてキャプチャされないのかというとそうではなく、2個目以降は普通にキャプチャされます。謎挙動です。

さて、こうしてキャプチャした値ですがこんな感じで参照できます。とても普通な感じですね。

function location(request, response){
    request.params[0]; // 1個目
    request.params[1]; // 2個目
}