রেস্ট নেস্টেড রিসোর্সের জন্য সেরা অনুশীলনগুলি কী কী?


301

যতদূর আমি বলতে পারি প্রতিটি স্বতন্ত্র সংস্থার কেবল একটি ক্যানোনিকাল পাথ থাকতে হবে। তাহলে নীচের উদাহরণে ভাল ইউআরএল প্যাটার্নগুলি কী হবে?

উদাহরণস্বরূপ সংস্থাগুলির বিশ্রাম উপস্থাপনা নিন। এই প্রকল্পিত উদাহরণে, প্রতিটি কোম্পানির মালিক 0 বা আরো বিভাগ এবং প্রতিটি ডিপার্টমেন্টে মালিক 0 বা আরো কর্মচারী।

কোনও সম্পর্কিত সংস্থা ছাড়া কোনও বিভাগের অস্তিত্ব থাকতে পারে না

কোনও কর্মী সম্পর্কিত বিভাগ ছাড়া থাকতে পারে না

এখন আমি উত্স নিদর্শন প্রাকৃতিক উপস্থাপনা খুঁজে পেতে চাই।

  • /companies সংস্থাগুলির একটি সংগ্রহ - নতুন কোম্পানির জন্য গ্রহণ গ্রহণসমূহ cep পুরো সংগ্রহের জন্য পান।
  • /companies/{companyId}একটি স্বতন্ত্র সংস্থা। জিইটি, পুট এবং ডিলিট গ্রহণ করে
  • /companies/{companyId}/departmentsএকটি নতুন আইটেমের জন্য পোষ্ট গ্রহণ করে। (সংস্থার মধ্যে একটি বিভাগ তৈরি করে))
  • /companies/{companyId}/departments/{departmentId}/
  • /companies/{companyId}/departments/{departmentId}/employees
  • /companies/{companyId}/departments/{departmentId}/employees/{empId}

প্রতিটি বিভাগে প্রতিবন্ধকতাগুলি দেওয়া, আমি অনুভব করি যে কিছুটা গভীরভাবে বাসা বেঁধে থাকলে এটি বোধগম্য হয়।

তবে, আমার অসুবিধা যদি আসে তবে আমি GETসমস্ত সংস্থার সমস্ত কর্মী তালিকাভুক্ত করতে চাই ।

এর জন্য সংস্থান নিদর্শন সর্বাধিক কাছাকাছি মানচিত্র করতে হবে /employees(সমস্ত কর্মীদের সংগ্রহ)

তার মানে কি আমারও হওয়া উচিত /employees/{empId}কারণ যদি তাই হয় তবে একই সংস্থানটি পেতে দুটি ইউআরআই আছে?

অথবা সম্ভবত পুরো স্কিমা সমতল করা উচিত তবে এর অর্থ হ'ল কর্মীরা নেস্টেড শীর্ষ-স্তরের অবজেক্ট।

একটি বেসিক স্তরে /employees/?company={companyId}&department={deptId}কর্মীদের সম্পর্কে ঠিক একইভাবে নেস্টেড প্যাটার্ন হিসাবে একই দৃষ্টিভঙ্গি প্রদান করে।

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


1
এটি প্রায় হুবহু বর্ণনা যে oppsite সমস্যা stackoverflow.com/questions/7104578/... যদিও উত্তর সম্পর্কিত হতে পারে। উভয় প্রশ্নই মালিকানা সম্পর্কে তবে সেই উদাহরণটি বোঝায় যে শীর্ষ স্তরের অবজেক্টটি তার নিজস্ব নয়।
ওয়েজ

1
ঠিক কী নিয়ে আমি ভাবছিলাম। প্রদত্ত ব্যবহারের ক্ষেত্রে আপনার সমাধানটি সূক্ষ্ম বলে মনে হচ্ছে, তবে যদি সম্পর্কটি কোনও সংমিশ্রণের পরিবর্তে সমষ্টি হয় তবে কী হবে? এখনও সর্বোত্তম অনুশীলনটি এখানে কী তা বোঝার জন্য লড়াই করে চলেছে ... এছাড়াও, এই সমাধানটি কি কেবল সম্পর্কের সৃজনকে বোঝায়, উদাহরণস্বরূপ কোনও বিদ্যমান ব্যক্তি নিযুক্ত আছেন বা এটি কোনও ব্যক্তির অবজেক্ট তৈরি করে?
Jakob O.

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

আমি আমার প্রশ্নের উত্তর এবং প্রশ্নের মধ্যে বিভক্ত করেছি।
ওয়েজ

উত্তর:


152

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

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

কেবলমাত্র কর্মচারীরা বিভাগের অধীনে প্রবেশযোগ্য:

company/{companyid}/department/{departmentid}/employees

এর অর্থ এই নয় যে তারা সংস্থার অধীনেও অ্যাক্সেসযোগ্য হতে পারে না:

company/{companyid}/employees

যা ওই সংস্থার কর্মচারীদের ফিরিয়ে দেবে। এটি আপনার গ্রাহক ক্লায়েন্টের কী প্রয়োজন তা নির্ভর করে - এটিই আপনার জন্য নকশা করা উচিত।

তবে আমি আশা করব যে সমস্ত ইউআরএল হ্যান্ডলাররা অনুরোধগুলি পূরণ করতে একই ব্যাকিং কোডটি ব্যবহার করে যাতে আপনি কোডটি নকল করছেন না।


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

13
আপনার যদি উভয় রুট প্রয়োজন হয় তবে @ বুকুন, তারপরে পুনরাবৃত্ত নিয়ন্ত্রক কোডটি পরিষেবা সামগ্রীতে বিমূর্ত করা যেতে পারে।
বিগকোড

এটির সাথে আরএসইএসের কোনও সম্পর্ক নেই। আপনি কীভাবে আপনার ইউআরএলগুলির পাথ অংশটি কাঠামো গঠন করেন সে সম্পর্কে
আরআরইএসটি

এই উত্তরে ড্রাইভিং করে, আমি মনে করি যে কোনও এপিআই যেখানে ডায়নামিক বিভাগগুলি সমস্ত অনন্য শনাক্তকারক সেগুলি একাধিক গতিশীল বিভাগগুলি ( /company/3/department/2/employees/1) পরিচালনা করতে হবে না । যদি এপিআই প্রতিটি সংস্থান পাওয়ার উপায় সরবরাহ করে, তবে সেই অনুরোধগুলির প্রত্যেকটি তৈরি করা কোনও ক্লায়েন্টের পাশের লাইব্রেরিতে বা কোডটিকে পুনরায় ব্যবহার করে এমন এক-অফ এন্ডপয়েন্ট হিসাবে করা যেতে পারে।
সর্বোচ্চ

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

174

নেস্টেড এবং অ-নেস্টেড এন্ডপয়েন্টস - উভয়ই আমি নকশার কৌশল চেষ্টা করেছি। আমি এটি খুঁজে পেয়েছি:

  1. যদি নেস্টেড রিসোর্সটির একটি প্রাথমিক কী থাকে এবং আপনার কাছে এর মূল পিতা নেই, তবে প্রকৃতপক্ষে সিস্টেমটির প্রয়োজন না থাকলেও নেস্টেড স্ট্রাকচারটি আপনাকে এটিটি পেতে হবে।

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

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

  4. কখনও কখনও কোনও সংস্থার একাধিক ধরণের বাবা-মা থাকতে পারে। একসাথে একসাথে শেষ হওয়া সমস্ত ফলাফল একই ফলাফলের ফলাফল returning

  5. অপ্রয়োজনীয় এন্ডপয়েন্টস ডকসগুলিকে লেখা শক্ত করে তোলে এবং এপিআই শেখা আরও শক্ত করে তোলে।

সংক্ষেপে, অ-নেস্টেড ডিজাইনটি আরও নমনীয় এবং সহজ শেষ পয়েন্ট স্কিমার মঞ্জুরি দেয়।


24
এই উত্তরটি এসে খুব সতেজ ছিল। "সঠিক উপায়" শেখানোর পরে আমি বেশ কয়েক মাস ধরে নেস্টেড এন্ডপয়েন্টগুলি ব্যবহার করছি। আপনি উপরে উল্লিখিত একই সিদ্ধান্তে আমি এসেছি। একটি অনিচ্ছাকৃত ডিজাইন দিয়ে এত সহজ।
user3344977

6
আপনি ডাউনসাইডগুলির কয়েকটি আপসাইড হিসাবে তালিকাভুক্ত করেছেন। "কেবলমাত্র একটি একক প্রান্তে আরও বেশি প্যারামিটার ক্র্যাম করুন" এপিআইটিকে নথিভুক্ত করা এবং শিখতে আরও শক্ত করে তোলে, অন্যভাবে নয়। ;-)
ডেনমি

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

3
@ স্কটম - নেস্টেড রিসোর্সগুলির একটি অপূর্ণতা যা আমি এসেছিলাম তা হ'ল যদি প্যারেন্ট রিসোর্স আইডির ভুল / মিল না থাকে তবে এটি ভুল ডেটা ফিরিয়ে আনতে পারে। কোনও অনুমোদনের সমস্যা নেই বলে ধরে নিলাম, নেস্টেড রিসোর্সটি সত্যিকার অর্থে যে উত্তীর্ণ হয়েছে সেই পিতা-মাতার উত্সের সন্তান verify যদি এই চেকটি কোড করা না হয় তবে এপিআই প্রতিক্রিয়া ভুল হতে পারে যার ফলে দুর্নীতির দিকে এগিয়ে যায়। আপনার চিন্তা কি?
অ্যান্ডি ডুফ্রেসনে

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

77

আমি প্রশ্ন থেকে যা করেছি তা এমন একটি উত্তরে নিয়ে গিয়েছি যেখানে আরও বেশি লোকেরা এটি দেখার সম্ভাবনা রয়েছে।

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

সুতরাং এই উদাহরণে (কেবলমাত্র শেষের পয়েন্টগুলি তালিকাভুক্ত করুন যা একটি সংস্থান পরিবর্তন করে)

  • POST /companies/ একটি নতুন সংস্থা তৈরি করে তৈরি করা সংস্থার একটি লিঙ্ক ফেরত।
  • POST /companies/{companyId}/departments যখন কোনও বিভাগ স্থাপন করা হয় তখন নতুন বিভাগ একটি লিঙ্ক ফেরত দেয় /departments/{departmentId}
  • PUT /departments/{departmentId} একটি বিভাগ পরিবর্তন
  • POST /departments/{deparmentId}/employees একটি নতুন কর্মচারী একটি লিঙ্ক ফেরত তৈরি করে /employees/{employeeId}

সুতরাং প্রতিটি সংগ্রহের জন্য মূল স্তরের সংস্থান রয়েছে। তবে তৈরি হয় মালিক অবজেক্ট।


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

আমি অনুমান করি আপনি POSTঅর্থটি ব্যবহার করেছেন PUTএবং অন্যথায়।
জেরার্ডো লিমা

প্রকৃতপক্ষে কোনও নোট নেই যে আমি এই ক্ষেত্রে সার্ভার হিসাবে তৈরির জন্য পূর্ব নির্ধারিত আইডি ব্যবহার করছি না আইডি ফিরিয়ে দেওয়ার জন্য (লিঙ্কে) দায়বদ্ধ। অতএব পোস্ট পোস্ট সঠিক (একই বাস্তবায়নের উপর ভিত্তি করে কিছু করতে পারে না)। পুট যদিও পুরো সংস্থান পরিবর্তন করে তবে এটি এখনও একই জায়গায় পাওয়া যায় তাই আমি এটি রাখি। পুট বনাম পোস্ট একটি আলাদা বিষয় এবং এটি বিতর্কিতও। উদাহরণস্বরূপ stackoverflow.com/questions/630453/put-vs-post-in-rest
ওয়েস

@ ওয়েস এমনকি আমি পিতামাতার অধীনে থাকতে ক্রিয়াপদের পদ্ধতিগুলি সংশোধন করতে পছন্দ করি। তবে, আপনি কী দেখছেন যে বিশ্বব্যাপী সংস্থানগুলির জন্য পাসওয়ার্ডের পাসওয়ার্ডগুলি ভালভাবে গৃহীত হয়েছে? উদাহরণস্বরূপ: পোস্ট পোস্ট / বিভাগগুলি ক্যোয়ারী প্যারামিটার সংস্থা = সংস্থা-আইডি
আইয়্প্পা

1
@ মোহামাদ যদি আপনি মনে করেন যে অন্য উপায় বোঝার ক্ষেত্রে এবং প্রতিবন্ধকতাগুলি প্রয়োগ করার ক্ষেত্রে উভয়ই সহজ তবে কোনও উত্তর দিতে নির্দ্বিধায়। এই ক্ষেত্রে ম্যাপিং সুস্পষ্ট করার বিষয়ে। এটি একটি পরামিতি নিয়ে কাজ করতে পারে তবে প্রশ্নটি কী তা সত্যই তা বোঝায়। সবচেয়ে ভালো উপায় কি.
ওয়েজ

35

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

আরও জটিল সিস্টেমে, ইউআরআই সরবরাহ করা লোভনীয় হতে পারে যা ক্লায়েন্টকে বিভিন্ন স্তরের সম্পর্কের মধ্য দিয়ে চলাচল করতে সক্ষম করে, /customers/1/orders/99/products.তবে, জটিলতার এই স্তরটি বজায় রাখা কঠিন হতে পারে এবং যদি ভবিষ্যতে সংস্থানগুলির মধ্যে সম্পর্ক পরিবর্তিত হয় তবে তা জটিল নয়। পরিবর্তে, ইউআরআই তুলনামূলক সহজ রাখার চেষ্টা করুন । একবার কোনও অ্যাপ্লিকেশনটির কোনও সংস্থার রেফারেন্স হয়ে গেলে, সেই উত্স সম্পর্কিত আইটেমগুলি খুঁজে পেতে এই রেফারেন্সটি ব্যবহার করা উচিত। /customers/1/ordersগ্রাহক 1 এর সমস্ত আদেশ /orders/99/productsপেতে এবং তারপরে এই ক্রমে পণ্যগুলি সন্ধানের জন্য পূর্ববর্তী কোয়েরিটি ইউআরআই দিয়ে প্রতিস্থাপন করা যেতে পারে ।

ডগা

রিসোর্স ইউআরআই এর চেয়ে জটিল আরও এড়ানোর প্রয়োজন collection/item/collection


3
আপনি যে রেফারেন্সটি দিচ্ছেন তা জটিল ইউআরআই তৈরি না করে দাঁড়িয়ে থাকা পয়েন্টের সাথে আশ্চর্যজনক।
ভিসকো

সুতরাং যখন আমি কোনও ব্যবহারকারীর জন্য একটি দল তৈরি করতে চাই, তখন এটি পোস্ট / টিমগুলি (কারওর মধ্যে ব্যবহারকারীর আইডি) বা পোষ্ট / ব্যবহারকারী /: আইডি / দলগুলি হওয়া উচিত
coinhndp

@Coinhndp হাই, আপনার পোস্ট / টিম ব্যবহার করা উচিত এবং অ্যাক্সেস টোকেন অনুমোদনের পরে আপনি ইউজারআইডি পেতে পারেন। মানে আপনি যখন কোনও স্টাফ তৈরি করেন তখন আপনার অনুমোদনের কোড দরকার? আপনি কোন কাঠামোটি ব্যবহার করছেন তা আমি জানি না তবে আমি নিশ্চিত আপনি API কন্ট্রোলারে ইউজারআইডি পেতে পারেন। উদাহরণস্বরূপ: এএসপি.এনইটি এপিআইতে, অ্যাপিকন্ট্রোলারের কোনও পদ্ধতির মধ্যে থেকে অনুরোধকন্টেক্সটকে প্রিন্সিপালকে কল করুন। স্প্রিং সিকিওরিটিতে, সিকিউরিটি কনটেক্সটহোল্ডার.জেটকন্টেক্সট ()। GetAuthentication ()। GetPr اصেন্টাল () আপনাকে সহায়তা করবে। এডাব্লুএস নোডজেএস ল্যাম্বদা-তে, এটি হ'ল কগনিটো: শিরোনামের বিষয়টিতে ব্যবহারকারীর নাম।
লং

তাহলে পোষ্ট / ব্যবহারকারী /: আইডি / টিমগুলিতে কী হয়েছে। আমি মনে করি আপনি মাইক্রোসফ্ট ডকুমেন্টে এটি প্রস্তাবিত যা আপনি উপরে পোস্ট করেছেন
coinhndp

@Coinhndp আপনি যদি অ্যাডমিন হিসাবে দল তৈরি করেন তবে এটি বেশ ভাল। তবে, সাধারণ ব্যবহারকারী হিসাবে, আমি জানি না কেন আপনার পথে ইউজারআইডি দরকার? আমি অনুমান করি যে আমাদের ব্যবহারকারী_এ এবং ব্যবহারকারী_বি রয়েছে, আপনি কী মনে করেন যদি ব্যবহারকারী_এ পোষ্ট / ব্যবহারকারী / ব্যবহারকারী_বি / টিমকে কল করে তবে ব্যবহারকারী_এ ব্যবহারকারী_বি এর জন্য একটি নতুন দল তৈরি করতে পারে। সুতরাং, ব্যবহারকারী আইড পাস করার দরকার নেই এই ক্ষেত্রে, ব্যবহারকারী আইডি অনুমোদনের পরে পেতে পারে। তবে দল / / আইডি / প্রকল্পগুলি উদাহরণস্বরূপ দল এবং প্রকল্পের মধ্যে সম্পর্ক স্থাপন করা ভাল।
লং

10

আপনার ইউআরএলগুলি কীভাবে দেখায় তাতে বিশ্রামের কোনও সম্পর্ক নেই। কিছু যায়। এটি আসলে একটি "বাস্তবায়ন বিশদ"। আপনি ঠিক কিভাবে আপনার ভেরিয়েবল নাম। তাদের হতে হবে সমস্ত অনন্য এবং টেকসই।

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

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

কোনও আরএসটি এপিআইএলতে ইউআরএল কতটা সুন্দর / বোধগম্য তা কেবল আপনার API এর বিকাশকারী হিসাবে API বিকাশকারী হিসাবে আকর্ষণীয়, আপনার কোডটিতে কোনও ভেরিয়েবলের নাম হবে।

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

  • আপনার মিডিয়া টাইপের একটি লিঙ্কের সম্পত্তি রয়েছে যা উপলভ্য / সম্পর্কিত লিঙ্কগুলি তালিকাভুক্ত করে।
  • প্রতিটি লিঙ্কটি একটি সম্পর্কের মাধ্যমে সনাক্ত করা হয় (যেমন ব্রাউজারগুলি জানেন যে লিঙ্ক [rel = "স্টাইলশিট"] এর অর্থ এটি একটি স্টাইল শীট বা rel = ফেভিকো একটি ফ্যাভিকনের লিঙ্ক ...)
  • এবং এটি জানা যায় যে এই সম্পর্কগুলি কী বোঝায় ("সংস্থাগুলি" অর্থ সংস্থাগুলির একটি তালিকা, "অনুসন্ধান" অর্থ সংস্থানগুলির তালিকায় অনুসন্ধান করার জন্য একটি টেম্প্লেটেড ইউআরএল, "বিভাগগুলি" অর্থ বর্তমান সংস্থার বিভাগগুলি)

নীচে এইচটিটিপি এক্সচেঞ্জের একটি উদাহরণ দেওয়া হয়েছে (মৃতদেহগুলি ইমলে রয়েছে যেহেতু এটি লেখা সহজ):

অনুরোধ

GET / HTTP/1.1
Host: api.acme.io
Accept: text/yaml, text/acme-mediatype+yaml

প্রতিক্রিয়া: মূল সংস্থানগুলির লিঙ্কগুলির একটি তালিকা (সংস্থাগুলি, লোকেরা, যাই হোক না কেন ...)

HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:04:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml

# body: this is your API's entrypoint (like a homepage)  
links:
  # could be some random path https://api.acme.local/modskmklmkdsml
  # the only thing the API client cares about is the key (or rel) "companies"
  companies: https://api.acme.local/companies
  people: https://api.acme.local/people

অনুরোধ: সংস্থাগুলিতে লিঙ্ক করুন (আগের প্রতিক্রিয়ার বডি.লিঙ্কস ডটকম ব্যবহার করুন)

GET /companies HTTP/1.1
Host: api.acme.local
Accept: text/yaml, text/acme-mediatype+yaml

প্রতিক্রিয়া: সংস্থাগুলির একটি আংশিক তালিকা (আইটেমের অধীনে), সংস্থানটি সম্পর্কিত লিঙ্কগুলি অন্তর্ভুক্ত করে, পরবর্তী সংস্থাগুলি (বডি.লিংকস এনেক্সট) অনুসন্ধানের (বডি.লিংকস.আরচ) এর অন্য একটি (টেম্প্লেটেড) লিঙ্ক পাওয়ার লিঙ্কের মতো related

HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:06:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml

# body: representation of a list of companies
links:
  # link to the next page
  next: https://api.acme.local/companies?page=2
  # templated link for search
  search: https://api.acme.local/companies?query={query} 
# you could provide available actions related to this resource
actions:
  add:
    href: https://api.acme.local/companies
    method: POST
items:
  - name: company1
    links:
      self: https://api.acme.local/companies/8er13eo
      # and here is the link to departments
      # again the client only cares about the key department
      department: https://api.acme.local/companies/8er13eo/departments
  - name: company2
    links:
      self: https://api.acme.local/companies/9r13d4l
      # or could be in some other location ! 
      department: https://api2.acme.local/departments?company=8er13eo

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


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

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

4
আমি কখনও এমন একটি API বা UI তৈরি করতে আপত্তি জানাই যা মানুষের জন্য ব্যবহারকারী বান্ধব নয়। স্তর 3 বা না, আমি সংযুক্ত সংস্থানগুলি এক দুর্দান্ত ধারণা agree তবে এমনটি করার জন্য "ইউআরএল স্কিম পরিবর্তন করা সম্ভব করে তোলে" পরামর্শ দেওয়ার জন্য বাস্তবতার সংস্পর্শে না আসা এবং লোকেরা কীভাবে API গুলি ব্যবহার করে। সুতরাং এটি একটি খারাপ প্রস্তাব। তবে নিশ্চিত যে সমস্ত বিশ্বের সর্বোত্তমরূপে প্রত্যেকেরই স্তর 3 REST এ থাকবে। আমি হাইপারলিঙ্কগুলি অন্তর্ভুক্ত করেছি এবং একটি মানবিকভাবে বোধগম্য ইউআরএল স্কিম ব্যবহার করি। স্তর 3 প্রাক্তনকে বাদ দেয় না এবং আমার মতে একটি যত্ন নেওয়া উচিত care যদিও ভাল নিবন্ধ :)
জোয়াকিম

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

9

আমি এই জাতীয় পথের সাথে একমত নই

GET /companies/{companyId}/departments

আপনি যদি বিভাগগুলি পেতে চান তবে আমার মনে হয় / বিভাগগুলির সংস্থান ব্যবহার করা ভাল

GET /departments?companyId=123

আমি মনে করি আপনার কাছে একটি companiesটেবিল এবং একটি departmentsটেবিল রয়েছে তবে আপনি যে প্রোগ্রামিং ভাষাটি ব্যবহার করেন সেগুলিতে তাদের ম্যাপ করার জন্য ক্লাস রয়েছে। আমি এটিও ধরে নিয়েছি যে বিভাগগুলি সংস্থাগুলির তুলনায় অন্যান্য সত্তার সাথে সংযুক্ত থাকতে পারে, সুতরাং একটি / বিভাগের সংস্থান সোজা হয়, টেবিলগুলিতে সংস্থানগুলি সংস্থান করা সুবিধাজনক এবং এছাড়াও আপনি পুনরায় ব্যবহার করতে পারেন সেজন্য আপনার এতগুলি শেষ পয়েন্টের প্রয়োজন নেই since

GET /departments?companyId=123

উদাহরণস্বরূপ কোনও ধরণের অনুসন্ধানের জন্য

GET /departments?name=xxx
GET /departments?companyId=123&name=xxx
etc.

আপনি যদি একটি বিভাগ তৈরি করতে চান তবে

POST /departments

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


1
আমার কাছে, এটি কেবল তখনই গ্রহণযোগ্য পন্থা যদি নেস্টেড বস্তুটি পারমাণবিক অবজেক্ট হিসাবে বোধ করে। যদি তারা না হয় তবে এগুলি আলাদা করে ফেলা সত্যিকার অর্থে বোঝা যাবে না।
সিম্মে

এটি আমি বলেছিলাম, আপনি যদি বিভাগগুলি পুনরুদ্ধার করতে সক্ষম হতে চান তবে আপনি যদি কোনও বিভাগ / বিভাগের বিন্দু ব্যবহার করেন তবে তা বোঝা যাবে।
ম্যাক্সিম লাভাল

2
কোনও সংস্থা আনার সময় অলস লোডিংয়ের মাধ্যমে বিভাগগুলিকে অন্তর্ভুক্ত করার মঞ্জুরি দেওয়ার বিষয়টিও বোধগম্য হতে পারে GET /companies/{companyId}?include=departments, যেহেতু এটি সংস্থা এবং এর বিভাগ উভয়কেই একক এইচটিটিপি অনুরোধে আনতে দেয়। ফ্র্যাক্টাল এটি সত্যিই ভাল করে।
ম্যাথু ডেলি

1
আপনি যখন অ্যাকসেল সেট আপ করছেন আপনি সম্ভবত শেষ পয়েন্টটি /departmentsকেবলমাত্র একজন প্রশাসক দ্বারা অ্যাক্সেসযোগ্য হতে সীমাবদ্ধ করতে চান এবং প্রতিটি সংস্থাকে কেবল `/ সংস্থাগুলি / {কোম্পানীআইডি} / বিভাগসমূহের মাধ্যমে তাদের নিজস্ব বিভাগগুলি অ্যাক্সেস করতে হবে
কুজক্স

@ ম্যাথেজডালি ওডাটাও $ প্রসারিত করে সুন্দরভাবে এটি করেন
রব গ্রান্ট

1

কড়াগুলি এর সমাধান দেয়: অগভীর বাসা বাঁধে

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

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