REST, HTTP মুছে ফেলুন এবং পরামিতি


135

এইচটিটিপি মুছে ফেলার অনুরোধে প্যারামিটারগুলি সরবরাহ করার বিষয়ে কি অ-রেস্টস্টুল কিছু আছে?


আমার পরিস্থিতিটি হ'ল আমি মডেলিং করছি "আপনি কি মুছে ফেলার বিষয়ে নিশ্চিত?" দৃশ্যকল্প। কিছু ক্ষেত্রে, সংস্থানটির স্থিতি অনুরোধ করে যে অনুরোধ করা মোছাটি অবৈধ হতে পারে। আপনি সম্ভবত এমন কিছু পরিস্থিতি কল্পনা করতে পারেন যেখানে একটি মুছার নিশ্চয়তার প্রয়োজন হয়

আমরা যে সমাধানটি গ্রহণ করেছি তা হ'ল মুছে ফেলার অনুরোধটির সাথে একটি প্যারামিটার পাস করে এটি নির্দেশ করে যে মুছে ফেলা ("? বল_ডিলেট = সত্য")

যেমন

DELETE http://server/resource/id?force_delete=true

আমি বিশ্বাস করি যে এটি এখনও শান্ত আছে:

(ক) মোছার শব্দার্থবিজ্ঞান পরিবর্তন করা হচ্ছে না - ব্যবহারকারী এখনও একটি সাধারণ ডিলিট অনুরোধ পাঠাতে পারে তবে এটি 409 এর সাথে ব্যর্থ হতে পারে এবং প্রতিক্রিয়াটির মূল অংশটি কেন তা ব্যাখ্যা করবে। আমি বলছি কিছু ক্ষেত্রে ব্যর্থ হতে পারে (কারণ ব্যাখ্যা করার কারণে নয়) ব্যবহারকারীকে অনুরোধ করার কোনও কারণ নেই।

(খ) রায়ের গবেষণামূলক প্রবন্ধে এটিকে আরএসটি-র স্পিরিটের বিপরীতে বলা যায় না - কেন এইচটিটিপি আরইএসটি কেবলমাত্র একটি বাস্তবায়ন তাই এইচটিটিপি পরামিতি কেন পাস করবে?


কেউ আমাকে এমন একটি নির্দিষ্ট বিবৃতিতে নির্দেশ করতে পারে যে এটি বিশ্রাম না দেওয়ার কারণটিকে নখ করে?

সম্পর্কিত প্রশ্নে, ব্যবহারকারী যদি ফোর্স_ডিলিট নির্দিষ্ট না করে তবে আমি ফিরে আসছি 409 Conflict- এটি কি সবচেয়ে উপযুক্ত প্রতিক্রিয়া কোড?


অনুসরণ করুন

আরও কিছু গবেষণার পরে, আমি মনে করি যে মুছে ফেলতে পরামিতি যুক্ত করা কিছু নীতি লঙ্ঘন করতে পারে।

প্রথমটি হ'ল বাস্তবায়ন সম্ভবত "ইউনিফর্ম ইন্টারফেস" লঙ্ঘন করে ( রায়ের গবেষণামূলক অংশের 5.1.5 দেখুন

'ফোর্স_ডিলিট' যোগ করে আমরা ইতিমধ্যে ভালভাবে সংজ্ঞায়িত ডিলিট পদ্ধতিতে একটি অতিরিক্ত বাধা যুক্ত করছি। এই সীমাবদ্ধতা কেবল আমাদের কাছে অর্থবহ।

আপনি এটিও যুক্তি করতে পারেন যে এটি "5.1.2 ক্লায়েন্ট-সার্ভার" লঙ্ঘন করেছে যেহেতু নিশ্চিতকরণ ডায়ালগটি সত্যই একটি ইউআই উদ্বেগ এবং আবার সমস্ত ক্লায়েন্ট মুছে ফেলার বিষয়টি নিশ্চিত করতে চাইবে না।

কারও পরামর্শ?


1
রায়ের গবেষণার জন্য আপনার ইউআরএলে একটি ")" রয়েছে যা 404 এর কারণ ঘটায় .uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm কাজ করে।
নিউক্লিয়ারপিয়ন

উত্তর:


78

না, এটি বিশ্রামের নয়। force_deleteইউআরআই-তে আপনার একটি ক্রিয়া ( ) লাগানোর একমাত্র কারণ হ'ল যদি আপনাকে এমন পরিবেশে জিইটি / পোষ্ট পদ্ধতিগুলি ওভারলোডের প্রয়োজন হয় যেখানে পুট / ডিলেট পদ্ধতি উপলব্ধ না থাকে। আপনার মোছার পদ্ধতিটি ব্যবহার থেকে বিচার করে, এটি কেস নয়।

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

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

ইউআইতে কীভাবে এটি করা যায় তার দুটি উদাহরণ হ'ল:

  • প্রাক-এইচটিএমএল 5 : * ব্যবহারকারীর কাছে একটি জেএস নিশ্চিতকরণ ডায়ালগ প্রদর্শন করুন এবং কেবলমাত্র ব্যবহারকারী এটি নিশ্চিত করলেই অনুরোধটি প্রেরণ করুন
  • এইচটিএমএল 5 : * অ্যাকশন ডিলিটি সহ একটি ফর্ম ব্যবহার করুন যেখানে ফর্মটিতে কেবল "নিশ্চিতকরণ" এবং "বাতিল" বোতাম থাকবে ("নিশ্চিতকরণ" জমা দেওয়ার বোতাম হবে)

(*) দয়া করে নোট করুন যে 5 টি পূর্ববর্তী এইচটিএমএল সংস্করণগুলি পুট এবং HTTP পদ্ধতিগুলি স্থানীয়ভাবে সমর্থন করে না, তবে বেশিরভাগ আধুনিক ব্রাউজারগুলি এজেএক্স কলগুলির মাধ্যমে এই দুটি পদ্ধতি করতে পারে। ক্রস ব্রাউজার সমর্থন সম্পর্কে বিশদ জানতে এই থ্রেডটি দেখুন ।


আপডেট (অতিরিক্ত তদন্ত এবং আলোচনার ভিত্তিতে):

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

সুতরাং একবার পরিষেবাটি মোছার অনুরোধটি পেয়ে গেলে এটির কোনও অতিরিক্ত নিশ্চিতকরণের প্রয়োজন ছাড়াই এটি প্রক্রিয়া করা উচিত (পরিষেবাটি প্রকৃতপক্ষে অপারেশনটি সম্পাদন করে না কেন)।


2
কোন REST সীমাবদ্ধতা লঙ্ঘিত হচ্ছে তা আপনি ব্যাখ্যা করতে পারেন? ইউআরআইগুলি ক্লায়েন্টের কাছে অস্বচ্ছ হওয়া উচিত তা বিবেচনা করে আপনি কেন বিশ্বাস করেন যে ক্লায়েন্টের প্রত্যাশাগুলি কোনও এইচটিটিপি ডিলেট ব্যবহারের সাথে পূরণ করা হচ্ছে না যা একটি সংস্থান মুছে ফেলে তবে অন্যটিকে মুছতে ব্যর্থ হয়। আমি নিশ্চিত নই যে 409 ফেরত দেওয়ার জন্য সর্বোত্তম স্ট্যাটাস কোড তবে অদ্ভুত বাস্তবায়ন হওয়ার পরেও, আমি ভাঙ্গা হচ্ছে এমন কোনও REST সীমাবদ্ধতা খুঁজে পাচ্ছি না।
ড্যারেল মিলার

2
@ ড্যারেল: (ইমো) এটি ডিলিট পদ্ধতি দ্বারা অভিন্ন ইন্টারফেস লঙ্ঘন করে যা এইচটিটিপি মান হিসাবে না সম্পাদন করে। একটি আরইএসটি ক্লায়েন্ট বিবেচনা করুন যা একটি স্ট্যান্ডার্ড আরএসটি পরিষেবা গ্রহণ করে - পরিষেবা কীভাবে ক্লায়েন্টকে জানাতে পারে যে এটি যুক্ত করা দরকার force_delete=true? এইচটিটিপি আরএফসি অনুসারে, মুছে ফেলা পদ্ধতিটি মূল সার্ভারে (ক্লায়েন্ট) ওভাররাইড হয়ে যেতে পারে, বোঝা যাচ্ছে যে এটি টার্গেট সার্ভারে (পরিষেবা) করা হয়নি। সুতরাং আমার বোধগম্যতা হল যে একবার পরিষেবাটি মোছার অনুরোধটি পেয়ে গেলে এটি কোনও নিশ্চিতকরণের প্রয়োজন ছাড়াই এটি প্রক্রিয়া করা উচিত (পরিষেবাটি প্রকৃতপক্ষে অপারেশনটি সম্পাদন করে না কেন)।
মাইকে

1
@ ক্রিস, আপনার দ্বিতীয় বক্তব্য: হ্যাঁ, এটি আমার বোধগম্যতাও বটে, অর্থাত্ রাজ্যটি একটি সত্য বিরোধের পরামর্শ দেয় এবং নিশ্চিতকরণের প্রয়োজন হয় না। আপনি আপনার প্রশ্নে যা আপডেট করেছেন তা আমি কেবলমাত্র লক্ষ্য করেছি এবং আমি সম্মত হয়েছি - আমি নিজে এটি খতিয়ে দেখার সময় আমি একই সিদ্ধান্তে পৌঁছেছি (এটি ইউনিফর্মের ইন্টারফেসকে লঙ্ঘন করে, এবং নিশ্চিতকরণটি ক্লায়েন্ট / ইউআইতে করা উচিত) পাশ)। আমি এখানে একটি খুব আকর্ষণীয় থ্রেড জুড়ে দৌড়েছি, এটি সাহায্য করতে পারে: মেইল-archive.com/pylons-discuss@googlegroups.com/msg13578.html
মাইকে

2
@ মাইসি অনেকাংশে আমি আপনার সাথে একমত হই যে এই পরিস্থিতিটি পরিচালনা করার জন্য এটি আদর্শ উপায় নয়। আমি "এটি বিশ্রাম নয়" লেবেলটি সম্পর্কে কিছুটা বাছাই করছি। কিছুক্ষণের জন্য এখানে এই শব্দগুচ্ছটি সবকিছু ছুঁড়ে ফেলা হয়েছিল। যাইহোক, মিডিয়া টাইপের নিয়মগুলি সংজ্ঞায়িত করা সম্ভব হবে যা বলে যে আপনি যদি কোনও সংস্থান হ্রাস করার চেষ্টা করেন এবং আপনি একটি ত্রুটি পান (আমি বলব 403 হারাম 409 এর চেয়ে ভাল হবে), তবে ক্লায়েন্টকে সংশ্লিষ্ট সংস্থান থেকে মুছে ফেলার চেষ্টা করতে হবে একটি "ফোর্স_ডিলেট = সত্য" এ টিক দিয়ে। একরকমভাবে এটি অনুমোদনের মতো কিছুটা। GET করুন, 401 পান, লেখকের শিরোনাম যুক্ত করুন এবং আবার GET পান।
ড্যারেল মিলার

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

35

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

ফোর্স_ডিলেট = নির্দিষ্ট করার অর্থ কি এটি যদি কোনও প্রোগ্রামের এপিআই হয়? যদি কেউ এই সংস্থানটি মোছার জন্য কোনও স্ক্রিপ্ট লিখছেন, আপনি কি তাদের উত্সটিকে মুছে ফেলার জন্য ফোর্স_ডিলেট = সত্য নির্দিষ্ট করতে বাধ্য করতে চান?


আপনার প্রতিক্রিয়াটির প্রথম অনুচ্ছেদটি আপনার মতামত এবং আমি সম্মান করি তবে আপনি সাহিত্যের এমন কোনও দিকে নির্দেশ করেননি যা ইউআরআই এর ব্যবহার যেমন নিষিদ্ধ করে - এটি এখনও সংস্থানটি সনাক্ত করে এবং সবচেয়ে উপযুক্ত এইচটিটিপি ক্রিয়া ব্যবহৃত হচ্ছে। আপনার প্রশ্নের উত্তরে; হ্যাঁ এটি এখনও বোধগম্য হবে (আমার মতে)। আমি একটি স্ক্রিপ্ট আশা করি (সম্ভবত সিআরএল উপর ভিত্তি করে) 409 প্রতিক্রিয়াটি শ্রদ্ধা করবে এবং ব্যবহারকারীকে অনুরোধটি কীভাবে প্রেরণ করা যায় - আমার প্রতিক্রিয়া সংস্থার উপর ভিত্তি করে
ক্রিস ম্যাককলি

ওয়েব এপিআইকে কোনও প্রোগ্রামের এপিআইয়ের সাথে তুলনা করার জন্য ভাল বিষয়। এপিআইটি বিশ্রামযুক্ত কিনা তা প্রায়শই সন্ধান করার ভাল উপায়।
লরেন্ট

18

এটি একটি পুরানো প্রশ্ন, তবে এখানে কিছু মন্তব্য ...

  1. এসকিউএলে, ডিলিট কমান্ডটি "ক্যাসকেড" একটি প্যারামিটার গ্রহণ করে, যা আপনাকে নির্দিষ্ট করতে দেয় যে নির্ভরশীল অবজেক্টগুলিও মুছে ফেলা উচিত। এটি মুছে ফেলা প্যারামিটারের উদাহরণ যা বোধগম্য হয় তবে 'ম্যান আরএম' অন্যকে সরবরাহ করতে পারে। প্যারামিটার ব্যতীত কীভাবে এই কেসগুলি সম্ভবত REST / HTTP তে প্রয়োগ করা হবে?
  2. @ জান, এটি একটি সুপ্রতিষ্ঠিত সম্মেলন বলে মনে হচ্ছে যে URL এর পথ অংশটি একটি সংস্থান চিহ্নিত করে, যেখানে ক্যোয়ারিং স্ট্রিং (কমপক্ষে প্রয়োজনীয়ভাবে নয়)। উদাহরণগুলি প্রচুর: একই রিসোর্সটি পাওয়া তবে অন্য একটি ফর্ম্যাটে, কোনও উত্সের নির্দিষ্ট ক্ষেত্রগুলি পাওয়া ইত্যাদি we এইচটিটিপি বিষয়বস্তু আলোচনার মতো অ-রেস্টস্টুল মেকানিজমের দিকে ঝুঁকিতে না পড়ে (যা অনেক কারণে অবাঞ্ছিত হতে পারে)।

এটি কথোপকথনে যোগ করার জন্য ধন্যবাদ, যদিও এটি কথোপকথনটি দীর্ঘকাল ধরে চলে না।
সিলভিট

6

অ্যালেক্সের উত্তর ছাড়াও:

মনে রাখবেন যে http: // সার্ভার / রিসোর্স / আইডি? বল_ডিলেট = সত্য http: // সার্ভার / রিসোর্স / আইডি থেকে আলাদা একটি উত্স চিহ্নিত করে । উদাহরণস্বরূপ, আপনি / গ্রাহকদের /? অবস্থা = পুরানো বা / গ্রাহক / মুছে ফেলুন কিনা তা একটি বিশাল পার্থক্য।

জানুয়ারী


আমি একমত নই, একই সংস্থানটি সনাক্ত করতে আমি একাধিক ইউআরআই সরবরাহ করতে পারি।
ক্রিস ম্যাককলি

18
হ্যাঁ - প্রত্যেকে
জান আলগার্মিসসেন

ক্যানোনিকাল ইউআরআই এর ইঙ্গিতটি এতে
মাইকে

@ ক্রিস কেবলমাত্র একটি ইউআরআই থাকা উচিত যা কোনও সংস্থার প্রতিনিধিত্ব করে। অন্যান্য ইউআরআই'র একই ধারণাটি উল্লেখ করা যেতে পারে তবে জিইটি করা হলে 303 টি ফিরে আসা উচিত। এবং কেবল এটির স্পষ্ট আপত্তি মোকাবেলা করার জন্য, /foo.xML এবং /foo.json দুটি পৃথক সংস্থান।
ড্যারেল মিলার

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