আংশিকভাবে পুট বা মুছে দিয়ে কোনও সংগ্রহ পরিবর্তন করা ঠিক আছে কি?


21

আমার কাছে একটি পণ্য গ্রুপে পণ্যগুলির সংগ্রহ রয়েছে যেমন:

product-groups/123/products
  1. যদি আমাকে সংগ্রহে যোগ করার দরকার হয় তবে এটি ঠিক আছে যে আমি পুট দিয়ে কিছু পণ্যই পাস করি ?

  2. আমার যদি সংগ্রহ থেকে কিছু পণ্য মুছতে হয় তবে আমি কী ফিল্টার ডেটা (আইডির একটি অ্যারে) মুছে ফেলতে পারি?

আরএসটি-র অনুপ্রেরণায় কার্যকারিতা বাস্তবায়নের সর্বোত্তম উপায় কোনটি?

সম্পাদনা করুন: আইটেমগুলি পৃথক সত্তার লিঙ্ক, মূলত পণ্যের আইডির।


পণ্য গ্রুপের আইটেমগুলি কি অন্য কোথাও পরিচালিত হয়? বা এগুলি কেবল পণ্য গ্রুপ সংগ্রহেরই অংশ? পৃথক হলে, পণ্যগুলি একাধিক পণ্য গোষ্ঠীর অন্তর্ভুক্ত থাকতে পারে?
মার্টিজন পিটার্স

2
সম্ভবত প্যাচ এই স্পেসিফিকেশনটি নতুন এইচটিটিপি / ১.১ [আরএফসি 2616] পদ্ধতি, প্যাচচএইচকে সংজ্ঞায়িত করে, যা কোনও সংস্থার আংশিক পরিবর্তনগুলি প্রয়োগ করতে ব্যবহৃত হয়।
ইসাইলিজা

একটি পণ্য (আইডি) বেশ কয়েকটি পণ্য গোষ্ঠীর অন্তর্ভুক্ত থাকতে পারে।
ব্যবহারকারী 151851

কীভাবে প্যাচচ্যাচ করা যায় তা জানার জন্য কোনও সুপরিচিত উপায় (সর্বোত্তম অনুশীলন) আছে কি না বা সংগ্রহগুলিতে পণ্য যুক্ত করতে বা মুছতে পারে?
ব্যবহারকারী 151851

তাই একই প্রশ্ন stackoverflow.com/questions/411462/...
লুক Puplett

উত্তর:


10

সাধারণভাবে আপনার কাছে একটি প্রান্ত রয়েছে যা এক্স এর সম্পূর্ণ সংগ্রহকে উপস্থাপন করে :

/products

বলুন, আপনি একটি একক পণ্য আপডেট করতে চান, আপনি একটি পুট তৈরি করেন /products/{id}। আপনি যদি কোনও একক পণ্য আংশিকভাবে আপডেট করতে চান (প্রতিটি ক্ষেত্র আপডেট না করে), আপনি এতে একটি প্যাচও ব্যবহার করতে পারেন /products/{id}। একই একটি একক সত্তা মুছে ফেলার (জন্য যায় DELETE করতে /products/{id})।

যদি আপনি একটি একক রিসোর্স লক্ষ্য করতে চান , আপনি পথের মাধ্যমে যোগ্যতা অর্জন করুন, কোন একক রিসোর্স, আপনি সংশোধন করতে চান।

শুধুমাত্র কর্ম যা স্কিম ভাঙ্গে সৃষ্টি একটি ressource করুন। যখন একটি ressource আপনি একটি সম্পূর্ণ হিসাবে সংগ্রহ লক্ষ্য তৈরি বলে পোষ্ট করতে /products

এটি বলেছিল, এটি পরিষ্কার হওয়া উচিত যে সামগ্রিকভাবে সামগ্রিকভাবে প্রভাবিত করে এমন ক্রিয়াকলাপের লক্ষ্যটি যথাযথ সংগ্রহ-শেষের পয়েন্টে যেতে হবে।

যেমন আপনি লাল রঙের পণ্যগুলির একটি উপসেট পুনরুদ্ধার করতে চান, আপনি এটির জন্য জিজ্ঞাসা করেছেন

পান করার জন্য /products?colour=red

সুতরাং, আপনি যদি এই সমস্তগুলি মুছতে চান তবে আপনি মুছে ফেলুন /products?colour=red। অথবা আপনি যদি মাধ্যমে কয়েকটি পণ্য মুছে ফেলতে চান id, আপনি পারে DELETE /products?id=1&id=2&id=3

রিসোর্স বাল্ক তৈরি সম্পর্কে কি ? আপনার সংগ্রহটি কেবল পোস্ট করুন । পুট এবং প্যাচ-তে একই হয় ।[{...},{...},{...}]/products

এটা সত্যিই সোজা।

আপনার প্রশ্নের উত্তর দিতে:

যদি আমাকে সংগ্রহে যোগ করার দরকার হয় তবে এটি ঠিক আছে যে আমি পুট দিয়ে কিছু পণ্যই পাস করি?

এটি কেবল ঠিক নয়, আপনাকে এটির মতো করতে উত্সাহ দেওয়া হচ্ছে।

আমার যদি সংগ্রহ থেকে কিছু পণ্য মুছতে হয় তবে আমি কী ফিল্টার ডেটা (আইডির একটি অ্যারে) মুছে ফেলতে পারি?

এটা ঠিক আছে. যেমন এনেকো অ্যালোনসো লিখেছেন, মাঝে মাঝে বাল্কোপরেশনগুলি "কন্ট্রোলার" -অন্ডপয়েন্টস এর সাহায্যে এনক্যাপুলেটেড থাকে, অর্থাত্ একটি জটিলটি (জটিল) ক্রিয়াকলাপের জন্য একটি POST ব্যবহৃত হয়।


2
পুট একটি প্রতিস্থাপন অপারেশন। "কিছু পণ্য" দিয়ে সংগ্রহের শেষ পয়েন্টে PUT কল করার সাথে "কিছু পণ্য" তালিকার অন্তর্ভুক্ত নয় এমন কোনও পণ্য মুছে ফেলা উচিত (ওপি'র ক্ষেত্রে, সম্পর্কটি মুছে ফেলা উচিত)। এটি আইটেম যুক্ত করতে ব্যবহৃত হতে পারে, এরপরে এটি ওপেনের প্রত্যাশা নয় এমন আইটেমগুলি (আমার মতে) অপসারণ করা উচিত। সেই অনুযায়ী তাদের প্রথম প্রশ্নের আপনার প্রতিক্রিয়াটি আপনার সংশোধন করা উচিত।
ক্লাটিটন্ড

@ ক্লেটন্ড: আমি মনে করি উত্তরটি ঠিক আছে, যতক্ষণ না কোনও আংশিক আপডেট করা হয় PATCHএবং এর মাধ্যমে সম্পূর্ণ প্রতিস্থাপন করা হয় PUT
9:01

4
@ 9000। অবশ্যই, তবে উত্তরটি এখন বলেছে "আপনাকে সংগ্রহের জন্য উত্সাহিত করা হচ্ছে ... সংগ্রহের সাথে যুক্ত করুন ... [পিছু] পাস [আইএনএস] কেবল পিইটি দিয়ে কিছু পণ্য"। এটা অবশ্যই ভুল। পোস্টে উত্সাহিত। পুতে সক্ষম ... তবে কেবলমাত্র (কিছু নয়) সমস্ত আইটেম পাস করার মাধ্যমে।
মৃত্তিকা

5

সাধারণত, আরআরইএসটি পদ্ধতিগুলি একটি একক সত্তা / অবজেক্ট (সিআরইউডি) এ পরিচালনা করার উদ্দেশ্যে থাকে।

বিভিন্ন বিকল্প রয়েছে:

  • আপনার সংগ্রহগুলি সত্তা হিসাবে বিবেচনা করুন এবং সেগুলি পোস্টের মাধ্যমে আপডেট করুন
  • বিকল্প, অ-REST অপারেশন তৈরি করুন

প্রথমটি REST মান অনুসরণ করে তবে ব্যয়বহুল হতে পারে, যেহেতু আপনার সংগ্রহের বিষয়গুলি / সত্তাগুলি খুব বড় হতে পারে (একটি গ্রুপকে আপডেট করা যাতে হাজারে পণ্য রয়েছে কেবল একটি পণ্য যুক্ত / অপসারণের জন্য একটি ভারী অনুরোধ হবে)।

দ্বিতীয় বিকল্পটি অনেকগুলি এপিআই দ্বারা পছন্দ করা হয়, সিআরইউডি অপারেশনগুলির বাইরে REST প্রসারিত করার উপায় হিসাবে।

উদাহরণ স্বরূপ:

GET product-groups/123/products (list all the products in the group)
POST product-groups/123/products/append (POST a list of new product ids to append to the group)
POST product-groups/123/products/remove (POST a list of product ids to remove from the group)

অনেকগুলি API গুলি এই বর্ধিত ক্রিয়াকলাপের জন্য সর্বদা POST ব্যবহার করে তবে কিছুই অন্য কোনও HTTP পদ্ধতি ব্যবহার করতে সীমাবদ্ধ করে না (GET এর সীমাবদ্ধতা ব্যতীত এবং খালি দেহ পেতে ডিলেট করে)


অবশ্যই, লক্ষ্যে পৌঁছানোর জন্য কয়েকটি পদ্ধতি রয়েছে। কোনটি সেরা অনুশীলন? কোনটি ভবিষ্যতের প্রুফ হবে?
ব্যবহারকারী 151851

4
@ ব্যবহারকারী 151851: মোট REST সম্মতি (যদি এমন কোনও জিনিস থাকে) একটি উচ্চ লক্ষ্য। এখানে পদ্ধতির রূপরেখা আরও বাস্তবসম্মত বলে মনে হচ্ছে, যদিও এটি এমন একটি দৃষ্টিভঙ্গি নিয়োগের চেষ্টা করছে যা বাস্তবে "বাস্তব বিশ্বের" ব্যবহৃত হচ্ছে, মূলত এটি একটি ডিফাক্টো-স্ট্যান্ডার্ড তৈরি করে। এটি আপনি যতটা ভবিষ্যত-প্রমাণ পেতে চলেছেন about
রবার্ট হার্ভে

2
আমরা কি URL এ "সংযোজন" এবং "মুছুন" ব্যবহার করে কাস্টম ক্রিয়াগুলি প্রবর্তন করি না? সেই পদ্ধতিতে আমাদের ব্যাখ্যা করতে হবে কীভাবে এপিআই ব্যবহার করবেন। আমাদের যা আছে তা কি পুনরায় ব্যবহার করা উচিত নয় এইচটিটিপি পদ্ধতিগুলি? যে ক্ষেত্রে কর্মগুলি সুপরিচিত।
ব্যবহারকারী 151851

7
অন্য যে কেউ এই উত্তরে ঘটে তার পক্ষে: এটি ভুল। @ ব্যবহারকারীর 151851 হিসাবে উল্লিখিত হিসাবে, এটি ইউআরএলটিতে ক্রিয়াগুলি প্রবর্তন করে যা আপনি যতটা না পেতে পারেন ততই বিশ্রামের মতো। আসল প্রশ্নের ক্ষেত্রে, আমার কাছে দুর্দান্ত উত্তর নেই, তবে এটি এটির নয়।
ছাতা

"এক্সটেনশান" এটি products/collectionআইটেমগুলির একটি 'খাম' দেয় এবং খামের সামগ্রীগুলি একটি পিটি-র মাধ্যমে পরিবর্তিত করে কী আরও উত্স-ভিত্তিক হতে পারে ? পছন্দ করুন, "এখানে আমি সংগ্রহের আইটেমগুলি ঠিক কীভাবে রাখতে চাই তা এখানে"।
লুক পুপলেট

3

ঠিক পূর্ববর্তী উত্তর / মন্তব্য নির্দিষ্ট করতে।

আমার জ্ঞান অনুসারে, সংগ্রহে একক উপাদান যুক্ত করার পদ্ধতি হ'ল POST।

পরিবর্তে মুছে ফেলা, সংগ্রহ থেকে একক উপাদান মোছার পদ্ধতি। উভয় পরিস্থিতি পুরোপুরি বিশ্রামের are

তবে একক উপাদান বা পুরো সংগ্রহটি উল্লেখ করার জন্য আপনার উপযুক্ত ইউআরআই ব্যবহার করা উচিত।

উদাহরণস্বরূপ, সংগ্রহের উপাদান যুক্ত করার জন্য আপনার নিম্নলিখিত ইউআরআইতে ডেটা পোস্ট করা উচিত:

https://www.factory.net/products/

সংগ্রহ থেকে একক পণ্য মোছার জন্য, আপনি অনুরোধ প্রেরণের অনুরোধ প্রেরণের জন্য মোছার পদ্ধতিটি ব্যবহার করতে পারেন:

https://www.factory.net/products/108/

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


2

নীতিগতভাবে, সমস্ত RESTful ক্রিয়াকলাপগুলি একটি সংগ্রহে বৈধ, তবে ক্রিয়াপদগুলির শব্দার্থক সংগ্রহগুলিতে কীভাবে প্রয়োগ হয় তা আপনি বুঝতে পেরেছেন তা নিশ্চিত করুন:

  • পুট একটি সম্পূর্ণ প্রতিস্থাপন।

    • যদি আপনি একটি সিঙ্গলটনে (উদাঃ /item/{id}) রেখে দেন এবং তা ছেড়ে দেন তবে nameএটি সাফ করা উচিত বা নাল বা অনুরূপ কিছুতে সেট করা উচিত।
    • আপনি যদি কোনও সংগ্রহে রাখেন এবং কোনও আইটেম অন্তর্ভুক্ত না করেন তবে এটি সংগ্রহ থেকে সরানো উচিত ।

    আইটেম যুক্ত করতে একটি পুট ব্যবহার করা যেতে পারে, আপনাকে অবশ্যই "সমস্ত" আইটেম প্রেরণ করতে হবে। "কিছু" আইটেম প্রেরণের ফলে অপসারণের ফলাফল হওয়া উচিত (আমি ধরে নিই যে এটি ওপি ইচ্ছা করে না)।

  • মুছে ফেলুন আরও স্বজ্ঞাত। সংগ্রহ বা এর কোনও ফিল্টার করা উপসেট মুছে ফেলা বৈধ। কেবলমাত্র ফিল্টার অন্তর্ভুক্ত আইটেমগুলি প্রভাবিত করা উচিত।

  • প্যাচচইচও বৈধ। তত্ত্বগতভাবে, আপনি "অপারেশন" এর একটি তালিকা সরবরাহ করার কথা। উদাহরণস্বরূপ, আপনার প্রযুক্তিগতভাবে এমন কিছু প্রেরণ করা উচিত:

    [{ 
        "action": "update",
        "id": <id>,
        "value": {...}
    },{
        "action": "add",
        "value": {...}
    }, ...]
    

    অনুশীলনে, এমন একটি API দেখতে আরও সাধারণ যা প্রতিটি আইটেমকে একটি ইউপিএসআরটি (আপডেট বা সন্নিবেশ) যুক্তি ব্যবহার করে প্রক্রিয়া করা হয় এমন অবজেক্টগুলির আংশিক তালিকা গ্রহণ করে।

  • প্রযুক্তিগতভাবে, পোস্টের ইনপুটটি "সংস্থার নিজস্ব নির্দিষ্ট শব্দার্থবিজ্ঞান অনুযায়ী" প্রক্রিয়া করা উচিত।

    • অনুশীলনে, POST সাধারণত "তৈরি করুন" ক্রিয়াকলাপের জন্য ব্যবহৃত হয়।
    • তবে, POST হ'ল অ-মানক কলগুলির জন্য ব্যবহৃত ক্রিয়াপদ। যদি আপনি চান এন্ডপয়েন্টের করার জন্য একটি অনুরোধ জমা দেওয়ার ছিল আছে যদিও সবল বিতর্ক কিনা কর্ম এন্ড পয়েন্ট কঠোরভাবে RESTful ( "না" s এর সাথে আমি পার্শ্ব) হয়, পোস্ট উপযুক্ত ক্রিয়া হয় {resource}/activate

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

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