2009-05-19 15 views
5

बस वेब सेवा इंटरफ़ेस डिज़ाइन के संबंध में सर्वोत्तम प्रथाओं पर कुछ प्रतिक्रिया ढूंढ रहे हैं।वेब सेवा इंटरफ़ेस - जटिलता पैरामीटर के रूप में टाइप करें?

मैं दो विकल्प हैं:

विकल्प 1

public string GetSomeData(SomeCriteriaClass criteria); 

जहां SomeCriteriaClass के रूप में परिभाषित किया गया है:

public int ID; 
public string Name; 
public string Property2; etc. 

विकल्प 2

public string GetSomeData(int id, string name, string property2) 

पसंदीदा विकल्प कौन सा है? यह डिजाइन पैटर्न के संघर्ष की तरह लगता है - 1 कक्षा में पैरामीटर लपेटना है, लेकिन दूसरा वेब सेवा इंटरफेस को लचीला और खुला रख रहा है।

दूसरा सवाल यह है कि - यदि हम विकल्प 1 चुनते हैं - आप इसे यूआरएल के माध्यम से कैसे कहते हैं?

धन्यवाद

+0

आप विकल्प 2 क्यों कहते हैं "वेब सेवा इंटरफ़ेस को लचीला और खुला रखना" है? इसका मतलब है कि डेटा पैरामीटर में कोई भी परिवर्तन एपीआई की घोषणा को प्रभावित करेगा, जबकि विकल्प 1 में यह केवल "पैरामीटर क्लास" घोषणा (और कॉलिंग कोड) को प्रभावित करेगा। –

+0

क्षमा करें, यह बिल्कुल सही है, लचीले और खुले के बजाय, जिसे "दृश्यमान और सीधा-आगे" पढ़ना चाहिए था। मुझे यकीन नहीं है कि आप एक यूआरएल के माध्यम से एक जटिल प्रकार में गुजरने वाली वेब सेवा को कैसे कॉल करेंगे - जिससे मुझे थोड़ा प्रभावित हुआ है। क्या कमियां हैं, क्या इससे अधिक जटिल हो जाता है? – Duncan

उत्तर

2

आप मुश्किल तरीके से जाने के लिए और विकल्प # 1 लागू कर सकते हैं, साबुन का उपयोग कर। एसओएपी के साथ आप जटिल डेटा प्रकार परिभाषित कर सकते हैं। दूसरी ओर, आप इसे "हैक" तरीके से विकल्प # 2 में कर सकते हैं, आरईएसटी का उपयोग करके और यूआरएल या HTTP पोस्ट संदेश में पैरामीटर को एन्कोड कर सकते हैं।

2

शब्द "वेब सेवा" अक्सर दो अलग-अलग चीजों के लिए उपयोग किया जाता है।

  • एक प्रौद्योगिकी: interprocess संचार के लिए एक प्रोटोकॉल के रूप में HTTP (एस) का उपयोग करते हुए।

  • एक वास्तुशिल्प दृष्टिकोण: सेवा उन्मुख वास्तुकला।

हम वेब सेवा के बारे में बात कर रहे हैं के रूप में तो सिर्फ एक प्रौद्योगिकी आप विकल्पों में से एक बहुत कुछ है: आप HTTP GET उपयोग कर सकते हैं या HTTP POST (यह URL पैरामीटर का उपयोग कर एक है) (डेटा में है HTTP संदेश का शरीर)। HTTP पोस्ट के लिए पेलोड एसओएपी या सिर्फ किसी भी मालिकाना सामान हो सकता है।

यदि हम एक उपकरण के रूप में सेवा उन्मुख दृष्टिकोण और वेब सेवाओं के बारे में बात कर रहे हैं तो HTTP + SOAP जाने का सबसे मानक तरीका है।

public FooResponse FooOperation(FooRequest request); 

इसका मतलब है कि एक ऑपरेशन के लिए एक अनुरोध और एक प्रतिक्रिया दस्तावेज़ है (भले ही:

अगर हम एक वेब सेवा विधि सिर्फ एक सेवा आपरेशन के एक कार्यान्वयन पर विचार तो हस्ताक्षर जो नीचे इस दृष्टिकोण पर बल का उपयोग इनमें से कोई भी खाली है) और आप सेवा अनुबंध (आप किस परिचालन का पर्दाफाश करते हैं) और डेटा अनुबंध (आप अनुरोध और प्रतिक्रिया संदेश कैसे लिखते हैं) को अलग कर सकते हैं। इसके बारे में अधिक जानकारी के लिए इस लेख देखें: Principles of Service Design Service Patterns and Anti-Patterns

निष्कर्ष:

  • आप एसओए के बारे में परवाह नहीं है तो बस तो विकल्प 2 स्पष्ट और सरल है HTTP के माध्यम से एक विधि आह्वान करने के लिए चाहते हैं।
  • लेकिन यदि आप एसओए सेवाओं का निर्माण कर रहे हैं तो "दस्तावेज़-केंद्रित" हस्ताक्षर का उपयोग करें। विकल्प 1 दोनों का मिश्रण है और इसकी अनुशंसा नहीं की जाती है।
+0

इसके लिए धन्यवाद, मैं निश्चित रूप से एसओए सर्वोत्तम प्रथाओं पर पढ़ूंगा। जब आप कहते हैं कि यह "अनुशंसित नहीं है" - यह अभी भी विशेष रूप से बुरा नहीं है, है ना? मुझे उस लिंक में कुछ भी दिखाई नहीं देता है जो इसे एंटी-पैटर्न के रूप में वर्णित करता है, उदाहरण के लिए। – Duncan

+0

विकल्प 1 विकल्प 2 जितना सरल नहीं है और दस्तावेज़-केंद्रित हस्ताक्षर के रूप में अनुशासित नहीं है, लेकिन इसमें कुछ भी बुरा नहीं है। – Vizu

1

विकल्प 1 सार्वजनिक स्ट्रिंग GetSomeData (SomeCriteriaClass मानदंड); webservice कारण को लागू करने का एक अच्छा तरीका है, आप यहां SOAP और दस्तावेज़-उन्मुख शब्द का उपयोग कर रहे हैं। और विकल्प 2 मूल जावा डेवलपर के लिए है जो डिजाइन पैटर्न पर ज्यादा ध्यान केंद्रित नहीं करते हैं।

के परिदृश्य लेते हैं - विकल्प 2 का उपयोग कर के बाद, आप तो SomeCriteriaClass.java में 3 अधिक varibale जोड़ने के लिए वान लगता है, किस तरह से आप का चयन करेंगे .. GetSomeData करने के लिए 3 अधिक पैरामीटर जोड़ने() विधि या SomeCriteriaClass.java में घोषणा करते हैं।

एक अच्छा डिज़ाइन-पैटर्न अनुयायी, GetComeData() में जोड़ने के लिए SomeCriteriaClass.java में घोषित करने का चयन करें।

+0

धन्यवाद। क्या आप मुझे एक उदाहरण दे सकते हैं कि आप URL1 के माध्यम से विकल्प 1 का उपयोग करके विधि कैसे कॉल करेंगे? – Duncan

संबंधित मुद्दे