2013-05-13 16 views
5

私は最初のASP.NET Web APIを作成しています。標準のREST URLに従っています。私のAPIは検索結果レコードを返します。私のURLはする必要があります -URLのWeb APIネストされたリソース

../api/categories/{categoryId}/subcategories/{subCategoryId}/records?SearchCriteria

私はIIS上で検索すると基本/ダイジェスト認証のためのODataを使用することを計画しています。私の問題はネストされたリソースにあります。検索結果を返す前に、ユーザーがこのカテゴリとサブカテゴリにアクセスできるかどうかを確認する必要があります。 これでVisual Studio 2012 - MVC4/Web APIプロジェクトを作成しました。 App_Startフォルダには、URLとリソース関連の2つのファイルがあります。このモデルでは

1.RouteConfig.cs

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

2.WebApiConfig.cs

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

を、私のURLが../api/records?SearchCriteriaであれば、それが正常に動作しますが、それはあります上記の私のURLデザインではありません。私は少し読書をしなくてはならないが、これまで正しい記事を見つけることができないことを理解する。 URLを取得する方法と、この2つのファイルに必要な変更についてのアドバイスが必要です。あるいは、私がここで紛失している他の設定がありますか?前もって感謝します。

答えて

2

あなたはカテゴリという名前のコントローラを持っていると仮定すると、あなたのWebApiConfig.csは、ご希望のURLを一致させるために、このようなルートを持つことができます(私は個人的に/記録部分をオフのままにします):

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{categoryId}/subcategories/{subCategoryId}", 
    defaults: new { controller = "categories", categoryId = somedefaultcategory, 
     subCategoryId = RouteParameter.Optional } 
); 

方法は次のようになります。

// search a single subcategory 
public IQueryable<SearchRecord> Get(int categoryId, int subCategoryId = 0, string SearchCriteria = "") 
{   
    // test subCategoryId for non-default value to return records for a single 
    // subcategory; otherwise, return records for all subcategories 
    if (subCategoryId != default(int)) 
    { 
    } 
} 

しかし、サブカテゴリではなくカテゴリのみを返す場合はどうしますか? 2は、箱から出してのルーティング属性を提供

// search a single category 
public IQueryable<SearchRecord> Get(int categoryId, string SearchCriteria = "") 
{ 
} 
// search all categories 
public IQueryable<SearchRecord> Get(string SearchCriteria = "") 
{ 
} 
3

Asp.netのWeb API:のような二つの方法で

config.Routes.MapHttpRoute(
    name: "Categories", 
    routeTemplate: "api/{controller}/{categoryId}", 
    defaults: new { controller = "categories", categoryId = RouteParameter.Optional } 
); 

:あなたはより一般的である最初のものの後に追加のルートを必要とするだろう。個々のアクションメソッドまたはグローバルレベルでRouteを定義することができます。

例:あなたは、Webでのルーティング属性の詳細については、thisリンクを訪問することができます

[RoutePrefix("api/books")] 
public class BooksController : ApiController 
{ 
    // GET api/books 
    [Route("")] 
    public IEnumerable<Book> Get() { ... } 

    // GET api/books/5 
    [Route("{id:int}")] 
    public Book Get(int id) { ... } 
} 

:また[RoutePrefix]属性を使用して、コントローラ全体に共通の接頭辞を設定することができます

[Route("customers/{customerId}/orders/{orderId}")] 
public Order GetOrderByCustomer(int customerId, int orderId) { ... } 

API 2

関連する問題