酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

ASP.NET MVC 4でTwitter APIのようなURLルーティングの設定をする

以下のようなTwitter APIのような形式のURLにして、ApiコントローラークラスのKyukoアクションを実行させたいと考えています。

http://localhost:9091/api/1/kyuko.json?univ_id=uec

しばやんの「Twitter API のように拡張子で出力フォーマットを変えてみる - しばやん雑記」を参考にしてルーティング定義したのですが、2011年の記事でASP.NET MVCのバージョンが異なるためかKyukoアクションが呼ばれません。

kyuko.jsonにアクセスすると、スタティックなファイルにアクセスしようとして404を返します。

Web.config

jsonファイルにアクセスした時にハンドリングさせるためにWeb.configに以下の追記をします。

  <system.webServer>
    <handlers>
      <add name="JsonFileHandler" path="*.json" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

RouteConfig.cs

ルーティング設定を追加します。RouteConfig.csにルーティングの定義を追加します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Kyuko
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Api",
                url: "api/{version}/{action}.{format}",
                defaults: new { controller = "Api", action = "Kyuko", version = 1, format = "json" }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            //... 省略
        }
    }

Controller

コントローラーを作ります。formatに応じて出力するフォーマットを変更する方法はここでは紹介しませんので、元記事を参考にしてください。

public class ApiController : Controller
{
    public ActionResult Kyuko(int? version, string format, string univ_id)
    {
        var model = new Product
        {
            Id = 10,
            Name = "かなり凄い商品",
            Price = 1980,
            Count = 10,
        };
        return Json(model, JsonRequestBehavior.AllowGet);
    }
}