একটি বিশ্রাম পরিষেবাতে আংশিক আপডেটের জন্য সেরা অনুশীলন


208

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

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

ইউআরআইগুলি তৈরির জন্য কি কোনও প্রস্তাবিত উপায় আছে? আরআরএসটি বই পড়ার সময় আরপিসির স্টাইলের কলগুলি মনে হচ্ছে না।

নিম্নলিখিত কলটি যদি 123 আইডি সহ গ্রাহকের পুরো গ্রাহক রেকর্ডটি ফেরত দেয়

GET /customer/123
<customer>
    {lots of attributes}
    <status>ENABLED</status>
    {even more attributes}
</customer>

আমি কীভাবে স্ট্যাটাস আপডেট করব?

POST /customer/123/status
<status>DISABLED</status>

POST /customer/123/changeStatus
DISABLED

...

আপডেট : প্রশ্ন বৃদ্ধি করতে। কীভাবে একজন 'রিজাস্ট এপিআই'তে' বিজনেস লজিক কল 'অন্তর্ভুক্ত করে? এটি করার কোনও সম্মত উপায় আছে কি? সমস্ত পদ্ধতি প্রকৃতি অনুসারে সিআরইউডি হয় না। কিছুগুলি আরও জটিল, যেমন ' সেন্ডইমেইলটোস্টাস্টার (123) ', ' মার্জকাস্টমার্স (123, 456) ', ' কাউন্টকাস্টমার্স () '

POST /customer/123?cmd=sendEmail

POST /cmd/sendEmail?customerId=123

GET /customer/count 

3
"ব্যবসায়িক যুক্তি কল" সম্পর্কে আপনার প্রশ্নের উত্তর দেওয়ার জন্য POSTরয় ফিল্ডিং নিজেই একটি পোস্ট এখানে দিয়েছেন: roy.gbiv.com/untangled/2009/it-is-okay-to-use- পোষ্ট যেখানে বেসিক ধারণাটি রয়েছে: যদি সেখানে না হয় 'একটি পদ্ধতি (যেমন t GETবা PUT) আদর্শভাবে আপনার অপারেশন ব্যবহারের উপযুক্ত POST
রোজোকা

এটি বেশ কি আমি শেষ করে দিয়েছি much জিইটি, পুট, ডিলিট ব্যবহার করে জ্ঞাত সংস্থানগুলি পুনরুদ্ধার এবং আপডেট করার জন্য আরএসটি কল করুন। নতুন সংস্থান যুক্ত করার জন্য পোস্ট করুন এবং ব্যবসায় যুক্তিযুক্ত কলগুলির জন্য কিছু বর্ণনামূলক URL সহ পোস্ট করুন।
ম্যাজিকনায়ার

আপনি যে সিদ্ধান্তই নিন না কেন, যদি এই অপারেশনটি জিইটি প্রতিক্রিয়ার অংশ না হয় তবে আপনার কাছে বিশ্রামের পরিষেবা নেই। আমি এখানে এটি দেখছি না
এমএসটিডড

উত্তর:


69

আপনার কাছে মূলত দুটি বিকল্প রয়েছে:

  1. ব্যবহার করুন PATCH(তবে নোট করুন যে আপনাকে নিজের মিডিয়া প্রকারটি নির্ধারণ করতে হবে যা ঠিক কী ঘটবে তা নির্দিষ্ট করে)

  2. POSTএকটি সাব রিসোর্সে ব্যবহার করুন এবং 303 এ ফিরে আসুন প্রধান সংস্থানটির দিকে নির্দেশ করে লোকেশন শিরোনাম সহ অন্যান্য দেখুন। 303 এর উদ্দেশ্য ক্লায়েন্টকে বলা: "আমি আপনার পোস্টটি সম্পাদন করেছি এবং এর প্রভাবটি ছিল যে অন্য কিছু সংস্থান আপডেট হয়েছিল which কোন সংস্থানটির জন্য অবস্থানের শিরোনামটি দেখুন" " কিছু প্রধান সংস্থার রাজ্য গঠনের জন্য কোনও সংস্থায় পুনরায় সংযোজনগুলির জন্য পোষ্ট / 303 এর উদ্দেশ্য এবং এটি আংশিক আপডেটের জন্য উপযুক্ত fit


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

আমি ইমেল ইউআরআই প্রশ্নটি বুঝতে পারি না। আপনি কি কোনও গেটওয়ে বাস্তবায়ন করতে চান যা আপনি এটি ইমেল প্রেরণের জন্য পোস্ট করতে পারেন বা আপনি মেইলটো: ગ્રાહার .123@service.org খুঁজছেন?
জান আলগার্মিসেন

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

9
গুগল এটি কীভাবে করে তাও দেখুন: googlecode.blogspot.com/2010/03/…
মারিয়াস

4
williamdurand.fr/2014/02/14/please-do-not-patch- Like-an-idiot PATCH [{"op": "পরীক্ষা", "পথ": "/ a / b / c", "মান" : "foo"}, {"op": "অপসারণ", "পাথ": "/ a / b / c" {, {"op": "যোগ", "পথ": "/ a / b / c" , "মান": ["foo", "বার"]}, replace "ওপ": "প্রতিস্থাপন", "পথ": "/ a / খ / সি", "মান": 42}, {"ওপ": "সরানো", "থেকে": "/" / "/" / "" পাথ ":" / এ / বি / ডি "}, op" ওপেন ":" কপি "," থেকে ":" / এ / বি / d "," পথ ":" / এ / বি / ই "}]
ইনটোটেকো

48

আংশিক আপডেটের জন্য আপনার পোষ্ট ব্যবহার করা উচিত।

123 গ্রাহকের জন্য ক্ষেত্রগুলি আপডেট করতে, / গ্রাহক / 123 এ একটি পোস্ট করুন।

আপনি যদি কেবলমাত্র স্থিতিটি আপডেট করতে চান তবে আপনি / গ্রাহক / 123 / স্থিতিতেও PUT করতে পারেন।

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

এই এখানে দেখা যায়, HTTP- র থেকে সরাসরি অনুসরণ: http://en.wikipedia.org/wiki/HTTP_PUT#Request_methods


1
: @John বিযয়ক পোষ্ট অগত্যা একটি নতুন রিসোর্স করে একটি কোনো URI থেকে অ্যাক্সেসযোগ্য তৈরি হবে তা নয় tools.ietf.org/html/rfc2616#section-9.5
wsorenson

10
@ নিউজেনসেন: আমি জানি যে এটির কোনও নতুন ইউআরএল /customer/123তৈরি করার দরকার নেই, তবে এখনও ভেবেছিলাম যে কোনও পোষ্টের যৌক্তিকভাবে গ্রাহকের অধীনে থাকা স্পষ্ট জিনিসটি তৈরি করা উচিত 123 Maybe সম্ভবত কোনও আদেশ? পুট আরও /customer/123/statusভাল ধারণা দেয় বলে মনে হচ্ছে, পোষ্টকে /customersস্পষ্টতই একটি তৈরি করেছে status(এবং ধরে নিই যে এটি বৈধতা বিশিষ্ট)।
জন স্যান্ডার্স

1
@ জন সান্ডার্স: কার্যত বলতে গেলে যদি আমরা কোনও প্রদত্ত ইউআরআই-তে অবস্থিত কোনও সংস্থার উপর কোনও ক্ষেত্র আপডেট করতে চাই তবে পোস্ট পুট-এর চেয়ে বেশি বোধগম্য হয় এবং একটি আপডেটের অভাব হয়, আমি বিশ্বাস করি এটি প্রায়শই আরএসইটি পরিষেবাদিতে ব্যবহৃত হয়। পোষ্ট থেকে / গ্রাহকরা একটি নতুন গ্রাহক তৈরি করতে পারে এবং একটি পিট থেকে / গ্রাহক / 123 / স্থিতি স্পেসিফিকেশন শব্দের সাথে আরও ভাল সারিবদ্ধ হতে পারে, তবে সর্বোত্তম অভ্যাস হিসাবে, আমি মনে করি না যে পোষ্ট / এ পোস্ট করার কোনও কারণ নেই কোনও ক্ষেত্র আপডেট করার জন্য গ্রাহক / 123 - এটি সংক্ষিপ্ত, বুদ্ধিমান, এবং নির্দিষ্টকরণের কোনওটির বিরুদ্ধে কঠোরভাবে যায় না।
wsorenson

8
পোষ্ট অনুরোধগুলি আদর্শবান হওয়া উচিত নয়? অবশ্যই কোনও এন্ট্রি আপডেট করা আদর্শবান এবং এর পরিবর্তে একটি পুট হওয়া উচিত?
মার্টিন অ্যান্ডারসন

1
@MartinAndersson POST-requests না প্রয়োজন অ idempotent যাবে। এবং উল্লিখিত হিসাবে, PUTএকটি সম্পূর্ণ সম্পদ প্রতিস্থাপন করতে হবে।
হ্যালে নাস্তে

10

আংশিক আপডেটের জন্য আপনার প্যাচচ ব্যবহার করা উচিত - হয় জসন-প্যাচ নথি ব্যবহার করে (দেখুন http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-08 বা http://www.mnot.net/ ব্লগ / 2012/09/05 / প্যাচ ) বা এক্সএমএল প্যাচ কাঠামো (দেখুন http://tools.ietf.org/html/rfc5261 )। যদিও আমার মতে, জসন-প্যাচ আপনার ধরণের ব্যবসায়িক ডেটার জন্য সবচেয়ে উপযুক্ত।

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

আপনি এখানে আরও গভীরতর উত্তর পেতে পারেন: http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html


দয়া করে নোট করুন যে এর মধ্যে জসন -প্যাচ এবং এক্সএমএল-প্যাচের জন্য আরএফসি চূড়ান্ত হয়েছে।
botchniaque

8

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

এখানে দুটি সমাধান যা আমি ভাবতে পারি:

  1. পুরো সংস্থান দিয়ে একটি পুট করুন UT সার্ভার-সাইডে, শব্দার্থবিজ্ঞানগুলি সংজ্ঞায়িত করুন যে একটি পুট পুরো রিসোর্স সহ সমস্ত মানগুলিকে অগ্রাহ্য করে যা পরিবর্তন হয়নি।

  2. আংশিক সংস্থান সহ একটি পুট করুন। সার্ভার-সাইডে, এর মার্জিকগুলি সংযুক্তি হিসাবে সংজ্ঞায়িত করুন।

2 শুধুমাত্র 1 এর একটি ব্যান্ডউইথ-অপ্টিমাইজেশান 1 কখনও কখনও 1 একমাত্র বিকল্প হ'ল সংস্থানটি কিছু ক্ষেত্রের জন্য প্রয়োজনীয় ক্ষেত্রগুলি নির্ধারণ করে (প্রোটো বাফারগুলি মনে করে) ines

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

মন্তব্য?


2
পৃথক প্রশ্ন হিসাবে পোস্ট করা হলে এটি আরও কার্যকর হবে।
ইন্টোটেকো

6

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

উদাহরণ:

POST /customer/active  <-- Providing entity in the body a new customer
{
  ...  // attributes here except status
}

পোষ্ট পরিষেবাটি নতুন তৈরি গ্রাহকটিকে আইডি সহ ফিরিয়ে দেবে:

{
    id:123,
    ...  // the other fields here
}

তৈরি সম্পদটির জন্য জিইটি এই সংস্থার অবস্থানটি ব্যবহার করবে:

GET /customer/123/active

একটি জিইটি / গ্রাহক / 123 / নিষ্ক্রিয় 4040 ফেরত আসবে

পুট অপারেশনের জন্য, জসন সত্তা সরবরাহ না করে এটি কেবল স্থিতি আপডেট করবে update

PUT /customer/123/inactive  <-- Deactivating an existing customer

একটি সত্তা সরবরাহ আপনাকে গ্রাহকের বিষয়বস্তু আপডেট এবং একই সাথে স্থিতি আপডেট করার অনুমতি দেবে।

PUT /customer/123/inactive
{
    ...  // entity fields here except id and status
}

আপনি আপনার গ্রাহক সংস্থার জন্য একটি ধারণামূলক উপ-সংস্থান তৈরি করছেন। এটি রয় ফিল্ডিংয়ের সংস্থানটির সংজ্ঞার সাথেও সামঞ্জস্যপূর্ণ: "... একটি উত্স হ'ল সংস্থার সংকলনের সাথে একটি ধারণামূলক ম্যাপিং, সেই সত্তাটি কোনও নির্দিষ্ট সময়ে ম্যাপিংয়ের সাথে মিল রাখে না ..." এই ক্ষেত্রে ক্ষেত্রে ধারণাগত ম্যাপিং স্ট্যাটাস = অ্যাক্টিভ সহ গ্রাহকের কাছে সক্রিয়-গ্রাহক is

অপারেশন পড়ুন:

GET /customer/123/active 
GET /customer/123/inactive

যদি আপনি সেই কলগুলি ঠিক তখনই করেন তবে তার মধ্যে অন্য একটির অবশ্যই 404 স্থিতি ফিরিয়ে দিতে হবে, তবে সফল আউটপুটটি স্থিতিযুক্ত হিসাবে স্থিতিটি অন্তর্ভুক্ত করতে পারে না। অবশ্যই আপনি সরাসরি গ্রাহক সংস্থান জিজ্ঞাসা করতে GET / গ্রাহক / 123? অবস্থা = ACTIVE | INACTIVE ব্যবহার করতে পারেন।

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

DELETE /customer/123/active

এইটি আপনার গ্রাহককে একটি মুছে ফেলা / অক্ষম স্থিতিতে বা বিপরীত স্থিতিতে (ACTIVE / INACTIVE) নিয়ে যেতে পারে।


আপনি কীভাবে সাব-রিসোর্সে উঠবেন?
এমএসটিডড


5

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

মেল প্রেরণ


POST /customers/123/mails

payload:
{from: x@x.com, subject: "foo", to: y@y.com}

এই সংস্থান + POST এর বাস্তবায়ন তখন মেলটি প্রেরণ করবে। প্রয়োজনে আপনি তখন / গ্রাহক / 123 / আউটবক্সের মতো কিছু সরবরাহ করতে পারেন এবং তারপরে / গ্রাহক / মেল / {মেলআইডি} এ সংস্থানগুলি সরবরাহ করতে পারেন}

গ্রাহক গণনা

আপনি এটি কোনও অনুসন্ধানের সংস্থার মতো পরিচালনা করতে পারেন (পেজিং এবং নম্বর-প্রাপ্ত তথ্যের সাথে অনুসন্ধান মেটাডেটা সহ যা আপনাকে গ্রাহকদের সংখ্যা দেয়)।


GET /customers

response payload:
{numFound: 1234, paging: {self:..., next:..., previous:...} customer: { ...} ....}


আমি পোষ্ট সাব-রিসোর্সে ক্ষেত্রগুলিকে লজিক্যাল গ্রুপিংয়ের পদ্ধতি পছন্দ করি।
জেরটিস

3

অসম্পূর্ণ / আংশিক সংস্থান আপডেট করার জন্য PUT ব্যবহার করুন।

আপনি জবজেক্টটিকে প্যারামিটার হিসাবে গ্রহণ করতে পারেন এবং সংস্থানটি আপডেট করার জন্য এর মানটিকে বিশ্লেষণ করতে পারেন।

নীচে ফাংশন যা আপনি একটি রেফারেন্স হিসাবে ব্যবহার করতে পারেন:

public IHttpActionResult Put(int id, JObject partialObject)
{
    Dictionary<string, string> dictionaryObject = new Dictionary<string, string>();

    foreach (JProperty property in json.Properties())
    {
        dictionaryObject.Add(property.Name.ToString(), property.Value.ToString());
    }

    int id = Convert.ToInt32(dictionaryObject["id"]);
    DateTime startTime = Convert.ToDateTime(orderInsert["AppointmentDateTime"]);            
    Boolean isGroup = Convert.ToBoolean(dictionaryObject["IsGroup"]);

    //Call function to update resource
    update(id, startTime, isGroup);

    return Ok(appointmentModelList);
}

2

আপনার আপডেট সম্পর্কিত।

আমার বিশ্বাস সিআরইউডি ধারণাটি এপিআই ডিজাইন সম্পর্কিত কিছু বিভ্রান্তি সৃষ্টি করেছে। সিআরইউডি হ'ল ডেটাতে সঞ্চালনের জন্য মৌলিক ক্রিয়াকলাপগুলির জন্য একটি সাধারণ নিম্ন স্তরের ধারণা এবং এইচটিটিপি ক্রিয়াগুলি কেবলমাত্র অনুরোধের পদ্ধতিগুলি ( 21 বছর আগে তৈরি হয়েছিল) ) যা কোনও সিআরইউডি অপারেশনের মানচিত্র বা নাও পেতে পারে। প্রকৃতপক্ষে, HTTP 1.0 / 1.1 নির্দিষ্টকরণে CRUD সংক্ষিপ্তসার উপস্থিতি আবিষ্কার করার চেষ্টা করুন।

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

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

এছাড়া যে বলছেন, একটি অপারেশন একটি প্রমিত পদ্ধতি সঙ্গে ঠিক ম্যাপ না যখন ( List, Get, Create, Update, Deleteএই ক্ষেত্রে), একটি ব্যবহার করতে পারে "কাস্টম পদ্ধতি" মত BatchGet, যা বিভিন্ন বস্তুর আইডি ইনপুটের ভিত্তিতে বিভিন্ন অবজেক্টের আহরণ, অথবা SendEmail


2

আরএফসি 7396 : জেএসএন মার্জ প্যাচ (প্রশ্ন পোস্ট হওয়ার চার বছর পরে প্রকাশিত) ফর্ম্যাট এবং প্রক্রিয়াজাতকরণের বিধি অনুসারে একটি প্যাচচএইচ জন্য সেরা অনুশীলনের বর্ণনা দেয়।

সংক্ষেপে, আপনি অ্যাপ্লিকেশন / মার্জ-প্যাচ + জসন এমআইএমআই মিডিয়া টাইপ এবং আপনি যে অংশগুলি পরিবর্তন করতে চান / যুক্ত করতে / সরাতে চান কেবল সেই অংশগুলির প্রতিনিধিত্ব করে এমন একটি সংস্থা যা একটি টার্গেট রিসোর্সে একটি HTTP প্যাচ জমা দিন এবং তারপরে নীচের প্রক্রিয়াবিধি অনুসরণ করুন follow

বিধি :

  • যদি সরবরাহকৃত মার্জ প্যাচে এমন সদস্য থাকে যা লক্ষ্যবস্তুতে উপস্থিত না হয় তবে সেই সদস্যগুলি যুক্ত করা হয়।

  • যদি লক্ষ্যটিতে সদস্য থাকে তবে মানটি প্রতিস্থাপন করা হবে।

  • একীভূত প্যাচে নাল মানগুলিকে লক্ষ্যে বিদ্যমান মানগুলি অপসারণের নির্দেশ দেওয়ার জন্য বিশেষ অর্থ দেওয়া হয়।

উদাহরণস্বরূপ পরীক্ষার কেসগুলি যা উপরের নিয়মগুলিকে চিত্রিত করে ( পরিশিষ্টে যেমন দেখা গেছে) ):

 ORIGINAL         PATCH           RESULT
--------------------------------------------
{"a":"b"}       {"a":"c"}       {"a":"c"}

{"a":"b"}       {"b":"c"}       {"a":"b",
                                 "b":"c"}
{"a":"b"}       {"a":null}      {}

{"a":"b",       {"a":null}      {"b":"c"}
"b":"c"}

{"a":["b"]}     {"a":"c"}       {"a":"c"}

{"a":"c"}       {"a":["b"]}     {"a":["b"]}

{"a": {         {"a": {         {"a": {
  "b": "c"}       "b": "d",       "b": "d"
}                 "c": null}      }
                }               }

{"a": [         {"a": [1]}      {"a": [1]}
  {"b":"c"}
 ]
}

["a","b"]       ["c","d"]       ["c","d"]

{"a":"b"}       ["c"]           ["c"]

{"a":"foo"}     null            null

{"a":"foo"}     "bar"           "bar"

{"e":null}      {"a":1}         {"e":null,
                                 "a":1}

[1,2]           {"a":"b",       {"a":"b"}
                 "c":null}

{}              {"a":            {"a":
                 {"bb":           {"bb":
                  {"ccc":          {}}}
                   null}}}

1

চেক আউট http://www.odata.org/

এটি মার্জ পদ্ধতিটি সংজ্ঞায়িত করে, তাই আপনার ক্ষেত্রে এটি এমন কিছু হবে:

MERGE /customer/123

<customer>
   <status>DISABLED</status>
</customer>

শুধুমাত্র statusসম্পত্তি আপডেট করা হয় এবং অন্যান্য মান সংরক্ষণ করা হয়।


কি MERGEএকটি বৈধ HTTP- র ক্রিয়া?
জন স্যান্ডার্স

3
প্যাচ দেখুন - এটি শীঘ্রই হতে হবে মানক এইচটিটিপি এবং একই জিনিস করে।
জান আলগার্মিসেন

@ জন স্যান্ডার্স হ্যাঁ, এটি একটি এক্সটেনশন পদ্ধতি।
সর্বাধিক তোরো

FYI মার্জকে ওডেটা ভি 4 থেকে সরানো হয়েছে। ডকস.ওয়েসিস- ওপেন.অর্গ.ওডাটা / নতুনMERGE was used to do PATCH before PATCH existed. Now that we have PATCH, we no longer need MERGE.
ইন-

0

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

যদি আপনার জিইটি প্রতিক্রিয়াতে রাষ্ট্রীয় রূপান্তর হয় তবে ক্লায়েন্টকে কেবল সেগুলি কীভাবে পড়তে হবে তা জানতে হবে এবং প্রয়োজনে সার্ভার এগুলি পরিবর্তন করতে পারে। এখানে POST ব্যবহার করে একটি আপডেট করা হয় তবে এটি যদি প্যাচএইচচে পরিবর্তন করা হয় বা ইউআরএল পরিবর্তন হয় তবে ক্লায়েন্টটি এখনও কীভাবে আপডেট করবেন তা জানে:

{
  "customer" :
  {
  },
  "operations":
  [
    "update" : 
    {
      "method": "POST",
      "href": "https://server/customer/123/"
    }]
}

ক্লায়েন্ট আপনাকে ফিরিয়ে দেওয়ার জন্য প্রয়োজনীয় / alচ্ছিক পরামিতিগুলির তালিকা করতে আপনি যতদূর যেতে পারেন। এটা আবেদন উপর নির্ভর করে।

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

"email":
{
  "method": "POST",
  "href": "http://server/emailservice/send?customer=1234"
}

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

https://www.youtube.com/watch?v=pspy1H6A3FM ,
https://www.youtube.com/watch?v=5WXYw4J4QOU ,
http://docs.stormpath.com/rest/quickstart/

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