অনুরোধের বডি মোছার জন্য বিশ্রামের বিকল্প


95

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

4.3 বার্তা বডি

কোনও সার্ভার কোনও অনুরোধে একটি বার্তা-বডি পড়তে এবং ফরোয়ার্ড করা উচিত; যদি অনুরোধ পদ্ধতিতে কোনও সত্তা-দেহের জন্য সংজ্ঞায়িত শব্দার্থকে অন্তর্ভুক্ত না করা হয়, তবে অনুরোধটি পরিচালনা করার সময় বার্তা-বডিটি উপেক্ষা করা উচিত।

আমি ইতিমধ্যে এসও এবং এর বাইরেও এ সম্পর্কিত বেশ কয়েকটি সম্পর্কিত আলোচনা পর্যালোচনা করেছি, যেমন:

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

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

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

  • বার্তা শরীরে - অনুমানটি ইঙ্গিত করে যে ডিলিটের বার্তাগুলির কোনও শব্দার্থক মূল্য নেই; এইচটিটিপি ক্লায়েন্টদের দ্বারা পুরোপুরি সমর্থিত নয়; স্ট্যান্ডার্ড অনুশীলন না
  • কাস্টম এইচটিটিপি শিরোনাম - কাস্টম শিরোনামের প্রয়োজন সাধারণত স্ট্যান্ডার্ড অনুশীলনের বিরুদ্ধে ; এগুলি ব্যবহার করা আমার বাকি এপিআইয়ের সাথে সঙ্গতিপূর্ণ নয়, যার মধ্যে কাস্টম শিরোনামের প্রয়োজন নেই; আরও, খারাপ কাস্টম শিরোলেখের মানগুলি (সম্ভবত পুরোপুরি একটি পৃথক প্রশ্ন) নির্দেশ করতে কোনও ভাল HTTP প্রতিক্রিয়া উপলব্ধ নেই
  • স্ট্যান্ডার্ড এইচটিটিপি শিরোনাম - কোনও মানক শিরোনাম উপযুক্ত নয়
  • ক্যোয়ারী প্যারামিটার - ক্যোয়ারী প্যারামগুলি যুক্ত করা হলে অনুরোধ-ইউআরআই মোছার পরিবর্তিত হয়; স্ট্যান্ডার্ড অনুশীলনের বিরুদ্ধে
  • পোষ্ট পদ্ধতি - (উদাঃ POST /resourceToDelete { deletemetadata }) পোস্ট মুছে ফেলার জন্য কোনও অর্থবোধক বিকল্প নয়; পোস্টটি আসলে পছন্দসই বিপরীত ক্রিয়াকে প্রতিনিধিত্ব করে (অর্থাত্ পোস্টটি রিসোর্স সাবর্ডিনেটস তৈরি করে; তবে আমার রিসোর্সটি মুছতে হবে)
  • একাধিক পদ্ধতি - মোছার অনুরোধটিকে দুটি ক্রিয়ায় বিভক্ত করা (উদাহরণস্বরূপ পুট মুছে ফেলুন মেটাডেটা, তারপরে মুছে ফেলুন) পারমাণবিক ক্রিয়াকলাপকে দুটি ভাগে বিভক্ত করে, সম্ভাব্যভাবে একটি অসামঞ্জস্য অবস্থা ছেড়ে যায়। মোছার কারণ (এবং অন্যান্য সম্পর্কিত মেটাডেটা) নিজেই উত্সের উপস্থাপনার অংশ নয়।

আমার প্রথম পছন্দটি হ'ল বার্তাটির প্রধান অংশটি ব্যবহার করতে হবে, কাস্টম এইচটিটিপি শিরোনামের পরে দ্বিতীয়; তবে, যেমন নির্দেশিত হয়েছে, এই পদ্ধতির কিছু ডাউনসাইড রয়েছে।

ডিএলটিইটি অনুরোধে প্রয়োজনীয় মেটাডেটা অন্তর্ভুক্ত করার জন্য কি আরইএসটি / এইচটিটিপি স্ট্যান্ডার্ডের সাথে কোনও প্রস্তাব বা সর্বোত্তম অনুশীলন রয়েছে? অন্য কোন বিকল্প আছে যা আমি বিবেচনা করি নি?


4
কিছু বাস্তবায়ন যেমন অনুরোধের Jerseyজন্য শরীরকে অনুমতি দেয় না delete
বেসিলজাম

উত্তর:


46

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

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

আমি এখনও অন্য চিন্তাভাবনা এবং আলোচনার জন্য উন্মুক্ত থাকি, তবে এই প্রশ্নের লুপটি বন্ধ করতে চেয়েছিলাম। আমি এই বিষয়ে সবার চিন্তাভাবনা এবং আলোচনার প্রশংসা করি!


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

4
আমি @ গ্যাবের সাথে সম্মতি জানাই, এমন পদ্ধতিগুলির সাথে একটি দেহ পাঠানো যার সংজ্ঞা অনুসারে কোনও দেহ নেই, আপনার বিটগুলি ইন্টারনেট পাইপগুলি অতিক্রম করার কারণে এলোমেলোভাবে ডেটা হারাতে একটি নিশ্চিত আগুনের উপায় এবং আপনার এটির ডিবাগ করার জন্য খুব জটিল সময় হবে।
নিকোলাস শ্যাঙ্কস

4
ডিলিট ব্যবহারের বিরুদ্ধে এই মন্তব্যগুলি অপ্রাসঙ্গিক, যতক্ষণ না তারা ওপি-তে থাকা খুব কার্যকর সমস্যা সমাধান করে। আমি আরআরএসটি-র স্পিরিট মেনে চলার জন্য যথাসাধ্য চেষ্টা করছি, তবে আশাবাদী সম্মতি ছাড়াই মুছে ফেলা এবং পারমাণবিক ব্যাচের অপারেশন নেই এমন একটি মুছা বাস্তব জীবনের পরিস্থিতিতে ব্যবহারিক নয়। এটি আরইএসটি প্যাটার্নের সাথে একটি গুরুতর ঘাটতি।
Quarkly

4
আমি এই সম্পর্কে @ চতুর সাথে আছি। আমরা কীভাবে আমাদের একত্রে চেক করা উচিত ইত্যাদি বিষয়ে RESTFUL ধারণাটি কী তা আমি বুঝতে পারি না Con কনকুরન્સી চেক ক্লায়েন্টের অন্তর্ভুক্ত নয়।
ডার্ক ওয়েসেলস

13

আপনি যা চান বলে মনে করছেন তা দুটি জিনিসের একটি যা একটিও খাঁটি নয় DELETE:

  1. আপনি দুটি অপারেশন আছে, একটি PUTডিলিট কারণ একটা দ্বারা অনুসরণ DELETEরিসোর্সের। একবার মোছা হয়ে গেলে, সংস্থানটির সামগ্রীগুলি এখন কারও কাছে অ্যাক্সেসযোগ্য নয়। 'কারণ' মুছে ফেলা রিসোর্সে হাইপারলিঙ্ক থাকতে পারে না। বা,
  2. আপনি একটি সম্পদ পরিবর্তন করার চেষ্টা করছেন থেকে state=activeথেকে state=deletedব্যবহার করে DELETEপদ্ধতি। রাজ্য = মুছে ফেলা সংস্থানগুলি আপনার প্রধান এপিআই দ্বারা উপেক্ষা করা হবে তবে এখনও প্রশাসক বা ডেটাবেস অ্যাক্সেস সহ কারও কাছে পঠনযোগ্য। এটি অনুমোদিত - DELETEকোনও উত্সের জন্য ব্যাকিং ডেটা মুছতে হবে না, কেবল সেই ইউআরআই-এ প্রকাশিত সংস্থানটি সরাতে।

কোনও ক্রিয়াকলাপের জন্য যা একটি DELETEঅনুরোধে একটি বার্তার মূল অংশের প্রয়োজন তা একেবারে সাধারণভাবে ভেঙে ফেলা যেতে পারে, একটি POSTবার্তার মূল অংশের সাথে সমস্ত প্রয়োজনীয় কাজগুলি করতে এবং একটি DELETE। আমি এইচটিটিপি এর শব্দার্থবিজ্ঞান ভাঙ্গার কোন কারণ দেখতে পাচ্ছি না।


4
PUTকারণটি যদি সফল হয় এবং DELETEসংস্থান ব্যর্থ হয়? অসামঞ্জস্যপূর্ণ অবস্থা কীভাবে রোধ করা যায়?
লাইটম্যান

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

7

আপনার পরিস্থিতি বিবেচনা করে আমি নিম্নলিখিত পদ্ধতির একটি গ্রহণ করব:

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

মনে রাখবেন যে REST আইন বা ডগমা নয়। এটিকে আরও দিকনির্দেশ হিসাবে ভাবেন। সুতরাং, যখন আপনার সমস্যার ডোমেনের জন্য দিকনির্দেশনা অনুসরণ না করা বোধগম্য হয় তখন তা করবেন না। আপনার এপিআই গ্রাহকদের বৈচিত্র সম্পর্কে অবহিত করা হয়েছে তা নিশ্চিত করুন।


ক্যোয়ারী প্যারামগুলির ব্যবহার সম্পর্কে, আমার বোঝাটি হল যে কোয়েরিটি অনুচ্ছেদ ৩.২ অনুসারে অনুরোধ-ইউআরআইয়ের একটি অংশ , এবং সুতরাং এই পদ্ধতির (বা তেমনি পৃথক প্রান্তগুলি) ডিলেট ডিগ্রি পদ্ধতির সংজ্ঞার বিপরীতে চলেছে , যেমন "রিসোর্স" অনুরোধ-ইউআরআই দ্বারা চিহ্নিত মুছে ফেলা হয়েছে।
তাক

রিসোর্সটি ইউরি পাথ দ্বারা চিহ্নিত করা হয়েছে। সুতরাং একটি জিইটি /orders/:idএকই সংস্থানটি ফেরত দেবে /orders/:id?exclude=orderdetails। ক্যোয়ারী স্ট্রিংটি কেবলমাত্র সার্ভারকে ইঙ্গিত দিচ্ছে - এই ক্ষেত্রে প্রতিক্রিয়াতে অর্ডারডেটেলগুলি বাদ দিতে (যদি সমর্থন করে)। একইভাবে, আপনি যদি মুছে ফেলছেন /orders/:idবা /orders/:id?reason=canceledবা /orders/:id?reason=bad_credit, আপনি এখনও একই অন্তর্নিহিত সংস্থানটিতে অভিনয় করছেন। একটি 'অভিন্ন ইন্টারফেস' রাখতে, আমার একটি ডিফল্ট কারণ থাকতে হবে যাতে কোয়েরি পরম প্রেরণের প্রয়োজন হয় না।
কোডেপ্রেসন

@ শেললি আপনি ক্যোয়ারী স্ট্রিং সম্পর্কে আপনার উদ্বেগকে ঠিক বলেছেন। ক্যোয়ারী স্ট্রিংটি ইউআরআই-র অংশ। একটি /foo?123মোছার অনুরোধ প্রেরণের অর্থ আপনি যদি মুছে ফেলা হয় তার চেয়ে আপনি কোনও আলাদা উত্স মুছে ফেলছেন /foo?456
নিকোলাস শ্যাঙ্কস

@ কোডপ্রেগ্রেশন দুঃখিত, তবে আপনি যা বলেন তার বেশিরভাগই ভুল। সংস্থানটি পুরো পথটি নয়, পুরো ইউআরআই দ্বারা চিহ্নিত করা হয়েছে। বিভিন্ন কোয়েরি স্ট্রিং হ'ল বিভিন্ন সংস্থান ('রিসোর্স' শব্দের HTTP অর্থে)। এছাড়াও, অভিন্ন ইন্টারফেসের জন্য একটি ডিফল্ট কারণ প্রয়োজন হয় না। এই পদটি জিইটি, পুট, পোস্ট, প্যাচ এবং ডিটিটিইটি ব্যবহার করে যা HTTP তাদের সংজ্ঞায়িত করে। সাধারণতা বিক্রেতাদের মধ্যে (ব্যবহারকারী এজেন্ট বিক্রেতারা, এপিআই বিক্রেতারা, ক্যাশে প্রক্সি বিক্রেতারা, আইএসপি ইত্যাদি) এবং কোনও নিজস্ব API এর মধ্যে নয় (যদিও এটির ব্যবহারকারীর বুদ্ধিমানের জন্য নকশায় অভিন্ন হওয়া উচিত!)।
নিকোলাস শ্যাঙ্কস

@ নিকোলাস আমি তিন বছর আগে সমাপ্ত আলোচনার তর্ক করার দরকারটি বুঝতে পারি না। উত্তর এবং আমার দেওয়া মন্তব্যগুলি একটি REST- কেন্দ্রিক দর্শন থেকে বৈধ এবং সঠিক। আরআরইএসটি এইচটিটিপি নয় (এইচটিটিপি-র কোনও বিক্রেতার প্রয়োগও নয়)। আরআরইএসটি প্রসঙ্গে, সংস্থানগুলি একই রকম। এবং আমি আমার উত্তরে যেমন বলেছিলাম, REST আইন বা গোপনীয়তা নয়, তবে গাইডেন্স।
কোডেগ্রোগ

0

আমি আপনাকে ইউআরআই স্তরক্রমের অংশ হিসাবে প্রয়োজনীয় মেটাডেটা অন্তর্ভুক্ত করার পরামর্শ দিচ্ছি। একটি উদাহরণ (নিষ্পাপ):

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

যেমন

DELETE /entries/range/01012012/31122012 - 01 জানুয়ারী 2012 থেকে 31 ডিসেম্বর 2012 এর মধ্যে সমস্ত এন্ট্রি মুছুন

আশাকরি এটা সাহায্য করবে.


4
মোছার জন্য কারণ প্রেরণ ক্ষেত্রের মতো কারণগুলি কভার করে না।
কুগেল

4
কি দারুন. একটি ভয়ঙ্কর ধারণা। আপনার যদি মেটা ডেটা খুব বেশি করে থাকে তবে এটি ইউআরআই-তে আকারের সীমাবদ্ধতা ফুটিয়ে তুলবে।
বালাজী বোগগ্রাম রমনারায়ণ

4
এই পদ্ধতিটি বিশ্রামের অনুশীলনগুলি অনুসরণ করে না এবং এটির প্রস্তাবিত নয় কারণ আপনার একটি সংশ্লেষিত ইউআরআই কাঠামো থাকবে। শেষের পয়েন্টগুলি মেটা ডেটা এবং আন্তঃসংযোগযুক্ত সংস্থান সনাক্তকরণের সাথে মিশে গেছে এবং আপনার এপিআই পরিবর্তনের সাথে সাথে এটি রক্ষণাবেক্ষণের দুঃস্বপ্নে পরিণত হবে। rangeএই প্রশ্নের মাংস যা ক্যোয়ারী প্যারাম বা পে-লোডে নির্দিষ্ট করে দেওয়া আরও বেশি পছন্দনীয় : আমি যে সমস্যাটি বলব এটির জন্য সর্বোত্তম অনুশীলন পদ্ধতির বোঝার জন্য।
ডিজিটাল ড্রিমার 21

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