2012-07-13 14 views
17

मैं Setting HTTP headers in Play 2.0 (scala)? कि आप प्रतिक्रिया हेडर एक मामला-दर-मामला आधार पर करने से, उदाहरण के लिए सेट कर सकते हैं, Ok("hello").withHeaders(PRAGMA -> "no-cache") से अवगत हूँ।प्ले 2 - सभी प्रतिक्रियाओं पर हेडर सेट करें?

क्या आपको लगता है कि शीर्ष, या कुछ अलग हेडर, अपने सभी कार्यों से प्रतिक्रियाओं पर सेट करना चाहते हैं? आप हर जगह withHeaders दोहराना नहीं चाहेंगे। और क्योंकि यह अधिक एक आवेदन चौड़ा विन्यास की तरह है, आप कार्रवाई लेखकों एक अलग सिंटैक्स का उपयोग करने के लिए अपने शीर्ष लेख प्राप्त करने के लिए नहीं चाहते हो सकता है (उदाहरण के लिए OkWithHeaders(...))

क्या मैं अब एक आधार नियंत्रक वर्ग कि

की तरह लग रहा है
class ContextController extends Controller { 
... 
def Ok(h: Html) = Results.Ok(h).withHeaders(PRAGMA -> "no-cache") 
} 

लेकिन जो पूरी तरह ठीक महसूस नहीं करता है। ऐसा लगता है कि डिफ़ॉल्ट हेडर को परिभाषित करने और उन्हें प्रत्येक प्रतिक्रिया में जोड़ने के लिए एओपी-स्टाइल तरीका होना चाहिए।

+1

ध्यान दें कि PRAGMA -> कोई कैश शायद जिस तरह से आप चाहते हैं काम नहीं करेगा। इस लिंक देखें: http://www.mnot.net/cache_docs/ आप शायद PRAGMA – andrewf

+0

'CACHE_CONTROL के बजाय CACHE_CONTROL उपयोग करना चाहते हैं ->" अधिकतम उम्र = 0 "' यह करना चाहिए। – andrewf

उत्तर

8

अपने Global.scala में, एक कार्रवाई में हर कॉल लपेट:

import play.api._ 
import play.api.mvc._ 
import play.api.Play.current 
import play.api.http.HeaderNames._ 

object Global extends GlobalSettings { 

    def NoCache[A](action: Action[A]): Action[A] = Action(action.parser) { request => 
    action(request) match { 
     case s: SimpleResult[_] => s.withHeaders(PRAGMA -> "no-cache") 
     case result => result 
    } 
    } 

    override def onRouteRequest(request: RequestHeader): Option[Handler] = { 
    if (Play.isDev) { 
     super.onRouteRequest(request).map { 
     case action: Action[_] => NoCache(action) 
     case other => other 
     } 
    } else { 
     super.onRouteRequest(request) 
    } 
    } 

} 

इस मामले में, मैं सिर्फ देव मोड, जो नहीं-कैश अनुदेश के लिए सबसे फ़ायदेमंद में कार्रवाई कहते हैं।

+0

लवली, धन्यवाद! मैं एक समान समाधान पर ठोकर खाऊंगा, लेकिन पैरामीटर के प्रकार SimpleResult से मेल खाने में समस्याएं आईंजर के बारे में संकलक चेतावनियों के बिना। साथ ही, कैगिंग के लिए उपयोग करने वाली गलत चीज़ के रूप में PRAGMA के बारे में मेरी टिप्पणी ऊपर दी गई है। – andrewf

+0

यह मेरे लिए अच्छी प्रतिक्रिया की तरह दिखता है! – gimix

+0

@MariusSoutier - मैं समाधान आप सुझाव कोशिश की, लेकिन रनटाइम पर, मैं हमेशा मिलता _ "अन्य" _ और नहीं एक 'Action' मैं करने के लिए शीर्ष लेख जोड़ने के लिए उपयोग कर सकते हैं। रनटाइम पर _ "अन्य" _ का प्रकार है: 'play.core.Router $ रूट्स $$ anon $ 4' इस बारे में कोई विचार है कि मैं इससे कैसे निपट सकता हूं? –

0

बहुत सारे तरीके हैं। आप action-composition का उपयोग कर सकते हैं। फिर आपको प्रत्येक नियंत्रक पर घोषित करना होगा जिसे आप शीर्षलेख पर सेट करना चाहते हैं। एक और विकल्प GlobalSettings का उपयोग करना है। जावा के लिए भी इसी तरह के समाधान हैं।

+0

मुझे नहीं लगता कि आप ग्लोबलसेटिंग में यह कहां कर सकते हैं, क्या आप अधिक विशिष्ट हो सकते हैं? ऐसा लगता है कि आपके जैसे ही अनुरोध में हुक है, प्रतिक्रिया नहीं। –

+0

ठीक है आप अपने आप के साथ सामान्य कार्रवाई को लपेट सकते हैं। तब मुझे लगता है कि आपके पास परिणाम-वस्तु तक पहुंच है और वहां आप इसे कर सकते हैं। सिर्फ एक विचार है, क्योंकि मैं जावा के साथ काम कर रहा हूं। वहां आपके पास संदर्भ है जिसमें प्रतिलिपि है। – niels

2

कुशल नियंत्रण प्राप्त करने के लिए सबसे आसान तरीका है लिपटे कार्यों का उपयोग कर रही है। आपके मामले में यह ऐसा ही कुछ हो सकता है:

object HeaderWriter { 
    def apply(f: Request[AnyContent] => SimpleResult):Action[AnyContent] = { 
     Action { request => 
      f(request).withHeaders(PRAGMA -> "no-cache") 
     } 
    } 
} 

और ऐसे ढंग से इसका इस्तेमाल करते हैं:

def doAction = HeaderWriter { request => 
    ... do any stuff your want ... 
    Ok("Thats it!") 
} 
14

विषय अब काफी पुराना है, लेकिन खेलने के 2.1 के साथ यह अब भी सरल है। आपका Global.scala वर्ग इस तरह दिखना चाहिए:

import play.api._ 
import play.api.mvc._ 
import play.api.http.HeaderNames._ 

/** 
* Global application settings. 
*/ 
object Global extends GlobalSettings { 

    /** 
    * Global action composition. 
    */ 
    override def doFilter(action: EssentialAction): EssentialAction = EssentialAction { request => 
    action.apply(request).map(_.withHeaders(
     PRAGMA -> "no-cache" 
    )) 
    } 
} 
संबंधित मुद्दे