6

自分でasp.net mvc 4 Web APIを構築しています

Microsoft のビデオを見てきましたが、良いと思います。HTTP 動詞が使用されます。リソースは名詞で、リポジトリなどでダンディです。

しかし、1つのことが本当に私を悩ませています

GET http://www.myurl.com/api/sellers/{id}/productsこれは落ち着いていて、そうではないという印象を受けてGET http://www.myurl.com/api/products?$filter = sellerID eq {id}います。

私が新しい Web API について読んだことでわかるのは、前者と後者だけです。

後者の前者に対するネイティブ サポートはありますか? そうでない場合、すべてをルーティングせずにそれを行う方法はありますか?


編集-許可するものなど
を探していますGET http://www.myurl.com/api/sellers/{id}/productsGET http://www.myurl.com/api/products


更新:
この質問はしばらく意味がありませんでした。修正しましたが、最初の回答が正しいとマークされていないのはそのためです。


更新: MilkyWayJoe とチャットした後、へ
の変換について話しました。どうすればこれを行うことができるかについて、誰かが何か考えを持っていますか?/Seller/2/Products/Products?$filter = sellerID eq 2

4

3 に答える 3

3

URLhttp://www.myurl.com/api/products?$filter= sellerID eq {id}ODataフィルターを使用しています。これは、コントローラーがコレクションを として返すときに Web API でそのまま使用されますIQuerable。VS 2012 のデフォルトは現在IEnumerable、OData をサポートしない に設定されています。

詳細については、こちらこちらをご覧ください。

于 2012-07-05T07:47:19.273 に答える
3

リソースをネストすることは可能ですが (少なくとも URL 構築では)、MVC ではあまりサポートされていません。ほとんどの作業を自分で行う必要があります。

まず、構造を処理するルートを作成する必要があります。

url: "sellers/{sellerId}/products",
defaults: new { controller = "sellers", action = "GetProducts" }

次に、GetProducts「Sellers」コントローラーでアクションを作成する必要があります。これは、このルートが呼び出し元を誘導する必要があります。

[HttpGet]
public IEnumerable<Product> GetProducts(int sellerId)
{
    //TODO: Add query to return results.
}

パラメーターはsellerIdルートを介して渡され、クエリを実行するために使用する必要があります。

このアプローチの主な欠点は、カスタム ルートを使用すると、リソース間のリンクの URL を生成するのが難しくなり、リソースが複雑になると、予期しない URL との一致が開始される可能性があることです。

于 2012-07-05T12:31:24.837 に答える
2

私はあなたの同じ問題の解決策を探しています。現在、このソリューションをテストしています。

まず、ルートを変更します。

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

次に、 が必要な場合はSellersController、通常どおりに記述しますが、すべてのアクションに「Index」という名前を付け、表記法を使用して http 動詞を正しくルーティングします。例えば:

     [HttpGet]
     public List<Seller> Index()
     {}

次に、 でSellersController、「内部」オブジェクト ( Products) として名前を付けたアクションを作成します。

     [HttpGet]
     public List<Product> Products(int id)
     {}

     [HttpGet]
     public Product Products(int id, int id2)
     {}

このようにして呼び出すことができます

     GET /api/sellers
     or GET /api/sellers/99/products
     or GET /api/sellers/99/products/2

私は実際にこのアプローチをテストしているので、フィードバックをいただければ幸いです。

于 2012-07-11T15:42:37.070 に答える