2013-09-01 8 views
6

के लिए प्ले फ्रेमवर्क 2.1 के साथ रीस्टफुल वेब सेवाओं तक पहुंचने के लिए मैं इस प्रश्न में उपयोग की जाने वाली कई अवधारणाओं और तकनीकों के लिए बिल्कुल नया हूं इसलिए मैं समुदाय से शुरुआत करने के लिए थोड़ी समझ और सहायता की सराहना करता हूं। मैं Play Framework संस्करण 2.1.3 का उपयोग कर रहा हूं और मुझे एक विश्वसनीय वेब सेवा में डेटा पोस्ट करने की आवश्यकता है ताकि इसे दूरस्थ डेटाबेस में डाला जा सके। एक एक्सएमएल प्रतिक्रिया वापस या वापस सफलता या विफलता का संकेत दिया जाएगा।कैसे करें: शुरुआती

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

मेरा पहला प्रश्न होना चाहिए, क्या वेब सेवाओं तक पहुंचने के लिए एक अनुशंसित डिज़ाइन पैटर्न है? फिर, प्ले एमवीसी फ्रेमवर्क पर विचार करते हुए, इस तरह के डिज़ाइन पैटर्न को सर्वोत्तम तरीके से कैसे कार्यान्वित किया जाएगा, डेटा पैकेज करें (मान लें कि एप्लिकेशन पहले से ही कब्जा कर लिया गया है और उपयोगकर्ता से डेटा मान्य है), इसे भेज दें और प्रतिक्रियाओं को उपयोगकर्ता को वापस संसाधित करें?

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

+0

इस पोस्ट में बहुत समान है, हालांकि नहीं एक सीधे ऊपर नकल मेरा मानना ​​है कि: http://stackoverflow.com/questions/4379485/restful-on-play-framework - के साथ इस गठबंधन नाटक! ToDo सूची उदाहरण और आपको एक ठोस प्रारंभिक बिंदु देना चाहिए। – pfairbairn

+0

प्रतिक्रिया के लिए धन्यवाद, क्योंकि 2010 में सवाल पूछा गया था, मुझे लगता है कि यह फ्रेमवर्क संस्करण 1 खेलने का जिक्र कर रहा है क्योंकि प्ले 2 केवल 2012 में रिलीज़ हुआ था। वे किसी भी तरह से नहीं हैं। हालांकि मैं गलत हो सकता हूं और पोस्ट को दोबारा जांच दूंगा। मैं यहां भी सर्वोत्तम प्रथाओं पर अधिक ध्यान केंद्रित कर रहा हूं। – Hegemon

+0

फेयर प्वाइंट, हालांकि जावा प्ले 2.1 टूडो सूची के साथ पोस्ट को संदर्भित करने के लिए क्रॉस रेफरेंस, http://www.playframework.com/documentation/2.1.x/JavaTodoList, रूटिंग, जानकारी और HTTP अनुरोधों के लिए PUT का उपयोग करते हुए रूटिंग पर जानकारी होगी यह सुनिश्चित करें कि SO पोस्ट अभी भी उपयोगी प्रतीत होता है, भले ही यह कुछ हद तक दिनांकित हो। – pfairbairn

उत्तर

11

अनुरोध बनाना सीधे आगे है। सबसे पहले आप एक यूआरएल प्रदान करते हैं। अनुरोध के लिए सामग्री प्रकार, क्वेरी पैरामीटर, टाइमआउट इत्यादि जोड़ने के लिए कई विधियां हैं। फिर आप एक अनुरोध प्रकार चुनते हैं और वैकल्पिक रूप से भेजने के लिए कुछ सामग्री जोड़ते हैं। उदाहरण:

WSRequestHolder request = WS.url("http://example.com"); 
request.setQueryParameter("page", "1"); 
Promise<Response> promise = request.get(); 
Promise<Response> promise = WS.url("http://example.com").post(content); 

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

Futures and Promises का उपयोग करके अवरुद्ध करने से बचाता है। नियंत्रक की async विधि Promise<Result> लेती है और कुछ बिंदु बाद परिणाम (भविष्य मूल्य) देता है। उपयोग करने के लिए एक सरल वचन get और ऊपर दिखाए गए post विधियों द्वारा प्रदान किया जाता है। आपको उनके कार्यान्वयन की परवाह करने की आवश्यकता नहीं है, आपको केवल यह जानने की आवश्यकता है कि अनुरोध पूरा होने के बाद वे Response प्रदान करने का वादा करते हैं।

सूचना समस्या यहाँ: जब WS.url("...").get() के साथ एक अनुरोध बनाने यह आप एक Promise<Response> भले ही async एक Promise<Result> लेता है दे देंगे। यहां आपको अपने आप को एक और वादा लागू करना होगा, जो map विधि का उपयोग करके परिणाम को प्रतिक्रिया में परिवर्तित कर देगा। यदि आप Play दस्तावेज़ का पालन करते हैं, तो यह थोड़ा उलझन में दिखाई देगा, क्योंकि जावा में बंद नहीं है (अभी तक) और सब कुछ कक्षा में लपेटा जाना है। हालांकि आपको विधि कॉल के अंदर अनाम कक्षाओं का उपयोग करने की आवश्यकता नहीं है। आप और अधिक स्वच्छ कोड चाहें, तो आप भी इसे इस तरह कर सकते हैं:

return async( 
    request     
    .get()     // returns a `Promise<Response>` 
    .map(resultFromResponse) // map takes a `Function<Response, Result>` and 
          // returns the `Promise<Result>` we need 
); 

वस्तु resultFromResponse की तरह लग रहे हो सकता है इस प्रकार है।यह वास्तव में किसी प्रकार की कॉलबैक विधि की बोझिल परिभाषा की तरह है जो Response को केवल तर्क के रूप में लेता है और Result देता है।

Function<Response, List<T>> resultFromResponse = 
    new Function<Response /* 1st parameter type */, Result /* return type */>() { 
     @Override 
     public Result apply(Response response) { 
      // example: read some json from the response 
      String message = response.asJson().get("message"); 
      Result result = ok(message); 
      return result; 
     } 
    }; 

@itsjeyd के रूप में टिप्पणी, जब calling webservices in Play 2.2.x आप किसी भी अधिक async में कॉल रैप नहीं में बताया। आप बस लौट Promise<Result>:

public static Promise<Result> index() { 
    return request.get().map(resultFromResponse); 
} 
+1

गहराई से प्रतिक्रिया के लिए धन्यवाद, हालांकि इनमें से अधिकांश Play साइट पर उपलब्ध है, आप भ्रम के आवंटन को साफ़ करने में कामयाब रहे हैं। मुझे इसे एक मौका और देना होगा। एक महान उत्तर के लिए – Hegemon

+1

+1। @ हेगमन क्योंकि आप इसे "प्रकार का ज्ञान आधार" बनना चाहते थे, मैं इसे खेल के रूप में जोड़ना चाहता हूं! 2.2.x, 'async' के माध्यम से परिणाम 'वापस कर दिया गया है; अन्य वेब सेवाओं पर कॉल करने वाले कार्यों को इसके बजाय 'वचन ' वापस करना चाहिए। इसे 'वापसी' कथन को 'वापसी अनुरोध.get() पर बदलकर हासिल किया जा सकता है। नक्शा (परिणामप्रोमस्पॉन्स); '। – itsjeyd

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