পাশের সাথে একটি পুট ব্যবহার করছে গ্রহণযোগ্য প্রভাবিত করে (রিস্ট)


9

আমি যখনই কোনও ফর্ম আপডেট করে তখনই আমি পূর্ববর্তী ইতিহাস তৈরি করতে চাই। এটি আপডেট হওয়ার কারণে আমি একটি পুট অনুরোধটি ব্যবহার করতে চাই। তবে, আমি পড়েছি যে পুট এর কোনও পার্শ্ব প্রতিক্রিয়া হওয়া উচিত

এখানে PUT ব্যবহার করা কি গ্রহণযোগ্য? এর চেয়ে ভাল বিকল্প আছে কি?

PUT /person/F02E395A235

{
   time: 1234567,
   fields: {
      name: 'John',
      age: '41'
   }
}

সার্ভারে

doPut('person/:personId',
   // create a new person snapshot
)

সম্পাদনা:

ইতিহাস ব্যবহারকারীর কাছে দৃশ্যমান হবে, একাধিকবার কল করার ফলে একাধিক সংস্করণ আসবে।

সমাধানটি পরীক্ষা করার আগে সংস্করণটি অনন্য ছিল কিনা তা পরীক্ষা করা হয়েছিল।

উত্তর:


11

পুরানো অর্থ ধরে রেখে এইচটিটিপি কী করা উচিত সে সম্পর্কে তাদের ধারণা সম্পর্কে এইচটিটিপি / 2 খসড়া তৈরি করা লোকেরা অনেক বেশি ভার্বোস ছিলেন। এইচটিটিপি / 2 খসড়া আইটেমটি আদর্শবোধ সম্পর্কে কী বলেছে তা দেখুন:

4.2.2। আইডেম্পোটেন্ট পদ্ধতি

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

নিরাপদ সংজ্ঞা মত, আদর্শ সম্পত্তি শুধুমাত্র ব্যবহারকারী দ্বারা অনুরোধ করা হয়েছে যা প্রযোজ্য; একটি সার্ভার প্রতিটি অনুরোধকে আলাদাভাবে লগ করতে, একটি পুনর্বিবেচনা নিয়ন্ত্রণের ইতিহাস ধরে রাখতে বা প্রতিটি আদর্শবান্ধব অনুরোধের জন্য অন্যান্য অ-আদর্শহীন পার্শ্ব-প্রতিক্রিয়া বাস্তবায়নের জন্য নিখরচায় রয়েছে

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

সংস্করণ সংস্থানসমূহের বিষয়ে আপনি যে সিদ্ধান্ত নিয়েছেন তা এখানে আসলে গুরুত্বপূর্ণ নয়। যদি কিছুই পরিবর্তন না হয় আপনি যদি নতুন সংস্করণ তৈরি করতে না চান, তবে আপনাকে PUT অনুরোধে পেডলোডের সাথে সম্পদের সাম্প্রতিকতম (বা অন্যথায় চিহ্নিত) সংস্করণটির সাথে তুলনা করতে হবে এবং যখন কোনও বৈশিষ্ট্যই পরিবর্তন হয়নি আপনি একটি নতুন সংস্করণ তৈরি না করতে পারেন চয়ন করতে পারেন ।


আপনার সম্পাদনা:

ইতিহাস ব্যবহারকারীর কাছে দৃশ্যমান হবে, একাধিকবার কল করার ফলে একাধিক রূপান্তর ঘটে

যতদূর সম্পদ সম্পর্কিত, এটি কোনও পার্শ্ব প্রতিক্রিয়া নয় । ইউআরআই-তে সংস্থান পরিবর্তন হয় না (একই বৈশিষ্ট্যগুলি PUT পায়)। ইতিহাস কেবল মেটাডেটা, কারণ এটি সম্ভবত অন্য কোনও ইউআরআই বা বিভিন্ন অনুরোধ শিরোনামের দ্বারা অনুরোধ করা হয়।


আপনি আমার নির্দিষ্ট সমস্যার জবাব দেওয়ার কারণে বাদে: "
পুট

কোন সমস্যার জন্য এটি একটি সমাধান? যে timeসম্পত্তি আপডেট? আমি মনে করি যে মেটাডেটা অত্যন্ত, যদিও এটা মধ্যে সম্পদ।
কোডকাস্টার

1
সমস্যাটি হ'ল যদি একাধিক পুটগুলি প্রেরণ করা হত তবে ব্যবহারকারী অনর্থক তথ্য সহ একটি দীর্ঘ পূর্বাবস্থায় ফিরে আসার ইতিহাস পাবেন। স্বতন্ত্রতার জন্য যাচাই করা এটি সমাধান করে
roo2

12

এইচটিটিপি দুটি বৈশিষ্ট্যের মধ্যে পার্থক্য করে:

  • Idempotency
  • নিরাপত্তা

আইডেম্পোটেন্সিটি নির্দিষ্টভাবে সংজ্ঞা দ্বারা সংজ্ঞায়িত করা হয়:

পদ্ধতিগুলিতে " আইডেম্পোটেন্স " এর সম্পত্তিও থাকতে পারে (ত্রুটি বা মেয়াদোত্তীর্ণ সমস্যাগুলি বাদ দিয়ে) এন> 0 অভিন্ন অনুরোধগুলির পার্শ্ব প্রতিক্রিয়াগুলি একক অনুরোধের মতোই। পদ্ধতি GET, HEAD, PUTএবং DELETEএই সম্পত্তি ভাগ করে নিন। এছাড়াও, পদ্ধতিগুলি OPTIONSএবং এর পার্শ্ব প্রতিক্রিয়াগুলি অবশ্যই ব্যবহার করা TRACE উচিত নয় এবং তাই সহজাতভাবে আদর্শবান ot

এবং সুরক্ষা:

বিশেষত, কনভেনশনটি প্রতিষ্ঠিত হয়েছে যে পদ্ধতিগুলি GETএবং HEADপদ্ধতিগুলির পুনরুদ্ধার ব্যতীত অন্য কোনও পদক্ষেপ গ্রহণের তাত্পর্য থাকা উচিত নয় । এই পদ্ধতিগুলিকে " নিরাপদ " হিসাবে বিবেচনা করা উচিত । এটি ব্যবহারকারীর এজেন্টগুলি অন্যান্য পদ্ধতিগুলির যেমন POST, PUTএবং DELETE, একটি বিশেষ উপায়ে প্রতিনিধিত্ব করতে অনুমতি দেয় যাতে ব্যবহারকারী সম্ভবত কোনও অনিরাপদ পদক্ষেপের জন্য অনুরোধ করা হচ্ছে এই বিষয়টি সম্পর্কে সচেতন হন।

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

নোট করুন যে সুরক্ষা আদর্শকে বোঝায়: যদি কোনও পদ্ধতির কোনও পার্শ্ব-প্রতিক্রিয়া না থাকে তবে একাধিকবার এটি সম্পাদন করলে একবারে সম্পাদন করার মতো একই পার্শ্ব-প্রতিক্রিয়া পাওয়া যাবে, অর্থাত্ কোনওটি নয়।

এটি পদ্ধতিগুলিকে তিনটি বিভাগে রাখে:

  • নিরাপদ (এবং এইভাবে এছাড়াও idempotent): GET, HEAD, OPTION,TRACE
  • idempotent কিন্তু অগত্যা নিরাপদ নয়: PUT,DELETE
  • আদর্শবান বা নিরাপদ নয়: POST

PUT এর কোনও দিকই প্রভাবিত হওয়া দরকার।

এটা ভুল। PUTআদর্শবান তবে নিরাপদ নয়। পুরো পয়েন্ট এর PUTএকটি পার্শ্ব-প্রভাব, যথা একটি সম্পদ আপডেট করা হয়। আইডেম্পোটেন্সি বলতে যা বোঝায় তা হ'ল একাধিকবার একই সামগ্রীতে একই সংস্থানটি আপডেট করার ক্ষেত্রে এটি একবারে আপডেট করার মতো একই প্রভাব ফেলতে হবে।

সুরক্ষা [জোর খনি] সম্পর্কে বিভাগের শেষ অনুচ্ছেদটি নোট করুন:

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

যদিও এই বাক্যটি GETসুরক্ষা এবং সুরক্ষার কথা বলে, আমরা ধরে নিতে পারি যে লেখকরা একই যুক্তি PUTএবং আদর্শের প্রতি প্রয়োগ করতে চেয়েছিলেন । IOW: নামমাত্র উত্স আপডেট করে PUTশুধুমাত্র একটি ব্যবহারকারীর দ্বারা দৃশ্যমান পার্শ্ব-প্রতিক্রিয়া থাকা উচিত । এটির অন্যান্য পার্শ্ব-প্রতিক্রিয়াও থাকতে পারে তবে ব্যবহারকারী তাদের জন্য দায়বদ্ধ হতে পারে না।

উদাহরণস্বরূপ, PUTআদর্শবাদী হ'ল এর অর্থ হ'ল আমি যতবার চাই এটিকে আবার চেষ্টা করতে পারি: অনুমানের নিশ্চয়তা দেয় যে এটি একাধিকবার কার্যকর করা একবারে এটি কার্যকর করার মতোই হবে same এই বহুবিধ PUTঅনুরোধগুলির পার্শ্ব-প্রতিক্রিয়া হিসাবে পুরানো সংশোধনগুলির একটি ব্যাকলগ তৈরি করা পুরোপুরি বৈধ । তবে, যদি একাধিক পুনরায় চেষ্টা করার ফলস্বরূপ, আপনার ডাটাবেসটি পুরানো সংশোধনীগুলির একটি ব্যাকলগ পূরণ করে, তবে এটি আমার সমস্যা নয়, এটি আপনার।

আইওউ: আপনার যতটা পার্শ্ব-প্রতিক্রিয়া রয়েছে আপনি চান তা অনুমোদিত, তবে but

  1. এটি অবশ্যই ব্যবহারকারীর দিকে তাকাতে হবে যেন তাদের অনুরোধগুলি আদর্শবান ছিল
  2. আপনি এই পার্শ্ব-প্রতিক্রিয়াগুলির জন্য দায়ী, ব্যবহারকারী নয়

হ্যাঁ, আইডেম্পোটেন্সি হ'ল সংস্থানটির উত্স সম্পর্কে, পুট-এর কাজ দ্বারা প্রভাবিত অন্য কোনও সার্ভার / পরিষেবা রাষ্ট্র সম্পর্কে নয়।
মার্জন ভেনেমা

বিশ্রামে
রও

দুর্দান্ত ব্যাখ্যা। যাইহোক, আপনি এই জাতীয় বেশ কয়েকটি বিবৃতি দিয়েছেন: "PUT এর পুরো পয়েন্টটির একটি পার্শ্ব প্রতিক্রিয়া হ'ল, যথা একটি উত্স আপডেট করা।" এটিকে একটি বৈপরীত্য বলে মনে হচ্ছে যদি না আপনি "পার্শ্ব প্রতিক্রিয়া" শব্দটির দ্বারা "প্রাথমিক, উদ্দেশ্যপ্রণালী প্রভাব ছাড়াও গৌণ বা অজান্তেই কিছু ঘটে যা" শব্দটির দ্বারা আলাদা কিছু বোঝায় না।
মারেডচিজ

@ মাররেডচিজ: আমি এই শব্দটি এর প্রমিত প্রোগ্রামিং অর্থ ব্যবহার করছি, যার মূলত "কোনও ফল" যা প্রত্যাবর্তনের মান নয় "।
জার্গ ডব্লু মিট্টাগ

আহ, অবশ্যই স্পষ্টতার জন্য ধন্যবাদ।
মারেডচিজ

1

আপনি সঠিক যে PUT এর কোনও পার্শ্ব প্রভাবিত হওয়া দরকার , তবে আমি এটিতে কিছু যুক্ত করব।

PUT এর যে সংস্থানটির জন্য PUT অপারেশন করা হচ্ছে তাতে কোনও দিকই প্রভাবিত না হওয়া দরকার

আপনি এমন একটি personউত্স আপডেট করছেন যা হিসাবে চিহ্নিত করা হয়েছে F02E395A235, সুতরাং PUT ব্যবহার করা সঠিক। এখন ব্যবসায়ের নিয়ম হিসাবে আপনি কলিং সত্তার (আরইএসটি পরিষেবার ভোক্তা) অদৃশ্য এমন পরিবর্তনগুলিরও নজর রাখেন। এটি personরিসোর্সে কোনও নতুন আইটেম যুক্ত করবে না । Pointতিহাসিক স্ন্যাপশটটি /person/শেষ পয়েন্টটি ব্যবহার করে অ্যাক্সেসযোগ্য হবে না । সুতরাং আমি বিশ্বাস করি, পিট এই ক্ষেত্রে পুরোপুরি গ্রহণযোগ্য হওয়া উচিত।


1
সংস্থানটিতে উত্সস্থ হওয়াতে কোনও পার্শ্ব প্রতিক্রিয়া নেই, তবে অন্যান্য স্টাফের (কাউন্টার, লগিং, অডিট ট্রেস, ...) এর কোনও সংখ্যক পার্শ্ব প্রতিক্রিয়া পুরোপুরি গ্রহণযোগ্য।
মার্জন ভেনেমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.