REST API - একক অনুরোধে বাল্ক তৈরি বা আপডেট করুন [বন্ধ]


94

আসুন ধরে নেওয়া যাক দুটি সংস্থান আছে Binderএবং Docমেলামেশার সম্পর্কের সাথে এর অর্থ যে এটি Docএবং Binderতাদের নিজেরাই দাঁড়ানো। Docহতে পারে বা নাও থাকতে পারে Binderএবং Binderখালি থাকতে পারে।

যদি আমি একটি REST এপিআই ডিজাইন করতে চাই যা ব্যবহারকারীকে নীচের মত একটি একক অনুরোধে , Docএর একটি সংগ্রহ পাঠাতে দেয় :

{
  "docs": [
    {"doc_number": 1, "binder": 1}, 
    {"doc_number": 5, "binder": 8},
    {"doc_number": 6, "binder": 3}
  ]
}

এবং প্রতিটি নথির জন্য docs,

  • যদি docবিদ্যমান থাকে তবে এটিকে নির্ধারণ করুনBinder
  • যদি docঅস্তিত্ব না থাকে তবে এটি তৈরি করুন এবং তারপরে এটি নির্ধারণ করুন

কীভাবে এটি বাস্তবায়ন করা উচিত সে সম্পর্কে আমি সত্যিই বিভ্রান্ত:

  • কোন HTTP পদ্ধতিটি ব্যবহার করতে হবে?
  • কোন প্রতিক্রিয়া কোডটি ফেরত দিতে হবে?
  • এটি কি এমনকি বিশ্রামের জন্য যোগ্য?
  • ইউআরআই দেখতে কেমন হবে? /binders/docs?
  • বাল্ক রিকোয়েস্ট হ্যান্ডলিং, যদি কয়েকটি আইটেম ত্রুটি বাড়ায় তবে অন্যটি দিয়ে যায়। কোন প্রতিক্রিয়া কোডটি ফেরত দিতে হবে? বাল্ক অপারেশন কি পারমাণবিক হওয়া উচিত?

উত্তর:


59

আমি মনে করি যে আপনি এটি পরিচালনা করতে কোনও পোষ্ট বা প্যাচ পদ্ধতি ব্যবহার করতে পারেন যেহেতু তারা সাধারণত এটির জন্য ডিজাইন করেন।

  • একটি ব্যবহার POSTপদ্ধতি সাধারণত যখন তালিকার রিসোর্স ব্যবহার একটি উপাদান যোগ করার জন্য ব্যবহৃত হয় কিন্তু এছাড়াও আপনি এই পদ্ধতির জন্য বিভিন্ন ক্রিয়া সমর্থন করতে পারে। এই উত্তরটি দেখুন: একটি REST সংস্থান সংগ্রহ কীভাবে আপডেট করবেন । আপনি ইনপুটটির জন্য বিভিন্ন উপস্থাপনা ফর্ম্যাটগুলি সমর্থন করতে পারেন (যদি তারা কোনও অ্যারে বা একক উপাদানের সাথে মিল থাকে)।

    ক্ষেত্রে, আপডেটটি বর্ণনা করতে আপনার ফর্ম্যাটটি সংজ্ঞায়িত করার প্রয়োজন হবে না।

  • PATCHআংশিক আপডেটের সাথে সম্পর্কিত অনুরোধগুলি সম্পর্কিত হওয়ায় একটি পদ্ধতি ব্যবহার করাও উপযুক্ত। আরএফসি 5789 অনুসারে ( http://tools.ietf.org/html/rfc5789 ):

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

    ক্ষেত্রে, আংশিক আপডেট বর্ণনা করতে আপনাকে আপনার ফর্ম্যাটটি সংজ্ঞায়িত করতে হবে।

আমি মনে করি যে এই ক্ষেত্রে, POSTএবং PATCHএকেবারে অনুরূপ, যেহেতু প্রতিটি উপাদানটির জন্য আপনাকে অপারেশনটি বর্ণনা করার দরকার নেই। আমি বলব যে এটি উপস্থাপনের ফর্ম্যাটটির উপর নির্ভর করে।

ক্ষেত্রে PUTএকটি বিট কম স্পষ্ট। আসলে, কোনও পদ্ধতি ব্যবহার করার সময় PUTআপনার পুরো তালিকা সরবরাহ করা উচিত। প্রকৃতপক্ষে, অনুরোধে প্রদত্ত প্রতিনিধিত্ব তালিকা সংস্থানটির পরিবর্তে হবে।

সংস্থান পথ সম্পর্কে আপনার দুটি বিকল্প থাকতে পারে।

  • ডক তালিকার জন্য সংস্থান পথ ব্যবহার করা

এই ক্ষেত্রে, আপনি অনুরোধে যে প্রতিনিধিত্ব করেন তাতে আপনার দস্তাবেজের সাথে স্পষ্টভাবে ডক্সের লিঙ্ক সরবরাহ করতে হবে।

এটির জন্য এখানে একটি নমুনা রুট /docs

এই পদ্ধতির বিষয়বস্তু পদ্ধতির জন্য হতে পারে POST:

[
    { "doc_number": 1, "binder": 4, (other fields in the case of creation) },
    { "doc_number": 2, "binder": 4, (other fields in the case of creation) },
    { "doc_number": 3, "binder": 5, (other fields in the case of creation) },
    (...)
]
  • বাইন্ডার এলিমেন্টের সাব রিসোর্স পাথ ব্যবহার করা

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

এটির জন্য এখানে একটি নমুনা রুট /binder/{binderId}/docs। এই ক্ষেত্রে, কোনও পদ্ধতির সাথে ডক্সের একটি তালিকা পাঠানো POSTবা PATCHডক্সটি binderIdউপস্থিত না থাকলে ডক তৈরির পরে সনাক্তকারী সহ দস্তাবেজের সাথে সংযুক্ত করবে ।

এই পদ্ধতির বিষয়বস্তু পদ্ধতির জন্য হতে পারে POST:

[
    { "doc_number": 1, (other fields in the case of creation) },
    { "doc_number": 2, (other fields in the case of creation) },
    { "doc_number": 3, (other fields in the case of creation) },
    (...)
]

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

  • পারমাণবিক

এই ক্ষেত্রে, আপনি HTTP স্থিতি লাভ করতে পারেন verage যদি সবকিছু ঠিকঠাক হয় তবে আপনি একটি স্ট্যাটাস পাবেন 200। যদি তা না 400হয় তবে প্রদত্ত ডেটা সঠিক না হলে (যেমন উদাহরণস্বরূপ বাইન્ડર আইডিটি বৈধ নয়) বা অন্য কোনও কিছুর মতো অন্য একটি স্ট্যাটাস ।

  • অ পরমাণু

এই ক্ষেত্রে, একটি স্থিতি 200ফিরিয়ে দেওয়া হবে এবং কী করা হয়েছিল এবং যেখানে ত্রুটিগুলি শেষ পর্যন্ত ঘটে তা বর্ণনা করার জন্য প্রতিক্রিয়া উপস্থাপনের উপর নির্ভর করবে। ইলাস্টিক অনুসন্ধানের বাল্ক আপডেটের জন্য তার REST এপিআইতে একটি শেষ পয়েন্ট রয়েছে। এটি আপনাকে এই স্তরে কিছু ধারণা দিতে পারে: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html

  • অ্যাসিঙ্ক্রোনাস

আপনি সরবরাহিত ডেটা হ্যান্ডেল করতে একটি অ্যাসিনক্রোনাস প্রসেসিংও প্রয়োগ করতে পারেন। এই ক্ষেত্রে, এইচটিটিপি স্থিতির রিটার্নগুলি হবে 202। ক্লায়েন্টকে কী হয় তা দেখার জন্য একটি অতিরিক্ত সংস্থান টানতে হবে।

সমাপ্তি আগে, আমি আরো নোটিশ চায় যে OData স্পেসিফিকেশন ঠিকানাগুলি বৈশিষ্ট্য নামে সঙ্গে সত্ত্বা মধ্যে সম্পর্ক সংক্রান্ত ইস্যু নেভিগেশন লিঙ্কগুলি । সম্ভবত আপনি এই এক নজরে থাকতে পারে ;-)

নিম্নলিখিত লিঙ্কটি আপনাকেও সহায়তা করতে পারে: https://templth.wordpress.com/2014/12/15/designing-a-web-api/

আশা করি এটি আপনাকে সহায়তা করবে, থিয়েরি


আমি প্রশ্নে অনুসরণ করা আছে। আমি নেস্টেড সাব রিসোর্স ছাড়াই ফ্ল্যাট রুটের পক্ষে বেছে নিয়েছি। সমস্ত দস্তাবেজ পেতে আমি GET /docsএকটি নির্দিষ্ট বাইন্ডারের মধ্যে সমস্ত ডক্স কল করে পুনরুদ্ধার করি GET /docs?binder_id=x। সংস্থানগুলির একটি উপসেট মুছতে আমি কল করব DELETE /docs?binder_id=xবা অনুরোধের সংস্থায় DELETE /docsএকটি কল দিয়ে আমার কল করা উচিত {"binder_id": x}? আপনি কি কখনও PATCH /docs?binder_id=xব্যাচ আপডেটের জন্য ব্যবহার করতে পারেন , বা ন্যায় PATCH /docsএবং জুড়ি পাস?
অ্যান্ডি ফুজনিয়াক

35

আপনার সম্ভবত পোষ্ট বা প্যাচ ব্যবহার করতে হবে, কারণ একক অনুরোধ যে একাধিক সংস্থান আপডেট করে এবং তৈরি করে তা আদর্শবান হতে পারে unlikely

এরকম PATCH /docsস্পষ্টভাবে একটি বৈধ বিকল্প। আপনার নির্দিষ্ট দৃশ্যের জন্য আপনি স্ট্যান্ডার্ড প্যাচ ফর্ম্যাটগুলি জটিল বলে মনে করতে পারেন। এই সম্পর্কে নিশ্চিত না।

আপনি 200 ব্যবহার করতে পারেন You আপনি 207 - মাল্টি স্ট্যাটাসও ব্যবহার করতে পারেন

এটি একটি বিশ্রামের উপায়ে করা যেতে পারে। কীটি আমার মতে, এমন কিছু সংস্থান আছে যা আপডেট / তৈরি করার জন্য নথিগুলির একটি সেট গ্রহণ করার জন্য ডিজাইন করা হয়েছে।

আপনি যদি প্যাচচ পদ্ধতি ব্যবহার করেন তবে আমি মনে করি আপনার অপারেশনটি পারমাণবিক হওয়া উচিত। অর্থাৎ আমি 207 স্থিতি কোডটি ব্যবহার করব না এবং তারপরে সাড়া সাধ্যের মধ্যে সাফল্য এবং ব্যর্থতার খবর দেব। আপনি যদি পোষ্ট অপারেশন ব্যবহার করেন তবে 207 পদ্ধতির ব্যবহারযোগ্য। কোন ক্রিয়াকলাপ সফল হয়েছে এবং কোনটি ব্যর্থ হয়েছে তা যোগাযোগের জন্য আপনাকে নিজের প্রতিক্রিয়া সংস্থাটি তৈরি করতে হবে। আমি একটি মানক সম্পর্কে সচেতন নই।


তোমাকে অনেক ধন্যবাদ. দ্বারা This can be done in a RESTful wayআপনাকে আপডেট অর্থ কী এবং তৈরি আলাদাভাবে অবশ্যই করতে হবে?
স্যাম আর

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

19

PUT ING

PUT /binders/{id}/docs তৈরি বা আপডেট করুন এবং একটি বাইন্ডারের সাথে একটি একক দস্তাবেজ সম্পর্কিত

যেমন:

PUT /binders/1/docs HTTP/1.1
{
  "docNumber" : 1
}

প্যাচ ING

PATCH /docs দস্তাবেজগুলি তৈরি না করুন যদি সেগুলি বিদ্যমান না থাকে এবং তাদের বাইন্ডারগুলির সাথে সম্পর্কিত করে

যেমন:

PATCH /docs HTTP/1.1
[
    { "op" : "add", "path" : "/binder/1/docs", "value" : { "doc_number" : 1 } },
    { "op" : "add", "path" : "/binder/8/docs", "value" : { "doc_number" : 8 } },
    { "op" : "add", "path" : "/binder/3/docs", "value" : { "doc_number" : 6 } }
] 

আমি পরে অতিরিক্ত অন্তর্দৃষ্টি অন্তর্ভুক্ত করব, তবে এর মধ্যে আপনি চাইলে আরএফসি 5789 , আরএফসি 6902 এবং উইলিয়াম ডুরান্ডের দয়া করে দেখুন। একটি ইডিয়ট ব্লগ এন্ট্রি মত প্যাচ করবেন না


4
কিছু সময় ক্লায়েন্টকে বাল্ক অপারেশন প্রয়োজন এবং এটি উত্স আছে কিনা তা যত্ন নিতে চায় না। আমি যেমন প্রশ্নে বলেছি, ক্লায়েন্ট একটি গোছা পাঠাতে docsএবং তাদের সাথে যুক্ত করতে চায় binders। ক্লায়েন্ট তাদের বিদ্যমান না থাকলে বাইন্ডার তৈরি করতে এবং তারা যদি সমিতিটি তৈরি করতে চায়। এক একক বাল্ক অনুরোধে।
স্যাম আর।

12

একটি প্রকল্পে আমি কাজ করেছিলাম এমন কিছু বাস্তবায়নের মাধ্যমে আমরা এই সমস্যাটি সমাধান করেছি যার নাম 'ব্যাচ' অনুরোধ। আমরা এমন একটি পথ সংজ্ঞায়িত করেছি /batchযেখানে আমরা নিম্নলিখিত ফর্ম্যাটে জসনকে গ্রহণ করেছি:

[  
   {
      path: '/docs',
      method: 'post',
      body: {
         doc_number: 1,
         binder: 1
      }
   },
   {
      path: '/docs',
      method: 'post',
      body: {
         doc_number: 5,
         binder: 8
      }
   },
   {
      path: '/docs',
      method: 'post',
      body: {
         doc_number: 6,
         binder: 3
      }
   },
]

প্রতিক্রিয়াটির স্থিতি কোড 207 (মাল্টি-স্ট্যাটাস) রয়েছে এবং এটির মতো দেখাচ্ছে:

[  
   {
      path: '/docs',
      method: 'post',
      body: {
         doc_number: 1,
         binder: 1
      }
      status: 200
   },
   {
      path: '/docs',
      method: 'post',
      body: {
         error: {
            msg: 'A document with doc_number 5 already exists'
            ...
         }
      },
      status: 409
   },
   {
      path: '/docs',
      method: 'post',
      body: {
         doc_number: 6,
         binder: 3
      },
      status: 200
   },
]

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

ফেসবুক এবং গুগলের একই প্রয়োগ রয়েছে:
https://developers.google.com/gmail/api/guides/batch https://developers.facebook.com/docs/ راف-api/ making-
mpleple-requests

আপনি যখন একই কল দিয়ে কোনও সংস্থান তৈরি করতে বা আপডেট করতে চান তখন আমি কেস উপর নির্ভর করে পোস্ট বা পুট ব্যবহার করব। যদি দস্তাবেজটি ইতিমধ্যে বিদ্যমান থাকে, আপনি কি পুরো দস্তাবেজটি চান:

  1. আপনার প্রেরিত দস্তাবেজের দ্বারা প্রতিস্থাপন (অনুরোধে থাকা নিখোঁজ সম্পত্তিগুলি মুছে ফেলা হবে এবং ইতিমধ্যে বিদ্যমান ওভাররাইটে থাকা)?
  2. আপনি যে দস্তাবেজটি প্রেরণ করেছেন তার সাথে মার্জ করা হয়েছে (অর্থাত্ অনুরোধে থাকা নিখোঁজ সম্পত্তিগুলি সরানো হবে না এবং ইতিমধ্যে বিদ্যমান বৈশিষ্ট্যগুলি ওভাররাইট করা হবে)?

আপনি বিকল্প 1 থেকে আচরণটি চান এমন ক্ষেত্রে আপনার একটি পোষ্ট ব্যবহার করা উচিত এবং বিকল্প 2 এর থেকে আচরণটি চাইলে আপনার পুট ব্যবহার করা উচিত।

http://restcookbook.com/HTTP%20Methods/put-vs-post/

লোকেরা ইতিমধ্যে আপনাকে প্যাচ-এর জন্য পরামর্শ দিতে পারে তবে আমি এপিআইয়ের সহজ রাখতে পছন্দ করি এবং যদি প্রয়োজন হয় না তবে অতিরিক্ত ক্রিয়া ব্যবহার না করা উচিত।


4
প্রুফ অফ কনসেপ্টের পাশাপাশি গুগল এবং ফেসবুক লিঙ্কগুলির এই উত্তরটি পছন্দ করুন। তবে পোষ্ট বা পুট সম্পর্কে শেষ অংশটির সাথে একমত নন। এই উত্তরে উল্লিখিত 2 টি ক্ষেত্রে, প্রথমটি PUT হওয়া উচিত, এবং দ্বিতীয়টি PATCH হওয়া উচিত।
রায়লুও

@ রায়লুও, আপনি ব্যাখ্যা করতে পারেন কেন আমাদের পোষ্ট এবং পুটের পাশাপাশি প্যাচ দরকার?
ডেভিড বার্গ

4
কারণ এটিই প্যাচএচই আবিষ্কার হয়েছিল। আপনি এই সংজ্ঞাটি পড়তে পারেন এবং কীভাবে PUT এবং প্যাচগুলি আপনার 2 বুলেটপয়েন্টগুলিতে মেলে।
রায়লুও

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