खेलने पर उत्साही! ढांचा


117

हम मुख्य रूप से मोबाइल ऐप्स के लिए सामग्री परोसने वाले प्रोजेक्ट की योजना बना रहे हैं, लेकिन इसके लिए एक वेबसाइट होनी चाहिए।

मेरा प्रश्न यह है कि हमारे मोबाइल एप्लिकेशन के लिए REST API को विकसित करने के लिए जर्सी या रेस्टलेट का उपयोग करने का कोई अर्थ है या नहीं, और फिर Play का उपयोग करें! वेबसाइट की सेवा के लिए।

या यह सिर्फ खेलने के लिए और अधिक समझ में आता है! यह सब करने के लिए? यदि हां, तो Play के साथ REST कैसे करें! ढांचा?

जवाबों:


112

अनुरोध के अनुसार, एक सरल REST जैसा दृष्टिकोण। यह लगभग उसी तरह से काम करता है जैसे कि कोडमेवनिस का समाधान काम करता है लेकिन सामग्री बातचीत के लिए एक्सेडर शीर्षक का उपयोग करता है। पहले रूट फ़ाइल:

GET     /user/{id}            Application.user
POST    /user/                Application.createUser
PUT     /user/{id}            Application.updateUser
DELETE  /user/{id}            Application.deleteUser

आप यहां किसी भी प्रकार की सामग्री निर्दिष्ट नहीं करते हैं। ऐसा करना IMHO केवल तभी आवश्यक है जब आप कुछ संसाधनों के लिए "विशेष" URI चाहते हैं। जैसे /users/feed/एटम / आरएसएस में हमेशा लौटने का मार्ग घोषित करना ।

एप्लिकेशन नियंत्रक इस तरह दिखता है:

public static void createUser(User newUser) {
    newUser.save();
    user(newUser.id);
}

public static void updateUser(Long id, User user) {
    User dbUser = User.findById(id);
    dbUser.updateDetails(user); // some model logic you would write to do a safe merge
    dbUser.save();
    user(id);
}

public static void deleteUser(Long id) {
    User.findById(id).delete();
    renderText("success");
}

public static void user(Long id)  {
    User user = User.findById(id)
    render(user);
}

जैसा कि आप देख सकते हैं कि मैंने केवल getUserJSON विधि को हटा दिया और getUser विधि का नाम बदल दिया। विभिन्न प्रकार के काम करने के लिए अब आपको कई टेम्पलेट बनाने होंगे। प्रत्येक वांछित सामग्री प्रकार के लिए एक। उदाहरण के लिए:

user.xml:

<users>
  <user>
    <name>${user.name}</name>
    . . .
  </user>
</users>

user.json:

{
  "name": "${user.name}",
  "id": "${user.id}",
  . . . 
}

user.html:

<html>...</html>

यह दृष्टिकोण ब्राउज़र को हमेशा HTML दृश्य देता है, क्योंकि सभी ब्राउज़र अपने स्वीकार शीर्षलेख में एक पाठ / HTML सामग्री प्रकार भेजते हैं। अन्य सभी क्लाइंट (संभवतः कुछ जावास्क्रिप्ट-आधारित AJAX अनुरोध) अपने स्वयं के वांछित सामग्री प्रकार को परिभाषित कर सकते हैं। JQuerys ajax () विधि का उपयोग करके आप निम्नलिखित कार्य कर सकते हैं:

$.ajax({
  url: @{Application.user(1)},
  dataType: json,
  success: function(data) {
    . . . 
  }
});

जो आपको JSON प्रारूप में ID 1 के साथ उपयोगकर्ता के बारे में विवरण प्राप्त करना चाहिए। वर्तमान में Play HTML, JSON और XML का मूल रूप से समर्थन करता है, लेकिन आप आधिकारिक दस्तावेज़ का पालन ​​करके या सामग्री बातचीत मॉड्यूल का उपयोग करके आसानी से एक अलग प्रकार का उपयोग कर सकते हैं ।

यदि आप विकास के लिए ग्रहण का उपयोग कर रहे हैं, तो मेरा सुझाव है कि REST क्लाइंट प्लगइन का उपयोग करें जो आपको अपने मार्गों और उनके संबंधित सामग्री प्रकार का परीक्षण करने देता है।


2
इसे पोस्ट करने के लिए धन्यवाद। नाटक! डॉक्स चीज़ों की बुनियादी संरचना की व्याख्या करने के लिए मैंने देखा सबसे अच्छा में से कुछ हैं, लेकिन कभी-कभी विस्तृत उदाहरणों की कमी होती है। एक ही उदाहरण पर प्रदर्शित दो दृष्टिकोण होने से वास्तव में चीजें साफ हो जाती हैं।
ब्रैड मेस

मैं आपके उदाहरण की कोशिश कर रहा हूं, मैं उत्सुक हूं कि पोस्ट किए गए JSON डेटा को उपयोगकर्ता वर्ग में कैसे बदला जाता है। उदाहरण के लिए, createUser फ़ंक्शन के अंदर मुझे लगता है कि newUser शून्य है।
गैरी

2
@ गैरी: हो सकता है कि आपने "newUser" के बजाय "उपयोगकर्ता" का उपयोग किया हो? नियंत्रक और प्रपत्र पैरामीटर का नाम मेल खाना चाहिए। मैं एक साधारण परियोजना बना लिया है कि पता चलता है उपरोक्त विधि, एचटीएमएल / XML / JSON में सभी उपयोगकर्ताओं के लिए उत्पादन सहित github.com/sebhoss/play-user-sample
SEB

धन्यवाद, मैं यह JSON स्ट्रिंग भेजने के लिए कर्ल का उपयोग करके परीक्षण किया है, और ऐसा लगता है कि खेलने के ढांचे आवेदन / json सामग्री प्रकार पहचाना नहीं: groups.google.com/group/play-framework/browse_thread/thread/...
गैरी

@ गैरी: संकेत के लिए धन्यवाद! ऐसा लगता है कि यह मास्टर शाखा में तय हो गया है, आप इसे स्वयं बनाने की कोशिश कर सकते हैं और फिर परीक्षण कर सकते हैं ..
seb

68

यह अभी भी एक लोकप्रिय सवाल है, लेकिन सबसे अधिक मतदान के जवाब वर्तमान संस्करण के खेल के साथ नहीं हैं। यहां 2.2.1 प्ले के साथ काम करने का उदाहरण दिया गया है:

conf / मार्गों:

GET     /users                 controllers.UserController.getUsers
GET     /users/:id             controllers.UserController.getUser(id: Long)
POST    /users                 controllers.UserController.createUser
PUT     /users/:id             controllers.UserController.updateUser(id: Long)
DELETE  /users/:id             controllers.UserController.deleteUser(id: Long)

एप्लिकेशन / नियंत्रक / UserController.java:

public static Result getUsers()
{
    List<User> users = Database.getUsers();
    return ok(Json.toJson(users));
}

public static Result getUser(Long id)
{
    User user = Database.getUser(id);
    return user == null ? notFound() : ok(Json.toJson(user));
}

public static Result createUser()
{
    User newUser = Json.fromJson(request().body().asJson(), User.class);
    User inserted = Database.addUser(newUser);
    return created(Json.toJson(inserted));
}

public static Result updateUser(Long id)
{
    User user = Json.fromJson(request().body().asJson(), User.class);
    User updated = Database.updateUser(id, user);
    return ok(Json.toJson(updated));
}

public static Result deleteUser(Long id)
{
    Database.deleteUser(id);
    return noContent(); // http://stackoverflow.com/a/2342589/1415732
}

मैं भी seb के उत्तर का एक अद्यतन संस्करण देखना चाहूंगा, लेकिन दुर्भाग्य से आपके उत्तर ने .xml और .html जादू को हटा दिया। :-(
flaschenpost

26

प्ले का उपयोग करें! यह सब करने के लिए। Play में REST सेवाएँ लिखना बहुत आसान है।

सबसे पहले, रूट फ़ाइल उन मार्गों को लिखने के लिए सीधा बनाती है जो REST दृष्टिकोण के अनुरूप हैं।

फिर, आप अपनी कार्रवाई लिखते हैं, नियंत्रक में, प्रत्येक एपीआई विधि के लिए जिसे आप बनाना चाहते हैं।

आप परिणाम (XML, JSON आदि) कैसे वापस करना चाहते हैं, इसके आधार पर, कुछ तरीके हैं जिनका आप उपयोग कर सकते हैं। उदाहरण के लिए, रेंडरजसन विधि का उपयोग करके, परिणामों को बहुत आसानी से प्रदान करने की अनुमति मिलती है। यदि आप XML को रेंडर करना चाहते हैं, तो आप बस उसी तरह से कर सकते हैं जैसे आप अपने व्यू में एक HTML डॉक्यूमेंट बनाएंगे।

यहाँ एक साफ उदाहरण है।

मार्गों फ़ाइल

GET     /user/{id}            Application.getUser(format:'xml')
GET     /user/{id}/json       Application.getUserJSON
POST    /user/                Application.createUser
PUT     /user/{id}            Application.updateUser
DELETE  /user/{id}            Application.deleteUser

एप्लिकेशन फ़ाइल

public static void createUser(User newUser) {
    newUser.save();
    renderText("success");
}

public static void updateUser(Long id, User user) {
    User dbUser = User.findById(id);
    dbUser.updateDetails(user); // some model logic you would write to do a safe merge
    dbUser.save();
    renderText("success");
}

public static void deleteUser(Long id) {
    // first check authority
    User.findById(id).delete();
    renderText("success");
}

public static void getUser(Long id)  {
    User user = User.findById(id)
    renderJSON(user);
}

public static void getUserJSON(Long id) {
    User user = User.findById(id)
    renderJSON(user);
}

getUser.xml फ़ाइल

<user>
   <name>${user.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>

क्या स्वीकार हेडर के आधार पर सही गेटअप विधि चुनना संभव है?
टिमो वेस्टकम्पेर

यह है, लेकिन पूरी तरह से विश्वसनीय नहीं है। यदि प्ले जानता है कि हेडर एक JSON रिक्वेस्ट है, तो वह getuser.json फाइल रेंडर करने की कोशिश करेगा। यदि शीर्ष लेख एक xml है, तो यह getuser.xml की कोशिश करेगा। हालाँकि, यह समझना बहुत आसान है, और अधिक REST जैसे, उपयोगकर्ता / उपयोगकर्ता / {आईडी} / प्रकार
कोडमेवनी

29
मुझे नहीं लगता कि URI में प्रतिनिधित्व प्रकार को स्पष्ट रूप से निर्दिष्ट करना अधिक पसंद है। बेहतर है कि हेडर को सीधे स्वीकार करें और यूआरआई को न बदलें क्योंकि आप जिस संसाधन को देखना चाहते हैं वह वही रहता है। ऊपर दिए गए उदाहरण को केवल एक सिंगल गेटउज़र (लॉन्ग आईडी) विधि के लिए फिर से लिखा जा सकता है, जो इसके वर्तमान कार्यान्वयन के समान है, लेकिन एक गेटयूजरजोन, गेटयूएआरएक्सएक्सएमएल, आदि को परिभाषित करने के बजाय आप एक गेटयूजर .json और getUser.xml टेम्पलेट को परिभाषित करते हैं। हालाँकि, मैं इसका नाम बदलकर user.json / user.xml भी कर रहा हूँ
seb

धन्यवाद, यह बहुत मददगार है। इसकी प्रशंसा करना!
गैरी

1
@seb - क्या आप एक उत्तर में अपनी टिप्पणी का विस्तार कर सकते हैं? मैं आपके द्वारा बताई गई तकनीक का एक उदाहरण देखना पसंद करूंगा
ब्रैड मेस

5

JAX-RS कार्यान्वयन के साथ एकीकरण प्ले के अंतर्निहित HTTP राउटिंग का उपयोग करने के लिए एक संभावित वैकल्पिक दृष्टिकोण है। एक RESTEasy उदाहरण के लिए, RESTEasy Play देखें ! मॉड्यूल

यह दृष्टिकोण समझ में आता है कि क्या आप पहले से ही JAX-RS में निवेश कर रहे हैं, या यदि आपको कुछ उन्नत सुविधाओं REST की आवश्यकता है जो JAX-RS इस तरह की सामग्री बातचीत प्रदान करती है। यदि नहीं, तो HTTP अनुरोधों के जवाब में JSON या XML की सेवा करने के लिए सीधे Play Play का उपयोग करना सरल होगा।


4

आपकी नज़र होनी चाहिए

http://www.lunatech-labs.com/open-source/resteasy-crud-play-module

यह खेलने के लिए एक मॉड्यूल है जो स्वचालित रूप से एक बाकी इंटरफ़ेस का निर्माण करता है, जैसे क्रूड मॉड्यूल स्वचालित रूप से एक व्यवस्थापक क्षेत्र बनाता है ...


2

ऐसा लगता है कि यह दृष्टिकोण प्ले संस्करण 1.2.3 में टूट गया है। यदि आप @seb द्वारा किए गए स्रोत को डाउनलोड करते हैं और पहले https://github.com/sebhoss/play-user-sample का उल्लेख करते हैं, तो JSON ऑब्जेक्ट के साथ POST का उपयोग करके एक नए उपयोगकर्ता ऑब्जेक्ट का निर्माण अब संभव नहीं है।

आपको json और xml POST का उपयोग करके निर्माण के लिए विशिष्ट तरीके अपनाने की आवश्यकता है। यहाँ उल्लिखित: https://groups.google.com/forum/# .topic/play-framework/huwtC3YZDUU

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.