আরআরটি এপিআইতে কোনও সংগ্রহকে বিদ্যমান আইটেম যুক্ত করার জন্য সেরা প্যাটার্নটি কী?


23

আমি একটি বাস্তববাদী REST এপিআই ডিজাইন করছি এবং কোনও সংকলনে বিদ্যমান সত্ত্বাগুলি কীভাবে যুক্ত করা যায় তা সম্পর্কে আমি কিছুটা আটকেছি। আমার ডোমেন মডেলটিতে এমন একটি প্রকল্প অন্তর্ভুক্ত রয়েছে যাতে সাইটের সংগ্রহ রয়েছে। এটি বহু-থেকে-বহুবার কঠোর সম্পর্ক এবং আমার কোনও সত্তা তৈরি করার দরকার নেই যা স্পষ্টভাবে সম্পর্কের মডেল তৈরি করে (অর্থাত্ প্রোজেক্টসাইট)।

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

1. POST myapi/projects/{projectId}/sites/{siteId}

তবে আমিও ভেবেছিলাম

2. POST myapi/projects/{projectId}/sites

JSON সামগ্রী হিসাবে প্রেরিত সাইট সত্তা সহ

বিকল্প 1 সহজ এবং কাজ করে তবে বেশ সঠিক মনে হয় না এবং আমার অন্যান্য সম্পর্কও রয়েছে যা এই প্যাটার্নটি অনুসরণ করতে পারে না তাই এটি আমার API এ অসঙ্গতি যুক্ত করে।

বিকল্প 2 আরও ভাল বোধ করে তবে দুটি উদ্বেগের দিকে নিয়ে যায়:

  • যদি কোনও নতুন সাইট পোস্ট করা হয় (সাইটআইডি = 0) তবে আমার কোনও সাইট তৈরি করা উচিত বা একটি ব্যতিক্রম ছুঁড়ে দেওয়া উচিত?
  • যেহেতু সম্পর্ক তৈরি করার জন্য আমার কেবল প্রজেক্টআইডি এবং সাইটআইডের প্রয়োজন তাই সাইটটি অন্য সম্পত্তিগুলির জন্য ভুল বা হারিয়ে যাওয়া ডেটা দিয়ে পোস্ট করা যেতে পারে।

তৃতীয় বিকল্পটি হ'ল সম্পর্ক তৈরি এবং মুছে ফেলার জন্য একটি সহজ শেষ পয়েন্ট সরবরাহ করা। এই শেষ বিন্দুতে কেবল প্রজেক্টআইডি এবং সাইটআইডযুক্ত একটি জেএসএন পে-লোড আশা করবে।

আপনি কি মনে করেন?



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

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

উত্তর:


14

POST হ'ল "সংযোজন" ক্রিয়া, এবং "প্রক্রিয়াজাতকরণ" ক্রিয়াও। PUT হ'ল "তৈরি / আপডেট করুন" ক্রিয়া (পরিচিত শনাক্তকারীদের জন্য), এবং প্রায় এখানে সঠিক পছন্দ হিসাবে দেখায়, কারণ সম্পূর্ণ লক্ষ্য ইউআরআই পরিচিত known projectIdএবং siteIdইতিমধ্যে বিদ্যমান, সুতরাং নতুন আইডি তৈরি করতে আপনার "সংগ্রহের কাছে পোস্ট" করতে হবে না।

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

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

আমার কেবলমাত্র ডেটা হ'ল প্রজেক্টআইডি এবং সাইটআইডি

পরিবর্তে, আমি সংগ্রহটি পোস্ট siteIdকরার চেষ্টা করব এবং পোস্টের "সংযোজন" এবং "প্রক্রিয়া" প্রকৃতির উপর নির্ভর করব:

পোস্ট মায়াপি / প্রকল্পগুলি / {প্রজেক্টআইডি} / সাইটগুলি

id 'আইডি': '...'}

যেহেতু আপনি সাইট সংগ্রহের সংস্থানটি পরিবর্তন করছেন এবং সাইট সংস্থানটি নয় , এটি আপনার পছন্দসই ইউআরআই। পোষ্ট "সংযোজন / প্রক্রিয়া" করতে এবং প্রকল্পের সাইটগুলি সংগ্রহে সেই আইডি সহ উপাদান যুক্ত করতে পারে।

এটি এখনও JSON খুঁজে বের করে এবং আইডি বাদ দিয়ে প্রকল্পের জন্য ব্র্যান্ডের নতুন সাইটগুলি তৈরি করার দরজা উন্মুক্ত করে। "কোনও আইডি নেই" == "স্ক্র্যাচ থেকে তৈরি করুন"। তবে সংগ্রহটি ইউআরআই যদি একটি আইডি পায় এবং অন্য কিছুই না হয় তবে কী হওয়া দরকার তা এটি বেশ পরিষ্কার।

আকর্ষণীয় প্রশ্ন। :)


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

আমি মনে করি আপনার POSTপরিবর্তে PUTবা PATCHএখানে ব্যবহারের জন্য সংজ্ঞায়িত কারণটি হ'ল এটি আপনার Siteকাছে sitesসংস্থানটিতে পুরো অস্তিত্ব নেই । আপনার কাছে কেবল আইডি রয়েছে, এটি সংগ্রহের সাথে যুক্ত করার জন্য এটির জন্য প্রক্রিয়াজাতকরণ প্রয়োজন।
পিষ্ট করুন

4

আমরা এই জাতীয় জিনিসগুলির জন্য Patchপদ্ধতিটি ব্যবহার করি । আপনি যা করতে চান তা কোনও সাইট যুক্ত করার জন্য একটি বিদ্যমান প্রকল্পটি পরিবর্তন করতে হবে।

সুতরাং এই মত কিছু কাজ করবে

PATCH myapi/projects/{id} 

অনুরোধ সংস্থায় JSON / JSONArray হিসাবে সাইট (গুলি) সত্তা সহ

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


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

কেন চ্যালেঞ্জ? আপনার যদি এই বিধিনিষেধগুলি থাকে, আপনি সর্বদা একটি জেএসএন ব্যবহার করতে পারেন যা এটি যা প্রেরণ করছে তা স্পষ্ট করে তোলে ... যেমন {"sites": [], "other-stuff": {}}আপনি তারপরে খুব সহজেই এই সমস্ত "সাবজানস" পরিচালনা করতে আপনার কোডটি শাখা করতে পারেন। এটি সত্যিই আপনার নির্দিষ্ট সমস্যার উপর নির্ভর করে, তবে আমি এখনও প্যাচ ব্যবহার করার পরামর্শ দেব কারণ এটি বিশেষত এই ধরণের জিনিসগুলির জন্য ডিজাইন করা হয়েছে।
juan

আমি যে ডাউনসাইডগুলি দেখছি তা হ'ল) ​​1 টি এপিআই স্পষ্টভাবে যোগাযোগ করে না কোন সংগ্রহগুলি পরিবর্তনের অনুমতি দেয়; 2) ওয়েব এপিআই প্যারামিটার বাইন্ডিং লাভ করতে পারে না; 3) বড় সুইচ বা বিবৃতি যদি।
জ্যামি আইডে

প্যাচ পদ্ধতি আমি অন্য কোথাও কখনও দেখিনি
নিমচিম্পস্কি

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