2013-05-13 18 views
5

Ich erstelle meine erste ASP.NET-Web-API. Ich versuche, den Standard-REST-URLs zu folgen. Meine API würde die Suchergebnisse zurückgeben. Meine URL sollte -Verschachtelte Web-API-Ressource in URL

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

Ich plane OData für die Suche und Basic/Digest-Authentifizierung über IIS zu verwenden. Mein Problem ist in den verschachtelten Ressourcen. Bevor ich die Suchergebnisse zurücksende, muss ich prüfen, ob der Benutzer Zugriff auf diese Kategorie und Unterkategorie hat. Jetzt habe ich mein Visual Studio 2012 - MVC4/Web API-Projekt erstellt. Im App_Start-Ordner befinden sich 2 Dateien, die meiner Meinung nach URL und Reihenfolge der Ressourcen sind.

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 } 
); 

Mit diesem Modell funktioniert es gut, wenn meine URL ../api/records?SearchCriteria ist, aber es ist nicht mein oben angegebenes URL-Design. Ich verstehe, dass ich etwas mehr lesen muss, aber bis jetzt nicht in der Lage, den richtigen Artikel zu finden. Brauchen Sie Ratschläge, wie Sie meine URL erreichen können und welche Änderungen in diesen 2 Dateien erforderlich sind. Oder gibt es eine andere Konfiguration, die mir hier fehlt? Danke im Voraus.

Antwort

2

Angenommen, Sie haben einen Controller namens Kategorien, Ihre WebApiConfig.cs wie dies eine Route haben könnte Ihre gewünschte URL übereinstimmen (Ich persönlich würde die /Aufzeichnungen lassen Teil aus):

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

und ein Verfahren könnte wie folgt aussehen:

// 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)) 
    { 
    } 
} 

Aber was ist, wenn Sie wollen auch nur die Kategorien zurückkehren und nicht Unterkategorien? Sie würden eine zusätzliche Route nach dem ersten benötigen, die mehr generisch ist:

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

mit zwei Methoden wie:

// 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-2 bietet Attribut aus der Box Routing. Sie können Route für einzelne Aktionsmethoden oder auf globaler Ebene definieren.

ZB:

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

Sie auch einen gemeinsamen Präfix für eine gesamte Steuerung mithilfe des [RoutePrefix] Attribut festlegen:

[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) { ... } 
} 

Sie this Link für weitere Informationen auf Attribut besuchen können in Web-Routing API 2.