উইজার্ড সহ ওয়েব পৃষ্ঠাগুলির জন্য REST এপিআই নকশা


11

উইজার্ড ফর্ম্যাট সহ আমার একটি ওয়েব পৃষ্ঠা রয়েছে। এপিআই-এ জমা দেওয়ার বোতামটি উইজার্ডের চতুর্থ ধাপে থাকবে। তবে আমি চাই উইজার্ডের পরবর্তী ধাপে যাওয়ার আগে প্রবেশ করা ডেটা ডাটাবেসে সংরক্ষণ করা হোক। আমি চাই চাই যে একক ট্যাব থাকা পৃষ্ঠাগুলির জন্য আরএসটি এপিআই কাজ করবে।

সুতরাং আমি কোয়েরি প্যারামিটার ক্রিয়া = খসড়া বা জমা দেওয়ার জন্য এপিআই ডিজাইন করেছি। যদি ক্রিয়াটি খসড়া হয় তবে কেবলমাত্র নির্দিষ্ট ক্ষেত্রগুলি বাধ্যতামূলক। যদি পদক্ষেপ জমা দেওয়া হয় তবে সমস্ত ক্ষেত্র বাধ্যতামূলক। আরএসটি এপিআইয়ের পরিষেবা স্তরে বৈধকরণ কোয়েরি প্যারামিটারের ভিত্তিতে সম্পন্ন হবে। দেখে মনে হচ্ছে যে আমি ডকুমেন্টেশনে যদি / অন্য ধারাগুলি স্পষ্টভাবে উল্লেখ করেছি। এটি কি RESTful ডিজাইনের গ্রহণযোগ্য রূপ? এই প্রয়োজনীয়তা সঙ্গে সেরা নকশা কি হতে পারে?


3
অন্তর্বর্তী ডেটা কেন ডিবিতে সংরক্ষণ করা দরকার?
Dan1701

2
@ ডান1701: যাতে আপনি অন্য কোনও মেশিন থেকে উইজার্ডটি আবার চালু করতে পারেন। দীর্ঘ, জটিল ফর্মগুলি পূরণ করার সময়, সমস্ত প্রয়োজনীয় ডেটা সম্পূর্ণ করতে কয়েক দিন সময় নিতে পারে, কারণ ব্যবহারকারীর হাতে প্রয়োজনীয় সমস্ত ডেটা প্রস্তুত নাও থাকতে পারে বা ব্যবহারকারীকে বিভিন্ন জায়গা থেকে আপলোড করার জন্য অতিরিক্ত ফাইল সংগ্রহ করতে হতে পারে। আপনি যদি অন্য ডিভাইস থেকে পুনরায় শুরু করতে পারেন, আপনি মোবাইল ফোন থেকে কোনও ছবি আপলোড করতে উইজার্ডটি লোড করতে পারেন এবং ডেস্কটপে ইত্যাদিতে একটি সত্যিকারের কীবোর্ডের সাহায্যে দীর্ঘ বিবরণ / যুক্তি টাইপ করা চালিয়ে যেতে পারেন
লাই রায়ান

সেক্ষেত্রে, আমি মনে করি @ গাইলাউম ৩১ এর উত্তরটি অর্থবোধ করে।
ডান 1701

উত্তর:


7

যেহেতু আপনি উইজার্ড পদক্ষেপগুলির মধ্যে সার্ভারে জিনিসগুলি বজায় রাখতে চান তাই প্রতিটি পদক্ষেপকে পৃথক সংস্থান হিসাবে বিবেচনা করা পুরোপুরি গ্রহণযোগ্য বলে মনে হয়। এই লাইন বরাবর কিছু:

POST /wizard/123/step1
POST /wizard/123/step2
POST /wizard/123/step3

প্রতিক্রিয়াতে হাইপারমিডিয়া লিঙ্কগুলি অন্তর্ভুক্ত করে আপনি ক্লায়েন্টকে এই পদক্ষেপের পরে কী করতে পারে সে সম্পর্কে অবহিত করতে পারেন - মধ্যস্থতাকারী পদক্ষেপের জন্য এগিয়ে বা পিছনে যান, এবং চূড়ান্ত পদক্ষেপের জন্য কিছুই নয়। আপনি চিত্র 5 এর একটি উদাহরণ দেখতে পারেন এখানে


আমি ইউআই এর জন্য কৌণিক ব্যবহার করছি। সুতরাং আমি নিশ্চিত না যে রাষ্ট্র মেশিনটি কতটা সহায়ক। তবে আমি মনে করি পদক্ষেপ ভিত্তিক সংস্থান অন্য টেবিল পরিচালনার চেয়ে আরও অর্থবহ বলে মনে হচ্ছে। এছাড়াও, আমার একক পদক্ষেপে সবকিছু জমা দিতে সক্ষম হওয়া উচিত। এটি আজ এই ডিজাইনে একটি শট দেবে। সাহায্যের জন্য ধন্যবাদ.
টেকক্রাঞ্চ

আপনাকে স্বাগতম. যাইহোক, "দুটি টেবিল" পদ্ধতির সাথে এটি পারস্পরিক একচেটিয়া নয়। পদক্ষেপে একটি HTTP সংস্থান থাকা অ্যাপ্লিকেশন সার্ভারে আপনার অবজেক্ট মডেলকে নির্দেশ করে না, ডাটাবেস স্কিমাটি ছেড়ে দিন। এটি কেবল একটি ওয়েব উপস্থাপনা।
guillaume31

1
@ টেকক্রাঞ্চ মূলত গিলিয়ামের অর্থ হ'ল ফর্মটি উপস্থাপনকারী অবজেক্ট / টেবিলটি অংশগুলিতে বিভক্ত করা যেতে পারে, যেখানে প্রতিটি পদক্ষেপে মডেলের কিছু অংশ সংরক্ষণ করা হয়। আসলে, আপনি কেবলমাত্র প্রতিটি "পদক্ষেপ" পুরো মডেলের অংশ হিসাবে ফর্ম হতে পারেন । এবং যদি আপনি এই পদ্ধতিকে গ্রহণ করেন তবে এটি বাস্তবে আর্কিটেকচারটি অবিশ্বাস্যভাবে সহজ করে তুলেছে। সার্ভারে প্রতিটি পোষ্ট একই মডেলটি তৈরি (তৈরি বা) আপডেট করবে এবং প্রতিটি জিইটি একই মডেলটি লোড করবে এবং প্রতিটি পদক্ষেপটি শব্দার্থকভাবে অর্থপূর্ণ (একসাথে অন্তর্ভুক্ত) এর ক্ষেত্রগুলির সেট পূরণ করার জন্য একটি ফর্ম হবে। এবং কেবলমাত্র মডেলটিতে in_progressবা এর জন্য একটি বুলিয়ান রাখুন draft
ক্রিস সাইরেফাইস

3

কিছুক্ষণ আগে আমার অনুরূপ কিছু করার দরকার ছিল এবং নীচে আমাদের কী শেষ হয় তা বর্ণনা করে।

আমাদের দুটি টেবিল রয়েছে, আইটেম এবং অসম্পূর্ণ আইটেম। যখন ব্যবহারকারী উইজার্ডের সাথে ডেটা পূরণ করে, তথ্যটি অসম্পূর্ণ আইটেমের টেবিলে সংরক্ষণ করা হয়। প্রতিটি উইজার্ড পদক্ষেপে, সার্ভার সেই ধাপের সময় প্রবেশ করা ডেটাটিকে বৈধতা দেয়। যখন উইজার্ডটি ব্যবহারকারীর সাথে শেষ হয়, উইজার্ড একটি নিশ্চিতকরণ পৃষ্ঠায় একটি গোপন / পঠনযোগ্য ফর্মটি রেন্ডার করে যা সমস্ত ডেটা জমা দেওয়ার জন্য দেখায়। ব্যবহারকারী এই পৃষ্ঠাটি পর্যালোচনা করতে পারেন এবং ত্রুটিগুলি ঠিক করতে প্রাসঙ্গিক পদক্ষেপে ফিরে যেতে পারেন। একবার ব্যবহারকারী তাদের এন্ট্রি নিয়ে সন্তুষ্ট হয়ে গেলে, ব্যবহারকারী ক্লিকগুলি জমা দেয় এবং উইজার্ড তারপরে লুকানো / কেবল পঠিত ফর্ম ক্ষেত্রগুলির সমস্ত ডেটা API সার্ভারে জমা দেয়। যখন এপিআই সার্ভার এই অনুরোধটি প্রসেস করে, উইজার্ডের প্রতিটি ধাপে এটি করা সমস্ত বৈধতা পুনরায় চালু করে এবং অতিরিক্ত পদক্ষেপগুলি পৃথক পদক্ষেপগুলিতে ফিট করে না (যেমন গ্লোবাল বৈধকরণ, ব্যয়বহুল বৈধতা)।

দুটি টেবিল পদ্ধতির সুবিধা:

  • ডাটাবেসে, আপনার অসমাপ্ত আইটেমের চেয়ে আইটেম টেবিলের উপর আরও কঠোর বাধা থাকতে পারে; উইজার্ড শেষ হয়ে গেলে আপনার কাছে optionচ্ছিক কলাম থাকতে হবে না যা আসলে প্রয়োজন হবে।

  • প্রতিবেদনের জন্য সমাপ্ত আইটেমগুলির জুড়ে সমষ্টিগত জিজ্ঞাসাগুলি সহজ, কারণ আপনার অসম্পূর্ণ আইটেমগুলি বাদ দিতে ভুলবেন না। আমাদের ক্ষেত্রে, আইটেম এবং অসম্পূর্ণ আইটেমগুলির মধ্যে আমাদের কখনই সামগ্রিক অনুসন্ধানগুলি করার দরকার পড়েনি, সুতরাং এটি কোনও সমস্যা নয়।

অসুবিধা:

  • এটি বৈধতা যুক্তির সদৃশ হওয়ার প্রবণতা। আমরা যে ওয়েব ফ্রেম ফ্রেম ব্যবহার করেছি, তা জাঙ্গো এটিকে কিছুটা সহনীয় করে তোলে কারণ আইটেম এবং অসম্পূর্ণ আইটেমে আমাদের আলাদা হওয়া দরকার সীমাবদ্ধতাগুলি পরিবর্তন করতে আমরা কিছুটা মেটা যাদু নিয়ে মডেল উত্তরাধিকার ব্যবহার করেছি। জ্যাঙ্গো বেশিরভাগ ডাটাবেস তৈরি করে এবং মডেল থেকে বৈধতা ফর্ম করে এবং আমাদের কেবল এটির উপরে কয়েকটি অতিরিক্ত বৈধতা হ্যাক করতে হবে।

অন্যান্য সম্ভাবনাগুলি যা আমি বিবেচনা করেছি এবং কেন আমরা তাদের সাথে যাই নি:

  • কুকি বা স্থানীয় স্টোরেজে ডেটা সংরক্ষণ করা: ব্যবহারকারী অন্য ডিভাইস থেকে বা তাদের ব্রাউজারের ইতিহাস মুছলে তাদের জমা দেওয়া চালিয়ে যেতে পারে না
  • অসম্পূর্ণ আইটেমটি ডাটাবেস বা সেকেন্ডারি ডেটাস্টোরগুলিতে আনস্ট্রাকচার্ড ডেটা (যেমন জেএসএন) হিসাবে সঞ্চয় করুন: আমি পার্সিং লজিক সংজ্ঞায়িত করতে হবে এবং জ্যাঙ্গোর স্বয়ংক্রিয় মডেল / ফর্ম বৈধতা ব্যবহার করতে পারবেন না।
  • ক্লায়েন্টের পক্ষে প্রতি পদক্ষেপের বৈধতা দিন: আমাকে পাইথন / জ্যাঙ্গো এবং জাভাস্ক্রিপ্টের মধ্যে বৈধতা যুক্তিকে নকল করতে হবে।

1
'খসড়া'-টাইপ মডেল এবং 'সমাপ্ত' মডেলগুলির বৈধতাগুলি নির্দেশ করার জন্য +1; আমি এটি ভাবিনি, এবং এটি একটি গুরুত্বপূর্ণ বিষয় যা বিবেচনায় নেওয়া উচিত। অন্যথায় আপনার সম্ভবত ifসমস্ত বৈধতা যাবতীয় খসড়া স্থিতির জন্য আপনার কাছে প্রচুর বিবৃতি রয়েছে, যা কেবল ভাল হবে না। যদিও কিছু খুব পরিশীলিত ফ্রেমওয়ার্ক যেমন রেল অন রেলসকে যথাযথভাবে প্রয়োগ করা হয় তবে সেই সমস্যাটিকে উল্লেখযোগ্যভাবে সহজ করতে পারে।
ক্রিস সাইরেফাইস

1

আমি এটি @ guillauma31 এবং @Lie রায়ান এর সমাধানগুলির মিশ্রণের মতো একটি উপায়ে প্রয়োগ করেছি।

মূল ধারণাটি এখানে:

  1. এখানে একটি 3 ধাপের উইজার্ড রয়েছে যা সম্পূর্ণ না হওয়া পর্যন্ত আংশিকভাবে বজায় থাকতে পারে।
  2. প্রতিটি পদক্ষেপ এটা নিজস্ব সম্পদ (যেমন .: হয়েছে /users/:id_user/profile/step_1, .../step_2ইত্যাদি)
  3. প্রতিটি পদক্ষেপে, জিইটি অনুরোধের মাধ্যমে ডেটা এবং সম্পূর্ণকরণের স্থিতি পুনরুদ্ধার করা যায় এবং প্যাচ অনুরোধের মাধ্যমে অব্যাহত রাখা যায়।
  4. প্রতিটি সংস্থান প্রবেশ করা ডেটা এর নিজস্ব বৈধতা নিয়ম আছে।
  5. প্রতিটি পদক্ষেপ একটি কী প্রদান করে যা ক্রমটির গ্যারান্টি সহ পরবর্তী পদক্ষেপের ইনপুটটিতে ব্যবহার করতে হবে। একবার ব্যবহার করা বা একটি নতুন উত্পন্ন হওয়ার পরে, এই টোকেনটির মেয়াদ শেষ হবে।
  6. চূড়ান্ত পদক্ষেপে, আমাদের ডাটাবেসে সমস্ত প্রয়োজনীয় ডেটা রয়েছে এবং একটি নিশ্চিতকরণের স্ক্রিন প্রদর্শিত হবে। এই নিশ্চিতকরণটি ডেটা সম্পূর্ণ হিসাবে চিহ্নিত করতে অন্য সংস্থানকে কল করে (যেমন .../profile/confirm:)। এই সংস্থানটিতে আবার সমস্ত ডেটা পাওয়ার দরকার নেই। এটি কেবলমাত্র ডেটাটিকে সঠিক এবং সম্পূর্ণ হিসাবে চিহ্নিত করে।
  7. একটি নির্ধারিত রুটিন রয়েছে যা এই অসম্পূর্ণ এন্ট্রিগুলিকে মুছে দেয় যা কিছু দিনেরও বেশি।

উইজার্ডের পিছনে পিছনে কাজ করার জন্য সামনের প্রান্তের ছেলেরা টোকেনগুলির যত্ন নিতে হবে।

এপিআই হ'ল রাষ্ট্রবিহীন এবং পারমাণবিক।

এই সেটআপটির সাথে "একটি পদক্ষেপের উইজার্ড" কাজ করার জন্য আপনাকে কিছু জিনিস পরিবর্তন করতে হবে যেমন টোকেন প্রবাহকে সরিয়ে দেওয়া বা উইজার্ডের ধরণের ভিত্তিতে টোকেনগুলি ফেরত দেওয়ার জন্য একটি উত্স তৈরি করা বা এমনকি এই নির্দিষ্ট এককটি পূরণ করার জন্য একটি নতুন সংস্থান তৈরি করতে হবে পদক্ষেপ উইজার্ড (মত PUT /users/:id_user/profile/)।

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