খেলুনে বিশ্রাম! ফ্রেমওয়ার্ক


117

আমরা প্রাথমিকভাবে মোবাইল অ্যাপ্লিকেশনগুলিতে সামগ্রী সরবরাহ করার জন্য একটি প্রকল্পের পরিকল্পনা করছি, তবে একটি ওয়েবসাইট থাকা দরকার।

আমার প্রশ্নটি হ'ল আমাদের মোবাইল অ্যাপ্লিকেশনগুলির জন্য REST এপিআইগুলি বিকাশ করতে জার্সি বা রিসলেট ব্যবহার করা কি বোধগম্য হয় এবং তারপরে প্লেটি ব্যবহার করে! ওয়েবসাইট পরিবেশন করা।

বা এটি কেবল প্লে ব্যবহার করে আরও বোধগম্য হয়! এটা সব করতে? যদি তা হয় তবে কীভাবে প্লে দিয়েই আরএসইটি করবেন! ফ্রেমওয়ার্ক?

উত্তর:


112

অনুরোধ অনুসারে, একটি সহজ আরএসটি-মত পদ্ধতির। এটি কোডমওয়ান্সিসের সমাধান প্রায় একইভাবে কাজ করে তবে সামগ্রী আলোচনার জন্য গ্রহণ শিরোনাম ব্যবহার করে uses প্রথমে রুটের ফাইল:

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

আপনি এখানে কোনও সামগ্রীর প্রকার নির্দিষ্ট করে দিবেন না। আইএমএইচও কেবল তখনই প্রয়োজনীয় যখন আপনি নির্দিষ্ট সংস্থার জন্য "বিশেষ" ইউআরআই রাখতে চান। /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>

এই ব্রাউজারগুলি সবসময় এইচটিএমএল ভিউ দেয়, যেহেতু সমস্ত ব্রাউজারগুলি তাদের স্বীকৃতি শিরোনামে কোনও পাঠ্য / এইচটিএমএল সামগ্রী প্রকার প্রেরণ করে। অন্যান্য সমস্ত ক্লায়েন্ট (সম্ভবত কিছু জাভাস্ক্রিপ্ট-ভিত্তিক এজেএক্স অনুরোধগুলি) তাদের নিজস্ব পছন্দসই সামগ্রীর ধরণ নির্ধারণ করতে পারে। JQuerys আজাক্স () পদ্ধতি ব্যবহার করে আপনি নিম্নলিখিতটি করতে পারেন:

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

যা আপনাকে JSON ফর্ম্যাটে আইডি 1 সহ ব্যবহারকারী সম্পর্কে বিশদ পেতে হবে। প্লে বর্তমানে এইচটিএমএল, জেএসএন এবং এক্সএমএলকে স্থানীয়ভাবে সমর্থন করে তবে আপনি সরকারী ডকুমেন্টেশন অনুসরণ করে বা বিষয়বস্তু আলোচনার মডিউলটি ব্যবহার করে সহজেই আলাদা ধরণের ব্যবহার করতে পারেন ।

আপনি যদি বিকাশের জন্য Eclipse ব্যবহার করেন তবে আমি প্রস্তাব দিচ্ছি REST ক্লায়েন্ট প্লাগইন ব্যবহার করুন যা আপনাকে আপনার রুটগুলি এবং তার সাথে সম্পর্কিত সামগ্রীর ধরণের পরীক্ষা করতে দেয়।


2
এই পোস্ট করার জন্য ধন্যবাদ। খেলুন! জিনিসগুলির প্রাথমিক কাঠামো ব্যাখ্যা করার জন্য ডকস এমন কয়েকটি সেরা যা আমি দেখেছি তবে মাঝে মাঝে বিশদ উদাহরণগুলির অভাব হয়। দুটি উদাহরণ একই উদাহরণে প্রদর্শিত হওয়া সত্যই জিনিসগুলি পরিষ্কার করে দেয়।
ব্র্যাড ম্যাস

আমি আপনার উদাহরণটি চেষ্টা করে দেখছি, আমি আগ্রহী যেখানে পোস্ট করা JSON ডেটা ব্যবহারকারী শ্রেণিতে রূপান্তরিত হয়েছে। উদাহরণস্বরূপ, createUser ফাংশনের ভিতরে আমি দেখতে পাই নতুন ব্যবহারকারীটি নাল n
গ্যারি

2
@ গ্যারি: সম্ভবত আপনি "নতুন ব্যবহারকারী" এর পরিবর্তে "ব্যবহারকারী" ব্যবহার করেছেন? নিয়ামক এবং ফর্মের প্যারামিটারের নাম অবশ্যই মিলবে। আমি একটি সহজ প্রোজেক্ট তৈরি করেছি যে শো উপরে পদ্ধতি, এইচটিএমএল / এক্সএমএল / তাদেরকে JSON এ সকল ব্যবহারকারীর জন্য আউটপুট সহ github.com/sebhoss/play-user-sample
SEB

ধন্যবাদ, আমি জেএসএন
গ্যারি

@ গ্যারি: ইঙ্গিতটির জন্য ধন্যবাদ! মনে হচ্ছে এটা মাস্টার শাখায় সংশোধন করা হয়েছে, আপনি এটি নিজের নির্মাণের চেষ্টা করে দেখতে পারেন এবং তারপর আবার পরীক্ষা ..
SEB

68

এটি এখনও একটি জনপ্রিয় প্রশ্ন, তবে সর্বাধিক ভোট দেওয়া উত্তরগুলি খেলার বর্তমান সংস্করণে আপ টু ডেট নয়। ২.২.১ প্লে সহ এখানে একটি কার্যকরী বিশ্রামের উদাহরণ রয়েছে:

সার্ভার / রুট:

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
}

আমি সেব-এর উত্তরের একটি আপডেট সংস্করণও দেখতে চাই, তবে দুর্ভাগ্যক্রমে আপনার উত্তরটি সমস্ত .xML এবং .html যাদুটিকে সরিয়ে দিয়েছে। :-(
ফ্ল্যাশপেনস্টে পোস্ট

26

খেলুন! এটা সব করতে। প্লেতে REST পরিষেবাদি লেখা খুব সহজ।

প্রথমত, রুটগুলির ফাইলটি REST পদ্ধতির সাথে সঙ্গতিপূর্ণ রুটগুলি লিখতে সহজ করে তোলে।

তারপরে, আপনি তৈরি করতে চান এমন প্রতিটি এপিআই পদ্ধতিতে আপনি নিজের ক্রিয়াকে নিয়ামকটিতে লিখেন।

আপনি কীভাবে ফলাফলটি ফিরিয়ে দিতে চান তার উপর নির্ভর করে (এক্সএমএল, জেএসওএন ইত্যাদি), আপনি ব্যবহার করতে পারেন এমন কয়েকটি পদ্ধতি রয়েছে। উদাহরণস্বরূপ, রেন্ডারজেএসএন পদ্ধতি ব্যবহার করে ফলাফলগুলি খুব সহজেই রেন্ডার করা যায়। আপনি যদি এক্সএমএল রেন্ডার করতে চান তবে আপনি নিজের ভিউতে কোনও 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>

গ্রহণের শিরোনামের ভিত্তিতে সঠিক getUser পদ্ধতিটি চয়ন করা কি সম্ভব?
টিমো ওয়েস্টক্যাম্পার

এটি, তবে সম্পূর্ণ নির্ভরযোগ্য নয়। যদি প্লেটি জানে যে শিরোনামটি একটি JSON অনুরোধ, তবে এটি একটি getuser.json ফাইল রেন্ডার করার চেষ্টা করবে। যদি শিরোনামটি একটি এক্সএমএল হয় তবে এটি getuser.xML চেষ্টা করবে। তবে, ব্যবহারকারী / ব্যবহারকারী / {আইডি} / টাইপের কাছে এটি বুঝতে আরও সহজ এবং আরও বেশি পছন্দ করা
কোডমউনসি

29
আমি মনে করি না ইউআরআই-তে স্পষ্টভাবে উপস্থাপনের ধরণটি নির্দিষ্ট করে দেওয়া আরও REST- এর মতো। সরাসরি গ্রহণ করুন শিরোনামটি ব্যবহার করা ভাল এবং আপনি যে রিসোর্সটি দেখতে চান তা হিসাবে একই হিসাবে ইউআরআই পরিবর্তন করবেন না। উপরের উদাহরণটিতে কেবলমাত্র একটি সিঙ্গেল গেট ইউজার (লং আইডি) পদ্ধতি রয়েছে যা এটির বর্তমান প্রয়োগের সাথে ঠিক একই রকম হয় তবে গেট ইউজারজেসন, গেট ইউজারএক্সএমএল ইত্যাদি সংজ্ঞায়িত করার পরিবর্তে আপনি getUser.json এবং getUser.xML টেম্পলেটটি সংজ্ঞায়িত করতে পারেন। যদিও আমি এর নতুন নাম ব্যবহার করে ইউআরএস / ইউএসআর.এসএমএলও করেছি
সেব করুন

ধন্যবাদ, এটি খুব সহায়ক। সন্তুষ্ট!
গ্যারি

1
@ সেব - আপনি নিজের মন্তব্যে উত্তরে প্রসারিত করতে পারবেন? আপনি যে কৌশলটি বর্ণনা করেছেন তার একটি উদাহরণ দেখতে আমি পছন্দ করব
ব্র্যাড ম্যাস

5

জ্যাকস-আরএস প্রয়োগের সাথে সংহত করা প্লে-এর অন্তর্নির্মিত এইচটিটিপি রাউটিং ব্যবহারের সম্ভাব্য বিকল্প পদ্ধতি approach একটি বিশ্রামের উদাহরণের জন্য, বিশ্রামের প্লেটি দেখুন ! মডিউল

আপনি যদি ইতিমধ্যে জ্যাক্স-আরএসে বিনিয়োগ করেন বা জ্যাক্স-আরএস যেমন বিষয়বস্তু আলোচনার মতো জাস্ট-আরএস সরবরাহ করে এমন কয়েকটি উন্নত বৈশিষ্ট্যগুলির দরকার পড়ে তবে এই পদ্ধতির অর্থ উপলব্ধি করে। যদি তা না হয় তবে এইচটিটিপি অনুরোধের প্রতিক্রিয়া হিসাবে সরাসরি জেএসএন বা এক্সএমএল পরিবেশন করতে সরাসরি প্লে ব্যবহার করা সহজ।


4

আপনার এক নজর করা উচিত

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

এটি খেলার জন্য একটি মডিউল যা স্বয়ংক্রিয়ভাবে বিশ্রামের ইন্টারফেস তৈরি করে, ঠিক যেমন ক্রড মডিউল স্বয়ংক্রিয়ভাবে একটি প্রশাসক অঞ্চল তৈরি করে ...


2

দেখে মনে হচ্ছে প্লে সংস্করণ 1.2.3.3 এ এই পদ্ধতির নষ্ট হয়ে গেছে। আপনি যদি @seb দ্বারা সম্পন্ন উত্সটি ডাউনলোড করেন এবং পূর্বে https://github.com/sebhoss/play-user-sample উল্লেখ করেছেন , JSON অবজেক্টের সাথে POST ব্যবহার করে একটি নতুন ব্যবহারকারী অবজেক্ট তৈরি করা আর সম্ভব নয়।

জেসন এবং এক্সএমএল পোস্টের সাহায্যে তৈরি করার জন্য আপনার নির্দিষ্ট পদ্ধতি থাকতে হবে। এখানে বর্ণিত: https://groups.google.com/forum/#!topic/play-framework/huwtC3YZDlU

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.