3

現在、ASP.NET Web API を使用して REST API を設計しています。

私は次のようなメソッドを提供したいと考えています (http メソッドは無関係です - すべてで動作するはずです):

  • /api/クライアント
  • /api/client/CID1234 (CID1234 = ID)
  • /api/client/CID1234/orders (注文 = アクション)

問題は次のとおりです: Idはオプションである必要があります - /api/client はクライアントのリストを返す可能性があります アクションもオプションである必要があります - ある場合は特定のクライアントを取得し、別の場合はそのクライアントで特定のアクション実行したい. (RPC スタイル)

私が使用している「ID」が非常に異なって見えるため、制約を使用できるとは思いません。

このアプローチはうまくいきませんでした:

config.Routes.MapHttpRoute(
            name: "RpcStyleApi",
            routeTemplate: "rest/{controller}/{action}",
            defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
        );

このアプローチも機能しませんでした:

config.Routes.MapHttpRoute(
            name: "RpcStyleApi",
            routeTemplate: "rest/{controller}/{action}"
        );

        config.Routes.MapHttpRoute(
            name: "RpcStyleApi2",
            routeTemplate: "rest/{controller}/{id}/{action}",
            defaults: new { action = RouteParameter.Optional }
        );

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

たとえば、これは「アクション」と「id」を区別できないため、404 を返します。「名前「CID1234」に一致するアクションがコントローラー「クライアント」に見つかりませんでした。

必要な柔軟性を得るには、カスタム Actionselector を使用する必要がありますか? それとも、機能に組み込まれている Web API を使用して何とか可能ですか? 誰かが注文を別のエンティティとして使用したい場合があることを理解しています。しかし、そこには実際の「アクション」(「エンティティ」ではない) があるかもしれません。「ロストパスワード」、「パスワード変更」など。

アドバイスありがとうございます

PS:ここで説明されているようなことは、私がやりたいことではありません。不適切な API 設計。

4

3 に答える 3

0

次のようにルートを定義するとします。

config.Routes.MapHttpRoute(
    name: "RpcStyleApi1",
    routeTemplate: "rest/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional, action = "Get" }
);

config.Routes.MapHttpRoute(
    name: "RpcStyleApi2",
    routeTemplate: "rest/{controller}/{id}/{action}"
);

次に、次のようにコントローラーでメソッドを作成できます。

public string Get()
{
    return "GET";
}

public string Get(string id)
{
    return "GETID";
}

public string Orders(string id)
{
    return "GETORDERS";
}

これは、URLの組み合わせに対処する必要があります

  • /休憩/クライアント
  • /残り/クライアント/CID1234
  • /残り/クライアント/CID1234/注文
于 2013-03-27T11:39:48.160 に答える
0

2番目のアプローチが機能しない理由は正確にはわかりませんが、以下のルーティング構成が機能します

config.Routes.MapHttpRoute(
            name: "WebApiWithActionRouteName"
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "WebApiDefaultRouteName",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
于 2013-09-20T22:08:21.990 に答える