কোনও HTTP মোছার অনুরোধ জারি করার সময়, অনুরোধটি ইউআরআই মুছে ফেলার জন্য সম্পদটি সম্পূর্ণরূপে সনাক্ত করা উচিত। তবে, অনুরোধের সত্তার অংশ হিসাবে অতিরিক্ত মেটা-ডেটা যুক্ত করার অনুমতি রয়েছে কি?
কোনও HTTP মোছার অনুরোধ জারি করার সময়, অনুরোধটি ইউআরআই মুছে ফেলার জন্য সম্পদটি সম্পূর্ণরূপে সনাক্ত করা উচিত। তবে, অনুরোধের সত্তার অংশ হিসাবে অতিরিক্ত মেটা-ডেটা যুক্ত করার অনুমতি রয়েছে কি?
উত্তর:
অনুমানটি স্পষ্টভাবে এটি নিষিদ্ধ বা নিরুৎসাহিত করে না, তাই আমি এটির অনুমোদিত বলে বলব।
মাইক্রোসফ্ট এটিকে একইভাবে দেখেছে (আমি শ্রোতাদের মধ্যে বচসা শুনতে পাচ্ছি), তারা এমএসডিএন নিবন্ধে অ্যাডো.নেট ডেটা সার্ভিসেস ফ্রেমওয়ার্কের মোছার পদ্ধতিটি সম্পর্কে বলেছেন :
যদি একটি মোছার অনুরোধে কোনও সত্তা সংস্থা অন্তর্ভুক্ত থাকে, তবে শরীরটি উপেক্ষা করা হবে [...]
অতিরিক্তভাবে এখানে অনুরোধের বিষয়ে আরএফসি 2616 (HTTP 1.1) এর যা বলতে হবে তা এখানে রয়েছে :
Content-Length
বা Transfer-Encoding
শিরোলেখের অন্তর্ভুক্তি দ্বারা সংকেতযুক্ত (বিভাগ 4.3)প্রতিক্রিয়াগুলির জন্য, এটি সংজ্ঞায়িত করা হয়েছে:
HTTP 1.1 স্পেসিফিকেশন ( আরএফসি 7231 ) এর সর্বশেষ আপডেটটি মুছে ফেলার অনুরোধে একটি সত্তা সংস্থাটিকে স্পষ্টভাবে অনুমতি দেয়:
একটি মোছার অনুরোধ বার্তার মধ্যে একটি পেডের কোনও নির্ধারিত শব্দার্থবিজ্ঞান নেই; একটি মোছার অনুরোধে পে-লোড বডি প্রেরণের ফলে কিছু বিদ্যমান বাস্তবায়ন অনুরোধটিকে প্রত্যাখ্যান করতে পারে।
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.
সুতরাং এটি একটি পশ্চাদপটে সামঞ্জস্যতার সতর্কতা সহ আসে, এটি পরামর্শ দিচ্ছে যে পরবর্তী মানটি বলবে: 'হ্যাঁ! DELETE
একটি শরীর থাকতে পারে `
A payload within a DELETE request message has no defined semantics
। সুতরাং শরীর অনুমতি দেওয়া হয়।
টমক্যাট এবং জেটির কিছু সংস্করণ মনে হয় কোনও সত্তা বডি উপস্থিত থাকলে তা উপেক্ষা করবে। আপনি যদি এটি গ্রহণ করার ইচ্ছা করেন তবে এটি কোনও উপদ্রব হতে পারে।
মুছে ফেলার অনুরোধে দেহটি ব্যবহার করার একটি কারণ হ'ল আশাবাদী সম্মতি নিয়ন্ত্রণ for
আপনি একটি রেকর্ডের সংস্করণ 1 পড়েন।
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
আপনার সহকর্মী রেকর্ডের সংস্করণ 1 পড়েন।
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
আপনার সহকর্মী রেকর্ড পরিবর্তন করে এবং ডাটাবেস আপডেট করে, যা সংস্করণটি 2 তে আপডেট করে:
PUT /some-resource/1 { id:1, status:"important", version:1 }
200 OK { id:1, status:"important", version:2 }
আপনি রেকর্ডটি মুছতে চেষ্টা করুন:
DELETE /some-resource/1 { id:1, version:1 }
409 Conflict
আপনার একটি আশাবাদী লক ব্যতিক্রম পাওয়া উচিত। রেকর্ডটি পুনরায় পড়ুন, দেখুন এটি গুরুত্বপূর্ণ, এবং সম্ভবত এটি মুছবেন না।
এটির ব্যবহারের আর একটি কারণ হ'ল একাধিক রেকর্ডগুলি মুছে ফেলা (উদাহরণস্বরূপ, সারি-নির্বাচন চেক-বাক্স সহ একটি গ্রিড)।
DELETE /messages
[{id:1, version:2},
{id:99, version:3}]
204 No Content
লক্ষ্য করুন যে প্রতিটি বার্তার নিজস্ব সংস্করণ রয়েছে। হতে পারে আপনি একাধিক শিরোনাম ব্যবহার করে একাধিক সংস্করণ নির্দিষ্ট করতে পারেন তবে জর্জের মতে এটি সহজ এবং আরও সুবিধাজনক।
এটি টমক্যাট (7.0.52) এবং স্প্রিং এমভিসি (4.05) এ কাজ করে, সম্ভবত সম্ভবত পূর্ববর্তী সংস্করণগুলিও:
@RestController
public class TestController {
@RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
SomeBean echoDelete(@RequestBody SomeBean someBean) {
return someBean;
}
}
If-Unmodified-Since
বা Etag
, এটি তাদের জন্য)।
আমার কাছে মনে হচ্ছে আরএফসি 2616 এটি নির্দিষ্ট করে না।
বিভাগ ৪.৩ থেকে:
একটি অনুরোধে একটি বার্তা-বডির উপস্থিতি অনুরোধের বার্তা-শিরোনামগুলিতে কোনও সামগ্রী-দৈর্ঘ্য বা স্থানান্তর-এনকোডিং শিরোনাম ক্ষেত্র অন্তর্ভুক্তির দ্বারা সংকেত দেওয়া হয়। অনুরোধ পদ্ধতির স্পেসিফিকেশন (বিভাগ 5.1.1) অনুরোধে কোনও সত্তা-দেহ প্রেরণের অনুমতি না দিলে একটি বার্তা-বডি একটি অনুরোধে অন্তর্ভুক্ত করা উচিত নয়। কোনও সার্ভার কোনও অনুরোধে একটি বার্তা-বডি পড়তে এবং ফরোয়ার্ড করা উচিত; যদি অনুরোধ পদ্ধতিতে কোনও সত্তা-দেহের জন্য সংজ্ঞায়িত শব্দার্থকে অন্তর্ভুক্ত না করা হয়, তবে অনুরোধটি পরিচালনা করার সময় বার্তা-বডিটি উপেক্ষা করা উচিত।
এবং বিভাগ 9.7:
মোছা পদ্ধতিটি অনুরোধ করে যে উত্স সার্ভারটি অনুরোধ-ইউআরআই দ্বারা চিহ্নিত সংস্থানটি মুছে ফেলবে। এই পদ্ধতিটি মূল সার্ভারে মানুষের হস্তক্ষেপ (বা অন্য উপায়ে) দ্বারা উপেক্ষা করা যেতে পারে। ক্লায়েন্টটির গ্যারান্টি দেওয়া যায় না যে অপারেশনটি সম্পন্ন হয়েছে, এমনকি উত্স সার্ভার থেকে স্থিতি কোডটি ইঙ্গিত দেয় যে ক্রিয়াটি সফলভাবে সম্পন্ন হয়েছে। তবে সার্ভারটি সাফল্য নির্দেশ করবে না যতক্ষণ না, প্রতিক্রিয়া দেওয়ার সময়, এটি উত্সটি মোছার বা এটিকে একটি অ্যাক্সেস অ্যাক্সেসযোগ্য স্থানে সরিয়ে নেওয়ার ইচ্ছা করে।
একটি সফল প্রতিক্রিয়া 200 (ঠিক আছে) হওয়া উচিত যদি প্রতিক্রিয়াটির স্থিতি বর্ণনা করে এমন একটি সত্তা অন্তর্ভুক্ত থাকে, 202 (স্বীকৃত) যদি ক্রিয়াটি এখনও কার্যকর করা হয়নি, বা 204 (কোনও বিষয়বস্তু নেই) যদি পদক্ষেপ কার্যকর করা হয়েছে তবে প্রতিক্রিয়াটি অন্তর্ভুক্ত না একটি সত্তা.
যদি অনুরোধটি একটি ক্যাশে যায় এবং অনুরোধ-ইউআরআই এক বা একাধিক বর্তমানে ক্যাশে থাকা সত্তা সনাক্ত করে, সেই প্রবেশগুলিকে বাসি হিসাবে বিবেচনা করা উচিত। এই পদ্ধতির প্রতিক্রিয়াগুলি ক্যাশেযোগ্য নয় .c
সুতরাং এটি স্পষ্টভাবে অনুমোদিত বা অস্বীকৃত নয় এবং পথের একটি প্রক্সি বার্তার মূল অংশটি সরিয়ে ফেলতে পারে (যদিও এটি এটি পড়তে এবং ফরোয়ার্ড করা উচিত)।
কেবলমাত্র শীর্ষস্থানীয়, আপনি যদি আপনার ডিলিট অনুরোধে কোনও দেহ সরবরাহ করেন এবং কোনও গুগল ক্লাউড এইচটিটিপিএস লোড ব্যালেন্সার ব্যবহার করছেন, এটি আপনার অনুরোধকে 400 ত্রুটির সাথে প্রত্যাখ্যান করবে। আমি একটি প্রাচীরের বিপরীতে মাথা ঠেকছিলাম এবং জানতে পেরেছিলাম যে কোনও কারণেই, গুগল মনে করে কোনও দেহের সাথে একটি মোছার অনুরোধ একটি ত্রুটিযুক্ত অনুরোধ।
for whatever reason
- কারণ
DELETE
হ'ল পরে।
দেখে মনে হচ্ছে ইলাস্টিক অনুসন্ধান এটি ব্যবহার করে: https://www.elastic.co/guide/en/elasticsearch/references/5.x/search-request-scrol.html#_clear_scrol_api
যার অর্থ নেটটি এটি সমর্থন করে।
মতামত উল্লিখিত মত এটি আর হতে পারে না
এইচটিটিপি মেলিং তালিকায় রয় ফিল্ডিং স্পষ্ট করে যে HTTP মেলিং তালিকায় https://lists.w3.org/ আর্কাইভস / প্রজাতন্ত্র / হিট্প-http-wg/2020 জনমারে/0123.html এবং বলেছেন:
GET / DELETE বডিটি অনুরোধের প্রক্রিয়াজাতকরণ বা ব্যাখ্যার উপর যে কোনও প্রভাব ফেলতে একেবারেই নিষিদ্ধ
এর অর্থ এই যে শরীরটি অবশ্যই সার্ভারের আচরণটি পরিবর্তন করবে না। তারপরে তিনি যুক্ত করেছেন:
বার্তাটি ফ্রেমিং বজায় রাখার জন্য প্রাপ্ত বাইটগুলি পড়ার এবং ফেলে দেওয়ার প্রয়োজনীয়তা বাদ করুন।
এবং অবশেষে শরীরকে নিষেধ না করার কারণ:
আমরা দেহ প্রেরণ নিষিদ্ধ করার একমাত্র কারণ হ'ল এটি অনুমান করে যে কোনও দেহ প্রেরণ করা হবে না তা অলস বাস্তবায়নের দিকে পরিচালিত করবে।
সুতরাং যখন ক্লায়েন্টরা পে-লোড বডিটি প্রেরণ করতে পারে, সার্ভারগুলি এটিকে ফেলে দেওয়া উচিত এবং API গুলি সেই অনুরোধগুলিতে পে-লোড বডিটির জন্য কোনও অর্থ বোঝাতে পারে না।
এটি সংজ্ঞায়িত করা হয় না ।
একটি মোছার অনুরোধ বার্তার মধ্যে একটি পেডের কোনও নির্ধারিত শব্দার্থবিজ্ঞান নেই; একটি মোছার অনুরোধে পে-লোড বডি প্রেরণের ফলে কিছু বিদ্যমান বাস্তবায়ন অনুরোধটিকে প্রত্যাখ্যান করতে পারে।
https://tools.ietf.org/html/rfc7231#page-29
কোনও দেহের সাথে মুছে ফেলা ঝুঁকিপূর্ণ ... আমি REST- র উপরে তালিকা অপারেশনের জন্য এই পদ্ধতির পছন্দ করি:
নিয়মিত অপারেশন
GET / অবজেক্টস / সমস্ত অবজেক্টস পান
GET / অবজেক্ট / আইডি নির্দিষ্ট আইডির সাথে একটি অবজেক্ট পায়
পোস্ট / অবজেক্টস একটি নতুন অবজেক্ট যুক্ত করে
পুট / অবজেক্ট / আইডি নির্দিষ্ট আইডি সহ একটি অবজেক্ট যুক্ত করে, একটি অবজেক্ট আপডেট করে
মোছা / অবজেক্ট / আইডি নির্দিষ্ট আইডি সহ অবজেক্টটিকে মুছে দেয়
সমস্ত কাস্টম ক্রিয়া পোস্ট করা হয়
পোস্ট / অবজেক্টস / অ্যাডলিস্ট শরীরের অন্তর্ভুক্ত অবজেক্টগুলির একটি তালিকা বা অ্যারে যুক্ত করে
পোস্ট / অবজেক্টস / ডিলিটলিস্ট শরীরের অন্তর্ভুক্ত অবজেক্টগুলির একটি তালিকা মুছে দেয়
পোস্ট / অবজেক্টস / কাস্টমকিউয়ারি শরীরে কাস্টম ক্যোয়ারির উপর ভিত্তি করে একটি তালিকা তৈরি করে
যদি কোনও ক্লায়েন্ট আপনার বর্ধিত ক্রিয়াকলাপগুলি সমর্থন না করে তবে তারা নিয়মিতভাবে কাজ করতে পারে।
POST
নতুন রিসোর্স তৈরির জন্য একটি ব্যবহার করা ভাল রেস্টস্টি উপায় নয় কারণ পোস্ট পোস্টের প্রতিক্রিয়াগুলির শব্দার্থকতা অস্পষ্ট, বিশেষত লোকেশন শিরোনামের প্রসঙ্গে। আপনি মূলত এইচটিটিপিকে পিছনে রেখে আরপিসিকে উপরে রেখে দিচ্ছেন। সঠিক "এইচটিটিপি / আরএসটি উপায়" হ'ল ডাব্লু PUT
/ If-None-Match: *
হেডার ব্যবহার করে সংস্থান তৈরি করা (বা সঠিক HTTP পদ্ধতি নির্দিষ্ট করা, MKCOL
ইত্যাদি দেখুন)।
আমি মনে করি না যে এটির একটি ভাল উত্তর পোস্ট করা হয়েছে, যদিও বিদ্যমান উত্তরের উপর প্রচুর দুর্দান্ত মন্তব্য রয়েছে। আমি এই মন্তব্যের সংক্ষেপটি একটি নতুন উত্তরে তুলে ধরব:
আরএফসি 7231 এর এই অনুচ্ছেদটি কয়েকবার উদ্ধৃত হয়েছে, যা এটির যোগফল করে।
একটি মোছার অনুরোধ বার্তার মধ্যে একটি পেডের কোনও নির্ধারিত শব্দার্থবিজ্ঞান নেই; একটি মোছার অনুরোধে পে-লোড বডি প্রেরণের ফলে কিছু বিদ্যমান বাস্তবায়ন অনুরোধটিকে প্রত্যাখ্যান করতে পারে।
অন্যান্য উত্তরগুলি থেকে আমি যা হারিয়েছি তা হ'ল অন্তর্ভুক্ত। হ্যাঁ DELETE
অনুরোধের ভিত্তিতে এটি একটি বডি অন্তর্ভুক্ত করার অনুমতি দেওয়া হয়েছে তবে এটি শব্দার্থগতভাবে অর্থহীন। এর সত্যিকারের অর্থ হ'ল DELETE
একটি অনুরোধ সংস্থার সাথে একটি অনুরোধ জারি করা শব্দার্থগতভাবে অনুরোধের বডি অন্তর্ভুক্ত না করার সমতুল্য।
একটি অনুরোধ বডি সহ অন্তর্ভুক্তির অনুরোধটিতে কোনও প্রভাব ফেলতে হবে না, তাই এটি অন্তর্ভুক্ত করার কোনও কারণ নেই।
tl; dr: প্রযুক্তিগতভাবে DELETE
একটি অনুরোধ বডি সহ একটি অনুরোধ অনুমোদিত, তবে এটি কখনও কার্যকর হয় না।
যদি কেউ এই সমস্যাটির পরীক্ষায় চলেছে তবে তা সর্বজনীনভাবে সমর্থনযোগ্য নয়।
আমি বর্তমানে সহি প্রো সাথে পরীক্ষা করছি এবং এটি খুব স্পষ্ট যে কোনও পোস্ট ডিলিট কল কোনও প্রদত্ত বডি ডেটা (এন্ডপয়েন্ট ডিজাইন অনুযায়ী বাল্কে মুছতে আইডির একটি বৃহত তালিকা) কেটে যায়।
আমি তাদের সাথে বেশ কয়েকবার যোগাযোগ করেছি এবং তাদের সাথে পর্যালোচনা করার জন্য স্ক্রিপ, চিত্র, লগের পৃথক তিনটি প্যাকেজ পাঠিয়েছি এবং তারা এখনও এটি নিশ্চিত করে নি। একটি ব্যর্থ প্যাচ, এবং একটি মিস কনফারেন্স পরে তাদের সহায়তায় কল করে এবং আমি এখনও একটি শক্ত উত্তর পাইনি।
আমি নিশ্চিত যে সহি এটি সমর্থন করে না, এবং আমি স্যুট অনুসরণ করার মতো আরও অনেক সরঞ্জাম কল্পনা করব।
নীচে থাকা গিথইউবি ইউআরএল আপনাকে উত্তর পেতে সাহায্য করবে। প্রকৃতপক্ষে, টমক্যাটের মতো অ্যাপ্লিকেশন সার্ভার, ওয়েবলোগিক অনুরোধ পেডের সাথে HTTP.DELETE কল অস্বীকার করছে। সুতরাং এই সমস্ত বিষয় মাথায় রেখে আমি গিথুব-এ উদাহরণ যুক্ত করেছি, দয়া করে এটি একবার দেখুন
আমি একটি অনুরোধ সংস্থার সাথে মুছে ফেলা অপারেশন বাস্তবায়ন করতে সক্ষম হয়েছি। আমি এডাব্লুএস ল্যাম্বদা এবং এডাব্লুএস এপিআই গেটওয়ে ব্যবহার করেছি এবং গো ভাষা ব্যবহার করেছি।