2011-11-17 7 views
5

मुझे यह कहीं भी नहीं मिला - क्या मैं खेल सकता हूं! कि HTTP POST के माध्यम से एक विशिष्ट नियंत्रक विधि (केवल) का उपयोग किया जाना चाहिए?क्या मैं एनोटेशन का उपयोग करके प्ले में POST के रूप में नियंत्रक विधि को चिह्नित कर सकता हूं?

सी # के एएसपी.नेट एमवीसी में HttpPost attribute की तरह कुछ?

public class MyController extends Controller { 

    @Post 
    public void addPerson(String name, String address) { 
    } 
} 

अद्यतन - मैं क्या एक पोस्ट मार्ग को जोड़ने के समझ में नहीं आता है:

  1. एक पोस्ट अनुरोध इस तरह के एक मार्ग को जोड़ने के बिना काम करेंगे।
  2. क्योंकि विधि अभी भी "सभी को पकड़ें" जीईटी नियम द्वारा पकड़ा गया है, यहां तक ​​कि पोस्ट रूट जोड़ने से इस विधि को अनुरोध प्राप्त नहीं होगा।
+0

यदि आप अपनी विधि को केवल POST के माध्यम से एक्सेस करना चाहते हैं तो आपको * सभी को पकड़ने की आवश्यकता है। उस पकड़ को सभी को केवल विकास के लिए इस्तेमाल किया जाना चाहिए। यह आपको यह देखने में भी मदद करता है कि आप क्या उजागर कर रहे हैं! – mericano1

+0

@ mericano1 - कॉन्फ़िगरेशन मुहावरे पर सम्मेलन का पालन करने के लिए पकड़ बहुत अच्छा है, मुझे नहीं लगता कि यह उत्पादन के लिए बुरा है (अन्यथा मैं केवल नियंत्रकों/कार्यों की सूचियों को डुप्लिकेट करूंगा ... अधिक रखरखाव)। मुझे लगता है कि मैं एक फीचर अनुरोध जमा करूंगा। – ripper234

+0

एक टिकट पोस्ट किया गया: https://play.lighthouseapp.com/projects/57987-play-framework/tickets/1260-ability-to-mark-controller-methods-as-post-by-annotation – ripper234

उत्तर

1

आप इसे इस तरह से कर सकता है:

public static void onlyPost() { 
    if (request.method.equals("POST")) { 
    // ... Do stuff 
    render(); 
    } 
    else 
    forbidden(); 
} 

लेकिन ध्यान रखें कि आपके कोड और अपने मार्गों फ़ाइल सिंक्रनाइज़ेशन से बाहर हो सकता है में रहते हैं।

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

# Catch all 
#{if play.mode.isDev()} 
* /{controller}/{action}  {controller}.{action} 
#{/if} 
+0

मार्गों में ग्रोवी के बारे में कूल - लेकिन यह बिंदु के अलावा - मुझे प्रोड में काम करने के लिए कोड की आवश्यकता है, सिर्फ देव नहीं। – ripper234

+0

मैं आपका जवाब स्वीकार करूंगा क्योंकि यह मेरी सबसे अच्छी चीज है जो मैं चाहता था - लेकिन कृपया एक टिप्पणी के साथ इसे चिह्नित करने के बारे में मैंने जो मुद्दा खोला - देखें https://play.lighthouseapp.com/projects/57987-play-framework/ टिकट/1260-क्षमता-टू-मार्क-कंट्रोलर-विधियों के साथ-साथ-एनोटेशन – ripper234

+0

उपरोक्त ग्रोवी कोड प्रोड में सभी को पकड़ अक्षम करता है, यह @ mericano1 का सुझाव देता है। लेकिन देखते हैं कि वे आपका टिकट स्वीकार करते हैं या नहीं। जब कोई गलत विधि के साथ आपकी कार्रवाई का उपयोग करता है तो आप किस HTTP प्रतिक्रिया की अपेक्षा करते हैं? –

2

आप मार्गों फ़ाइल में ऐसा करते हैं:

POST /person/add MyController.addPerson 

इस here के बारे में अधिक प्रलेखन है।

+0

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

+0

मेरा अद्यतन प्रश्न देखें। – ripper234

2

मैं पार्टी के लिए थोड़ा देर हो चुकी हूं। वहाँ एनोटेशन, में बनाया नहीं है afaik लेकिन आप काफी आसानी से एक अपने आप को लिख सकते हैं:

एनोटेशन/HttpMethod.java

/** 
* Add this annotation to your controller actions to force a get/post request. 
* This is checked in globals.java, so ensure you also have @With(Global.class) 
* in your controller 
*/ 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface HttpMethod{ 
    String method() default "POST"; 
} 

नियंत्रकों/Global.java

/** 
* All the funky global stuff ... 
*/ 
public class Global extends Controller{ 

    @Before 
    public static void before(){ 
     if(getActionAnnotation(HttpMethod.class) != null){ 
      HttpMethod method = getActionAnnotation(HttpMethod.class); 
      if(!method.method().equals(request.method)){ 
       error("Don't be evil! "); 
      } 
     } 
    } 
} 

उपयोग: नियंत्रकों /Admin.java

@With({Global.class, Secure.class}) 
public class Admin extends Controller { 
    @HttpMethod(method="POST") 
    public static void save(MyModel model){ 
     // yey... 
    } 
} 
संबंधित मुद्दे

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