2012-05-20 9 views
11

क्या अच्छा या पैरामीटर के आधार पर Play Framework में आउटपुट प्रस्तुत करने का उचित तरीका है? उदाहरण:रेंडर आउटपुट प्रारूप (एचटीएमएल, जेएसओएन, एक्सएमएल)?

एचटीएमएल के लिए:

http://localhost:9000/user/get/5?v=HTML // should render HTML template 

JSON के लिए:

http://localhost:9000/user/get/5?v=JSON // should render JSON template 

मुझे लगता है कि एक अनुरोध इंटरसेप्टर इस लक्ष्य को हासिल करने की क्षमता हो सकता है, लेकिन मैं कोई सुराग नहीं कैसे है शुरू करने या कहां से शुरू करें :-(

या शायद, एक सामान्यलिखेंजो अनुरोध के अनुसार पैरामीटर और आउटपुट पढ़ता है, लेकिन यह मुझे ओवरकिल की तरह लगता है?

public static Result userAsHtml(Long id) { 
    return ok(someView.render(User.find.byId(id))); 
} 

public static Result userAsJson(Long id) { 
    return play.libs.Json.toJson(User.find.byId(id)); 
} 

मार्गों:

उत्तर

20

तो /user/5?v=html और /user/5?v=json वापसी एक ही संसाधन के दो अभ्यावेदन, वे एक ही URL होना चाहिए, यह निर्धारित करने के लिए उपयोग कर सकते, जैसे REST principles के अनुसार /user/5

क्लाइंट साइड पर, आप यह संकेत देने के लिए Accept शीर्षलेख का उपयोग कर सकते हैं कि यह संकेत करने के लिए कि आप कौन सा प्रतिनिधित्व सर्वर भेजना चाहते हैं।

public static Result user(Long id) { 

    User user = User.find.byId(id); 
    if (user == null) { 
    return notFound(); 
    } 

    if (request().accepts("text/html")) { 
    return ok(views.html.user(user)); 
    } else if (request().accepts("application/json")) { 
    return ok(Json.toJson(user)); 
    } else { 
    return badRequest(); 
    } 
} 

ध्यान दें कि "text/html" के खिलाफ परीक्षण हमेशा क्योंकि ब्राउज़र किसी अन्य सामग्री प्रकार से पहले लिखा जाना चाहिए:

सर्वर साइड पर आप Accept हेडर के मूल्य का परीक्षण करने के प्ले 2.1 के साथ निम्न लिख सकते हैं उनके अनुरोधों के शीर्षलेख को */* पर सेट करें जो सभी प्रकार से मेल खाता है।

यदि आप प्रत्येक कार्रवाई में if (request().accepts(…)) लिखना नहीं चाहते हैं तो आप इसे कारक बना सकते हैं, उदा। जैसे निम्नलिखित:

public static Result user(Long id) { 
    User user = User.find.byId(id); 
    return representation(user, views.html.user.ref); 
} 

public static Result users() { 
    List<User> users = User.find.all(); 
    return representation(users, views.html.users.ref); 
} 

private <T> Result representation(T resource, Template1<T, Html> html) { 
    if (resource == null) { 
    return notFound(); 
    } 

    if (request().accepts("text/html")) { 
    return ok(html.apply(resource)); 
    } else if (request().accepts("application/json")) { 
    return ok(Json.toJson(resource)); 
    } else { 
    return badRequest(); 
    } 
} 
+0

ठीक है, मुझे लगता है कि मैं इसे और अधिक पसंद करूंगा। लेकिन एचटीएमएल फॉर्म या जेएसओएन ऑब्जेक्ट (अनुरोधों से) के आधार पर जावा ऑब्जेक्ट्स को बाध्य करने के बारे में, मुझे उन्हें if/else कथन के साथ लागू करने की भी आवश्यकता होगी? या 'bindFromRequest' दोनों की सेवा करेगा? – adis

+0

'bindFromRequest' क्वेरी स्ट्रिंग और अनुरोध निकाय का उपयोग करता है (जो JSON, url form encoded, आदि हो सकता है)। –

2

लिखें 2 तरीकों, आप मैं जावा नमूने का उपयोग करेगा निर्दिष्ट नहीं करते के रूप में 2 मार्गों का उपयोग (

/GET /user/get/:id/html  controllers.YourController.userAsHtml(id:Long) 
/GET /user/get/:id/json  controllers.YourController.userAsJson(id:Long) 

अगले तुम सिर्फ अन्य दृश्य में एक लिंक बना सकते हैं उपयोगकर्ता का डेटा दिखाने की

<a href="@routes.YourController.userAsHtml(user.id)">Show details</a> 
<a href="@routes.YourController.userAsJson(user.id)">Get JSON</a> 

या कुछ और ...

संपादित करें # 1

आप भी आम if या case अंतिम आउटपुट

public static Result userAsV() { 
    String vType = form().bindFromRequest().get("v"); 

    if (vTtype.equals("HTML")){ 
     return ok(someView.render(User.find.byId(id))); 
    } 

    return play.libs.Json.toJson(User.find.byId(id)); 
} 
+0

यह काम कर सकता था के साथ एक आधार वर्ग में एक सामान्य renderMethod डाल, लेकिन डुप्लीकेट सामान मेरी पहली पसंद नहीं होगा द्वारा इसे हल। इसके लिए मेरे पास कोई प्रत्यक्ष उपयोग नहीं है, लेकिन भविष्य में यदि मैं मूल मोबाइल एप्लिकेशन बनाना चाहता हूं तो मैं केवल JSON पुनर्प्राप्त करने के लिए पुन: प्रयास करना चाहता हूं ... – adis

+0

ठीक है, जैसा कि आप चाहते हैं, ** संपादित करें # 1 * * – biesior

0

मैं उपयोगकर्ता एचटीएमएल के रूप में या json तो स्वीकार करता है विधि मेरे लिए काम नहीं किया के रूप में ब्राउज़र में देखा जा करने में सक्षम होना चाहता था।

मैं निम्नलिखित शैली वाक्य रचना

public static Result requestType() 
{ 
    if(request().uri().indexOf("json") != -1) 
    { 
     return ok(Json.toJson(request())); 
    } 
    else 
    { 
     return ok("Got HTML request " + request()); 
    } 
} 
संबंधित मुद्दे