2012-06-07 8 views
104

मैं .NET MVC4 वेब एपीआई का उपयोग कर रहा हूं (उम्मीद है कि) एक विश्वसनीय एपीआई लागू करें। मुझे सिस्टम के कुछ पैरामीटर में पास करने की आवश्यकता है और इसे कुछ क्रियाएं करने की ज़रूरत है, फिर परिणामों के रूप में वस्तुओं की एक सूची वापस करें। विशेष रूप से मैं दो तिथियों में गुजर रहा हूं और उनके बीच आने वाले रिकॉर्ड लौटा रहा हूं। मैं रिकॉर्ड किए गए रिकॉर्ड्स का ट्रैक भी रख रहा हूं ताकि बाद में कॉल सिस्टम में पुन: प्रसंस्कृत नहीं हो पाएं।मुझे एएसपी.Net वेब एपीआई में एकाधिक पैरामीटर कैसे पास करना चाहिए?

मैं कुछ दृष्टिकोण पर विचार किया है:

  1. एक ही JSON स्ट्रिंग में पैरामीटर Serializing और एपीआई में अलग यह उठा। http://forums.asp.net/t/1807316.aspx/1

  2. क्वेरी स्ट्रिंग में पैराम पास करें।
    What is best way to pass multiple query parameters to a restful api?

  3. मार्ग में पैरामीटर निर्धारित करना: API/नियंत्रक/DATE1/DATE2

  4. एक पोस्ट है कि स्वाभाविक देता है का उपयोग करते हुए मुझे पैरामीटर के साथ एक वस्तु गुजरती हैं।

  5. वेब एपीआई (वर्तमान में) के बाद ओडीएटीए का शोध करना इसका समर्थन करता है। मैंने अभी तक इसके साथ बहुत कुछ नहीं किया है इसलिए मैं इससे बहुत परिचित नहीं हूं।

ऐसा लगता है कि उचित आरईएसटी प्रथाओं से संकेत मिलता है कि डेटा खींचने पर आपको जीईटी का उपयोग करना चाहिए। हालांकि, जीईटी को नलीपोटेंट भी होना चाहिए (कोई दुष्प्रभाव नहीं पैदा करता है), और मुझे आश्चर्य है कि मेरा विशिष्ट कार्यान्वयन उल्लंघन करता है क्योंकि जब से मैं एपीआई सिस्टम में रिकॉर्ड चिह्नित करता हूं, इसलिए मैं साइड इफेक्ट्स का उत्पादन कर रहा हूं।

यह मुझे परिवर्तनीय मानकों का समर्थन करने के सवाल का भी नेतृत्व करता है। यदि इनपुट पैरामीटर सूची में परिवर्तन होता है, तो चॉइस 3 के लिए अपना मार्ग फिर से परिभाषित करना कठिन होगा यदि ऐसा होता है। और क्या हो सकता है यदि पैरामीटर रन-टाइम पर परिभाषित किए गए हैं ...

किसी भी मामले में, मेरे विशिष्ट कार्यान्वयन के लिए, कौन सा विकल्प (यदि कोई है) सबसे अच्छा लगता है?

उत्तर

7

इस रिकॉर्ड अंकन का क्या अर्थ है? यदि इसका उपयोग केवल लॉगिंग उद्देश्यों के लिए किया जाता है, तो मैं जीईटी का उपयोग करता हूं और सभी कैशिंग अक्षम करता हूं, क्योंकि आप इस संसाधन के लिए प्रत्येक क्वेरी लॉग करना चाहते हैं। यदि इस रिकॉर्ड अंकन का एक और उद्देश्य है, तो POST जाने का तरीका है। उपयोगकर्ता को पता होना चाहिए कि उसके कार्य सिस्टम को प्रभावित करते हैं और POST विधि एक चेतावनी है।

+0

चिह्नित करके मेरा मतलब यह है कि कौन से रिकॉर्ड संसाधित किए जाते हैं और लौटाते हैं ताकि बाद की कॉल उन्हें दोहराएं। मेरे मामले में मैं संसाधित किए जाने वाले ट्रैक को ट्रैक करने के लिए बस एक और तालिका में डालने वाला हूं। – sig606

+0

अभी मैंने इसे मुख्य रूप से आपके द्वारा किए गए कारण के लिए पोस्ट के रूप में कार्यान्वित किया है - कार्यवाही होती है और उपभोक्ता उनके बारे में जागरूक है। इसके अलावा यह अलग-अलग डेटा को पार करने के लिए आसान और सबसे लचीला लगता है। – sig606

+0

@ sig606: POST मेरे लिए जाने का तरीका है, लेकिन आपका प्रोटोकॉल सुरक्षित प्रतीत नहीं होता है। क्या होगा यदि कुछ होता है और क्लाइंट पक्ष पर रिकॉर्ड्स पुनर्प्राप्त किए जाते हैं, लेकिन बग के कारण संसाधित नहीं होते हैं? आप उन्हें और वापस नहीं लौटाएंगे और ग्राहक खोए गए डेटा के साथ छोड़ दिया जाएगा। – LukLed

7

का उपयोग प्राप्त या पोस्ट स्पष्ट रूप से द्वारा समझाया गया है @LukLed। मापदंडों को पारित करने के तरीकों के बारे में मैं दूसरे दृष्टिकोण के साथ जाने का सुझाव दूंगा (मुझे ओडीएटीए या तो बहुत कुछ पता नहीं है)।

1. पैरा को एक एकल JSON स्ट्रिंग में क्रमबद्ध करना और इसे एपीआई में अलग करना। http://forums.asp.net/t/1807316.aspx/1

यह उपयोगकर्ता के अनुकूल और एसईओ अनुकूल

2.Pass क्वेरी स्ट्रिंग में पैरामीटर नहीं है।एक आरामदायक एपीआई को एकाधिक क्वेरी पैरामीटर पास करने का सबसे अच्छा तरीका क्या है?

यह सामान्य सामान्य दृष्टिकोण है।

मार्ग में पैरामीटर 3.Defining: एपीआई/नियंत्रक/DATE1/DATE2

यह निश्चित रूप से एक अच्छा तरीका नहीं है। यह महसूस करता है कि date2date1 का उप संसाधन है और ऐसा नहीं है। date1 और date2 दोनों क्वेरी पैरामीटर हैं और एक ही स्तर पर आते हैं।

सरल मामले में मैं इस तरह एक यूआरआई सुझाव है,

api/controller?start=date1&end=date2 

लेकिन मैं व्यक्तिगत रूप से यूआरआई पैटर्न नीचे लेकिन इस मामले में जैसे हम मापदंडों मैप करने के लिए कुछ कस्टम कोड लिखने के लिए की है।

api/controller/date1,date2 
+0

दरअसल, वे मेरी मूल व्याख्या थीं। मुझे लगता है कि लुकलेड ने मेरे टैग और यूआरएल लिंक को चमक लिया है। – sig606

+0

एसईओ तक, इस मामले में यह लागू नहीं होगा। यह कोड "सर्वर-टू-सर्वर" होगा, इसलिए बाहरी दुनिया ने कभी इसकी खोज की है तो मुझे परवाह नहीं है। वास्तव में, मुझे यह सुनिश्चित करना होगा कि यादृच्छिक पहुंच से बचने के लिए उचित सुरक्षा कदम उठाए जाएं। मुझे सिस्टम के किसी अन्य हिस्से के लिए जेएसओएन क्रमबद्धता करना पड़ा है (ऐसा लगता है कि ओबीजे की बड़ी सूचियों को पोस्ट करने की कोशिश करने वाला एक बग है, इसलिए मुझे स्ट्रिंग को क्रमबद्ध करना पड़ा), इसलिए यह इस मामले में बहुत अधिक नहीं होगा । – sig606

+1

मुझे उम्मीद है कि आपके पास पहले से ही जवाब हैं तो आप सवाल क्यों पूछ रहे हैं? – VJAI

39

मुझे बस एक RESTfull एपीआई लागू करना पड़ा जहां मुझे पैरामीटर पास करने की आवश्यकता है। मैं के रूप में मार्क का पहला उदाहरण द्वारा वर्णित एक ही शैली में क्वेरी स्ट्रिंग में पैरामीटर प्रदान करने के द्वारा ऐसा किया "API/नियंत्रक? शुरू = DATE1 & अंत = DATE2"

नियंत्रक मैं URL split in C#?

से एक टिप इस्तेमाल किया
// uri: /api/courses 
public IEnumerable<Course> Get() 
{ 
    NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query); 
    var system = nvc["System"]; 
    // BL comes here 
    return _courses; 
} 

मेरे मामले में मैं अजाक्स के माध्यम से WebAPI बुला रहा था की तरह लग रही:

$.ajax({ 
     url: '/api/DbMetaData', 
     type: 'GET', 
     data: { system : 'My System', 
       searchString: '123' }, 
     dataType: 'json', 
     success: function (data) { 
        $.each(data, function (index, v) { 
        alert(index + ': ' + v.name); 
        }); 
     }, 
     statusCode: { 
        404: function() { 
         alert('Failed'); 
         } 
     } 
    }); 

मुझे आशा है कि इस मदद करता है ...

+2

मुझे लगता है कि आप WebApi का उपयोग नहीं कर रहे हैं क्योंकि पैरामीटर बाइंडिंग आपके एपीआई विधि पैरामीटर को स्वचालित रूप से आपके क्वेरीस्ट्रिंग को मैप करेगा ... – emp

+1

हां, एक बेहतर तरीका उपयोग और विशेषता [रूट ("एपीआई/डीबीएमटाडेटा/{सिस्टम}/{ searchString} ")] और फिर गेट (स्ट्रिंग सिस्टम, स्ट्रिंग सर्चस्ट्रिंग) में पैरामीटर जोड़ें और फिर" ... एपीआई/डीबीएमटाडेटा/माइस्सिस्टम/mysearchstring " –

+0

के साथ कॉल करें मैंने अपने सी # एमवीसी वेबएपी में अपना उदाहरण इस्तेमाल किया और यह ठीक काम किया । उदाहरण के लिए +1 – Si8

46

बस एक जोड़ने WebApiConfig प्रविष्टियों के लिए नया मार्ग।

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

public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { .. 

ऐड:

config.Routes.MapHttpRoute(
    name: "GetPagedData", 
    routeTemplate: "api/{controller}/{pageNumber}/{pageSize}" 
); 

फिर मापदंडों HTTP कॉल करने के लिए जोड़ें:

GET //<service address>/Api/Data/2/10 
+5

यह एकमात्र उत्तर लगता है जो सभी भागों को सूचीबद्ध करता है। मेरी इच्छा है कि किसी ने बेहतर तरीके से वर्णन किया है कि 'एपीआई/नियंत्रक? Start = date1 और end = date2' शैली URI का उपयोग कैसे करें। –

+0

@ हॉट लिक्स एंड्रयू वेरिगा का उत्तर क्वेरी स्ट्रिंग तर्कों के साथ अच्छी तरह से काम करता है। अनिवार्य रूप से, आप क्वेरी स्ट्रिंग नामों को वर्ग गुणों से जोड़ते हैं और उन्हें अपनी विधि में पास करते हैं। आपकी विधि [FromUri] विशेषता के साथ चिह्नित एक एकल श्रेणी तर्क लेगी और आपके गुण स्ट्रिंग तर्कों को इसके गुणों के रूप में रखेगी। –

+0

ग्रेट सामान। धन्यवाद! –

33

मैं http://habrahabr.ru/post/164945/

पर exellent समाधान नहीं मिला
public class ResourceQuery 
{ 
    public string Param1 { get; set; } 
    public int OptionalParam2 { get; set; } 
} 

public class SampleResourceController : ApiController 
{ 
    public SampleResourceModel Get([FromUri] ResourceQuery query) 
    { 
     // action 
    } 
} 
+3

यहां सुराग [FromUri] – tranceporter

+2

है हालांकि लेख रूसी में है, @tranceporter सही है। "FromUri" यूआरएल से पैरामीटर प्राप्त करने के लिए एक शानदार तरीका की तरह दिखता है। एक अन्य आलेख जो उपयोगी हो सकता है: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api – Greg

+0

यही वह है जो मैं किया गया है थोड़ी देर के लिए कर रहे हैं और यह बहुत अच्छा काम किया है! मैं इस समाधान की भी सिफारिश करता हूं। –

101

मुझे लगता है कि सबसे आसान तरीका है बस AttributeRouting उपयोग करने के लिए है।

यह आपके नियंत्रक के भीतर स्पष्ट है, आप इसे अपने वैश्विक WebApiConfig फ़ाइल में क्यों चाहेंगे?

उदाहरण:

[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")] 
    public string Get(int paramOne, int paramTwo) 
    { 
     return "The [Route] with multiple params worked"; 
    } 

{} नाम अपने मापदंडों से मेल करने की जरूरत है।

इसके रूप में सरल, अब आपके पास एक अलग GET है जो इस उदाहरण में एकाधिक पैरा को संभालता है।

+11

यह बहुत अच्छा है। अधिकांश लोग 'WebApiConfig' फ़ाइल में मार्ग स्थापित करने की सलाह देते हैं, लेकिन यह वास्तव में अच्छा है। – rhyek

+3

वास्तव में, हम (अधिकांश लोग) आपकी कॉन्फ़िगरेशन के लिए केंद्रीकृत प्रबंधन क्षेत्र रखने की अनुशंसा करते हैं। वेब एपीआई (माइक्रोसॉफ्ट या अन्यथा) के मामले में, आरईएसटी के लिए केंद्रीकृत पैटर्न महत्वपूर्ण हैं। विशेषता रूटिंग प्यारा है, लेकिन यह एक-ऑफ अपवादों को बहुत मोहक बनाता है। –

+1

सहमत हैं, मुझे वास्तव में मेरा जवाब अपडेट करने की आवश्यकता है। जीईटी के साथ कई पैरामीटर करने का एक बेहतर तरीका है।जब मैं वेबएपीआई के लिए नया था, तब मैंने इसे पोस्ट किया, अब मैं एट्रिब्यूट रूटिंग का उपयोग नहीं करता (जब तक कि मैं सिर्फ एक नया कंट्रोलर नहीं बनाना चाहता), और क्वेरी पैरास्ट्रिंग में सभी पैरामीटर्स को पास कर दें, वे स्वचालित रूप से मैप करते हैं। जब मुझे मौका मिलता है तो अपडेट हो रहा है ताकि लोग इस पुरानी विधि का उपयोग न करें –