2013-02-13 49 views
13

वर्तमान में मैं request से होस्ट प्राप्त करने में सक्षम हूं, जिसमें डोमेन और वैकल्पिक पोर्ट शामिल है। दुर्भाग्यवश, इसमें प्रोटोकॉल (http बनाम https) शामिल नहीं है, इसलिए मैं साइट पर पूर्ण यूआरएल नहीं बना सकता।प्ले फ्रेमवर्क 2.1: स्कैला: संपूर्ण बेस यूआरएल (प्रोटोकॉल समेत) कैसे प्राप्त करें?

object Application extends Controller { 
    def index = Action { request => 
    Ok(request.host + "/some/path") // Returns "localhost:9000/some/path" 
    } 
} 

क्या अनुरोध ऑब्जेक्ट से प्रोटोकॉल प्राप्त करने का कोई तरीका है?

+0

आपको पूर्ण लिंक की आवश्यकता क्यों है? (आपका उपयोग केस क्या है?) –

+4

कुछ उदाहरण जहां मुझे पूर्ण यूआरएल की आवश्यकता है: 1) एक जेसन एपीआई जो साइट पर अन्य यूआरएल (संपत्तियों से अन्य एपीआई एंट्री पॉइंट इत्यादि) तक पथ लौटाती है। 2) उपयोगकर्ताओं को ईमेल भेजना। 3) बाहरी साइटों पर यूआरएल साझा करना (एपीआईएस आदि पर पोस्ट करना) –

+0

अधिक उपयोग के मामले: 'sitemap.xml' और' rss.xml' उत्पन्न करना। – mjswensen

उत्तर

3

दरअसल आपका पोर्टनंबर आपको http या https होने पर देगा।

अपने प्ले सर्वर प्रारंभ करें

https समर्थन के साथ JAVA_OPTS=-Dhttps.port=9001 play start

कोड स्निपेट है (आप एक regex के साथ सत्यापन और अधिक स्थिर बना सकते हैं, गुणों से https पोर्ट नंबर ले ...)

def path = Action { request => 
    val path = 
     if(request.host.contains(":9000")) 
     "http://" + request.host + "/some/path" 
     else 
     "https://" + request.host + "/some/path" 
    Ok(path) 
    } 

कोड

http://ServerIp:9000/some/path if it's thru http 
https://ServerIp:9001/some/path if it's thru https 
4

मुझे नहीं लगता कि वहां है।

  • प्ले फ्रेमवर्क 2.0 ही https का समर्थन नहीं करता, देखें: play-framework [2.0] HTTPS
  • प्ले फ्रेमवर्क 2.0 की absoluteURL method of the Call वर्ग के कार्यान्वयन यह सुझाव नहीं है।

//domain.com/path का उपयोग कर protocol relative urls का उपयोग करने के लिए एक वर्कअराउंड है।

हालांकि यह ईमेल में लिंक के साथ आपकी सहायता नहीं करता है। उस स्थिति में आप प्रोटोकॉल को application.conf में डाल सकते हैं। ज्यादातर मामलों में अंतर बनाया जाता है क्योंकि उत्पादन https का समर्थन करता है और विकास नहीं करता है।

मुझे अभी तक ऐसी स्थिति नहीं मिली है जहां उपरोक्त कामकाज काम नहीं करते हैं।

+2

हालांकि 2.1 खेलें https का समर्थन करता है भले ही यह उचित दस्तावेज नहीं है और अनुशंसित तरीका एक फ्रंटिंग https सर्वर होना है। – Farmor

+0

हां, कॉन्फ़िगरेशन पैरामीटर जोड़ना काम करेगा, लेकिन चूंकि यह अन्य भाषाओं में कुछ आसान है, इसलिए मुझे लगता है कि यह Play के साथ आसान होगा! –

0

मेरा समाधान जावास्क्रिप्ट से अतिरिक्त पैरामीटर के रूप में यूआरएल की शुरुआत को पास करना था। application.conf समाधान मेरे लिए काम नहीं करता है, क्योंकि एक ही एप्लिकेशन http और https पर उपलब्ध है लेकिन विभिन्न सबनेट और डोमेन से।

9

दरअसल कॉल क्लास का उपयोग करके ऐसा करने का एक आसान तरीका है जो समान चीजों को प्राप्त करने के लिए राउटर राउटर का उपयोग करता है। को देखते हुए आप अंतर्निहित अनुरोध के दायरे के भीतर हैं, आप कुछ इस तरह कर सकते हैं:

new Call(request.method, input.request).absoluteURL() 

और यह पूर्ण url (प्रोटोकॉल, होस्ट, मार्ग और पैरामीटर) के साथ प्रदान करेगा।

+1

दिलचस्प है, लेकिन मेरे लिए काफी काम नहीं किया; यह https के बजाय http लौटा; बाकी सही था। –