2012-07-07 16 views
6

मैं स्कैला 2.0.2 प्ले फ्रेमवर्क का उपयोग कर एक वेब एपीआई लागू कर रहा हूं। मैं कई प्राप्त पैरामीटर निकालने और मान्य करना चाहता हूं। और इसके लिए मैं एक खेल "फॉर्म" का उपयोग कर रहा हूं जो मुझे वैकल्पिक फ़ील्ड को परिभाषित करने की अनुमति देता है।प्ले फ्रेमवर्क फॉर्म में डिफ़ॉल्ट मान वैकल्पिक फ़ील्ड को कैसे परिभाषित करें?

समस्या: उन वैकल्पिक फ़ील्ड के लिए, पैरामीटर पास नहीं होने पर मुझे डिफ़ॉल्ट मान को परिभाषित करने की आवश्यकता है। कोड सही तरीके से इन तीन उपयोग के मामलों को पार्स करने का इरादा है?

  • /परीक्षण शीर्ष = एबीसी (त्रुटि, एबीसी एक पूर्णांक नहीं है)
  • /परीक्षण शीर्ष = 123 (वैध, शीर्ष 123 है)
  • /परीक्षण (वैध, शीर्ष है 42 (डिफ़ॉल्ट मान))

मैं निम्नलिखित कोड के साथ आए हैं:

def test = Action { 
    implicit request => 

    case class CData(top:Int) 

    val p = Form(
    mapping(
     "top" -> optional(number) 
    )((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top))) 
).bindFromRequest() 

    Ok("all done.") 
} 

कोड काम करता है, लेकिन यह निश्चित रूप से सुरुचिपूर्ण नहीं है। लापता अनुरोध पैरामीटर के लिए डिफ़ॉल्ट मान सेट अप करने के लिए बहुत सारी बॉयलर प्लेट चल रही है।

क्या कोई क्लीनर और अधिक संयोग समाधान सुझा सकता है?

उत्तर

8

क्वेरी स्ट्रिंग पैरामीटर को सत्यापित करने के लिए यह राउटर नौकरी है। बस routes फ़ाइल में अपने पैरामीटर को परिभाषित:

GET /test controllers.Application.test(top: Int ?= 42) 

और अपने नियंत्रक विधि को पैरामीटर के रूप top जोड़ें:

def test(top: Int) = Action { 
    // Use top here 
    val data = CData(top) 
} 

फिर, Play आप के लिए सभी को मान्य करते हैं। ध्यान दें कि ?= सिंटैक्स का उपयोग करके निर्दिष्ट डिफ़ॉल्ट मान कैसे निर्दिष्ट किया गया है।

आपको केवल POST अनुरोधों के लिए फॉर्म का उपयोग करना चाहिए।

अद्यतन:

आप मैन्युअल रूप से मानकों की जांच करना चाहते हैं, तो आप सहायक विधि निर्धारित कर सकते हैं:

def getQueryParam(key: String, default: String)(implicit request: RequestHeader) = 
    request.queryString.get(key).flatMap(_.headOption).getOrElse(default) 

और अपने नियंत्रक तरीकों के अंदर इसका इस्तेमाल:

def test = Action { implicit request => 
    val top = getQueryParam("top", "42") 
    ... 

लेकिन ऐसा करके आप प्रकार की जांच खो देते हैं। बेशक आप प्रत्येक प्रकार के लिए हेल्पर्स को परिभाषित कर सकते हैं, यानी getIntParam, getStringParam और इसी तरह, लेकिन प्ले में पहले से ही सुरक्षित राउटर कार्यान्वयन है, जो इस तरह की समस्याओं को हल करने के लिए डिज़ाइन किया गया है। मैं आपको मैन्युअल जांच के बजाय रूटिंग तंत्र का उपयोग करने की सलाह देता हूं।

+0

यह प्रस्तावित समाधान अच्छी तरह से काम करता है। दुर्भाग्यवश इस समाधान का एकमात्र नकारात्मक पक्ष यह है कि यह बड़ी संख्या में डिफ़ॉल्ट मानकों के साथ अच्छी तरह से स्केल नहीं करता है। जब आप एक वेब सेवा/वेब ऐप बनाते हैं जिसे लिस्टिंग फ़िल्टरिंग का समर्थन करना चाहिए, तो रूट में सभी डिफ़ॉल्ट पैराम को उजागर करने से कोड की पठनीयता और मजबूती कम हो सकती है।अन्य सभी परिदृश्य में यह वास्तव में है पसंदीदा समाधान – natbusa

+1

उत्तर एक सहायक विधि कार्यान्वयन जो आपके लिए उपयोगी हो सकता है के साथ अद्यतन किया है। – lambdas

+1

मैंने डिफ़ॉल्ट पैरामीटर के बारे में अधिक कोड संचालित दृष्टिकोण प्रोग्राम करने के लिए, प्ले फ्रेमवर्क के लिए एक विस्तार का प्रस्ताव दिया है। Https://github.com/playframework/Play20/pull/381 देखें – natbusa

12

प्ले 2,1

 
val p = Form(
    mapping(
     "top" -> default(number,42) 
    )(CData.apply)(CData.unapply) 
).bindFromRequest() 

में आप क्या चाहते हैं नहीं होगा।