2013-05-13 42 views
5

Tôi đang tạo API web ASP.NET đầu tiên của mình. Tôi đang cố gắng tuân theo các URL REST chuẩn. API của tôi sẽ trả về các bản ghi kết quả tìm kiếm. URL của tôi nên -Tài nguyên lồng nhau trên Web API trong URL

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

Tôi đang lên kế hoạch để sử dụng OData để tìm kiếm và Basic/Digest Authentication trên IIS. Vấn đề của tôi là trong các tài nguyên lồng nhau. Trước khi tôi trả lại kết quả tìm kiếm, tôi cần kiểm tra xem người dùng có quyền truy cập vào danh mục này và danh mục phụ hay không. Bây giờ tôi đã tạo dự án Visual Studio 2012 - MVC4/Web API của mình để bắt đầu. Trong thư mục App_Start, có 2 tệp mà tôi tin là URL và thứ tự tài nguyên có liên quan.

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

Với mô hình này, nó hoạt động tốt nếu URL của tôi là ../api/records?SearchCriteria nhưng nó là không phải thiết kế URL của tôi được đề cập ở trên. Tôi hiểu rằng tôi phải đọc ít hơn nhưng cho đến nay vẫn không thể tìm được bài viết chính xác. Cần lời khuyên của bạn về cách đạt được URL của tôi và những thay đổi nào là cần thiết trong 2 tệp này. Ngoài ra, có một số cấu hình khác mà tôi đang thiếu ở đây không? Cảm ơn trước.

Trả lời

2

Giả sử bạn có một bộ điều khiển tên loại, WebApiConfig.cs của bạn có thể có một con đường như thế này để phù hợp với mong muốn của bạn url (Cá nhân tôi sẽ rời khỏi /hồ sơ phần off):

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

và một phương pháp có thể trông giống như sau:

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

Nhưng, điều gì sẽ xảy ra nếu bạn cũng muốn chỉ trả về các danh mục chứ không phải tiểu thể loại? Bạn sẽ cần một lộ trình bổ sung sau khi người đầu tiên đó là chung chung hơn:

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

với hai phương pháp như:

// 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 cung cấp thuộc tính định tuyến ra khỏi hộp. Bạn có thể xác định Route trên phương thức hành động riêng lẻ hoặc ở cấp độ toàn cầu.

Ví dụ:

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

Bạn cũng có thể thiết lập một tiền tố chung cho toàn bộ một bộ điều khiển bằng công [RoutePrefix] thuộc tính:

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

Bạn có thể truy cập this liên kết để biết thêm thông tin về thuộc tính định tuyến trong Web API 2.

Các vấn đề liên quan