2

ASP.NET MVC 4 フレームワークで記述された Web サービスがあります。その基本的な CRUD 操作は REST 動詞にうまく対応していますが、追加する必要があるアクションが 1 つありますが、そうではありません。

整数型であることがわかっている ID を URL の末尾に渡す機能を指定する正しい方法は何ですか? 正しいルーター マップについてサポートが必要です。

考え?注: 私は 100% REST よりも WebAPI に関心があります。

URL の例
// ウィジェットのリストを取得 http://somedomain.com/api/widget // 特定のウィジェットを取得 http://somedomain.com/api/widget/1 //
POST - 特定のウィジェットに対して特別なアクションを実行 - 昇格http://somedomain.com/api/widget/promote/1



これはそれを処理する正しい方法でしょうか?

        routes.MapHttpRoute(  
            name: "DefaultApi",  
            routeTemplate: "api/{controller}/{id}",  
            defaults: new { id = RouteParameter.Optional }  
        );  

        routes.MapHttpRoute(  
            name: "DefaultApiExtended",  
            routeTemplate: "api/{controller}/{action}/{id}"  
        );  
4

3 に答える 3

5

2 番目のパターン(文字列型の後にスラッシュと int ID が続く「アクション」)を(整数型であることがわかっている URL の末尾に ID を渡す)よりも高い優先順位で入れてみます。 .

routes.MapHttpRoute(
            name: "ActionWithId",
            routeTemplate: "api/widget/{action}/{id}"
        );

routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

アクションと ID は、常に期待されているため、オプションではありません。一致するものがない場合は、DefaultApi ルールが処理を引き継ぐ必要があります。

編集:

「RESTy」にしたい場合は、いつでもIDを切り替えることができるので、このウィジェットに対して、このIDで、このアクションを実行してください。

routes.MapHttpRoute(
        name: "ActionWithId",
        routeTemplate: "api/widget/{id}/{action}"
    );
于 2012-08-23T15:04:22.850 に答える
4

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api-具体的には「アクション名によるルーティング」のセクションをご覧ください。

http://somedomain.com/api/widget/promote/1からhttp://somedomain.com/api/widgets/1/promote へ のわずかな変更をお勧めします

(可能であれば複数形のウィジェット* s *を使用してください)

コントローラは次のようになっている必要があります。

public class WidgetsController : ApiController
{
    [HttpPost]
    /// POST api/widgets/1/promote
    public void Promote(int id)
    {

    }

    // GET api/widgets/1
    public string Get(int id)
    {
        return "value";
    }

}

そしてルート:

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

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        routes.MapHttpRoute(
           name: "DefaultPromoteActionApi",
           routeTemplate: "api/{controller}/{id}/{action}",
           defaults: new { action = "Promote" }
       );
    }
于 2012-08-23T15:10:39.983 に答える
1

AttributeRoutingを見てください。これを簡単に達成できるはずです。

于 2012-08-23T21:20:03.900 に答える