2013-05-13 21 views
5

में वेब एपीआई नेस्टेड संसाधन मैं अपना पहला एएसपी.नेट वेब एपीआई बना रहा हूं। मैं मानक आरईएसटी यूआरएल का पालन करने की कोशिश कर रहा हूं। मेरा एपीआई खोज परिणाम रिकॉर्ड वापस करेगा। मेरे URL होना चाहिए -यूआरएल

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

मैं खोज और आईआईएस से अधिक बेसिक/डाइजेस्ट प्रमाणीकरण के लिए OData उपयोग करने के लिए योजना बना रहा हूँ। मेरी समस्या नेस्टेड संसाधनों में है। खोज परिणामों को वापस करने से पहले, मुझे यह जांचना होगा कि उपयोगकर्ता को इस श्रेणी और उप श्रेणी तक पहुंच है या नहीं। अब मैंने अपना विजुअल स्टूडियो 2012 - एमवीसी 4/वेब एपीआई प्रोजेक्ट शुरू करने के लिए बनाया है। App_Start फ़ोल्डर में, 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 है बल्कि यह है ऊपर वर्णित मेरा यूआरएल डिजाइन नहीं। मैं समझता हूं कि मुझे थोड़ा और पढ़ना है लेकिन अब तक सही लेख नहीं ढूंढ पा रहा है। मेरे यूआरएल को कैसे प्राप्त करें और इन 2 फाइलों में किन परिवर्तनों की आवश्यकता है, इस बारे में आपकी सलाह चाहिए। वैकल्पिक रूप से, क्या कोई अन्य कॉन्फ़िगरेशन है कि मैं यहां याद कर रहा हूं? अग्रिम में धन्यवाद।

उत्तर

2

मान लिया जाये कि आप एक नियंत्रक नामित श्रेणियों, आपका WebApiConfig.cs अपने वांछित यूआरएल मैच के लिए (मैं व्यक्तिगत रूप से /रिकॉर्ड हिस्से को छोड़ना होगा) इस तरह एक मार्ग हो सकता है:

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

लेकिन, यदि आप केवल श्रेणियों को वापस करना चाहते हैं और उपश्रेणियां नहीं चाहते हैं तो क्या होगा?

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

Asp.net वेब एपीआई 2 बॉक्स से बाहर मार्ग गुण प्रदान करता है: दो विधियों की तरह साथ

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

: आप पहले एक है कि अधिक सामान्य है के बाद एक अतिरिक्त मार्ग आवश्यकता होगी। आप व्यक्तिगत कार्रवाई विधि या वैश्विक स्तर पर Route परिभाषित कर सकते हैं।

उदाहरण के लिए:

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

आप वेब रूटिंग गुण के बारे में अधिक जानकारी के लिए this लिंक पर जाएँ कर सकते हैं:

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

तुम भी [RoutePrefix] विशेषता का उपयोग करके एक पूरे नियंत्रक के लिए एक आम उपसर्ग सेट कर सकते हैं एपीआई 2.