আরইএসটি কমপ্লেক্স / কম্পোজিট / নেস্টেড রিসোর্স [বন্ধ]


177

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

উদাহরণস্বরূপ, আমার কাছে একটি কমিক বইয়ের সংস্থান আছে। ComicBookএটা বৈশিষ্ট্য সমস্ত প্রকারের মত author, issue number, date, ইত্যাদি

একটি কমিক বইতেও 1..nকভারগুলির একটি তালিকা রয়েছে। এই কভারগুলি জটিল বস্তু। তারা কভার সম্পর্কে প্রচুর তথ্য ধারণ করে: শিল্পী, একটি তারিখ এবং এমনকি কভারের একটি বেস 64 এনকোডযুক্ত চিত্র।

একটি GETঅন ​​জন্য ComicBookআমি শুধু কমিক এবং তাদের বেস 64'ed ইমেজ সহ সমস্ত কভার ফিরে আসতে পারে। একক কমিক পাওয়ার জন্য এটি সম্ভবত কোনও বড় বিষয় নয়। তবে ধরুন আমি একটি ক্লায়েন্ট অ্যাপ তৈরি করছি যা সিস্টেমে সমস্ত কমিকসকে একটি টেবিলের মধ্যে তালিকাবদ্ধ করতে চায়।
সারণীতে ComicBookসংস্থান থেকে কয়েকটি বৈশিষ্ট্য থাকবে , তবে আমরা অবশ্যই টেবিলের সমস্ত কভার প্রদর্শন করতে চাই না। একাধিক কভার সহ 1000 টি কমিক বই ফিরিয়ে দেওয়ার ফলে তারে জুড়ে একটি হাস্যকরভাবে প্রচুর পরিমাণে ডেটা আসবে, এমন তথ্য যা সেই ক্ষেত্রে শেষ ব্যবহারকারীর জন্য প্রয়োজনীয় নয়।

আমার প্রবৃত্তিটি Coverএকটি উত্স তৈরি করা এবং ComicBookকভার থাকতে পারে। সুতরাং এখন Coverএকটি ইউআরআই। GETকমিক বইয়ের উপর এখন কাজ করে, বিশাল Coverসংস্থানগুলির পরিবর্তে আমরা প্রতিটি কভারের জন্য একটি ইউআরআই প্রেরণ করি এবং ক্লায়েন্টরা তাদের প্রয়োজনীয় কভার সংস্থানগুলি পুনরুদ্ধার করতে পারে।

এখন নতুন কমিকস তৈরি করতে আমার সমস্যা হচ্ছে। আমি যখন একটি তৈরি করি তখন অবশ্যই আমি কমপক্ষে একটি কভার তৈরি করতে চাই Comic, বাস্তবে এটি সম্ভবত একটি ব্যবসায়ের নিয়ম।
তাই এখন আমি করছি আটকে, আমি হয় ক্লায়েন্ট প্রথমে একটি জমা দিয়ে ব্যবসার নীতি জোরদার করা বাধ্য Cover, যে কভার জন্য কোনো URI পেয়ে, তারপর POSTing একটি ComicBookসঙ্গে তালিকায় কোনো URI, বা আমার যে POSTউপর ComicBookএকটি ভিন্ন খুঁজছেন রিসোর্স লাগে এটা spits চেয়ে বাইরে। আগত সংস্থাগুলির জন্য POSTএবং GETএটি গভীর অনুলিপি হয়, যেখানে বিদায়ীগুলির GETমধ্যে নির্ভরশীল সংস্থানগুলির উল্লেখ রয়েছে contain

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



1
আমি HATEAOS মেনে চলার চেষ্টা করছি যা আমার মনে, এরকম কিছু ব্যবহার করার জন্য পাল্টা হয় তবে আমি একবার দেখে নিই।
জাগারম্যান

একই চেতনায় বিভিন্ন প্রশ্ন। তবে মালিকানাটি আপনার প্রস্তাবিত সমাধানের চেয়ে আলাদা (প্রশ্নটির একটি)। stackoverflow.com/questions/20951419/…
ওয়েস

উত্তর:


64

@ রায়, দুর্দান্ত আলোচনা

@ জেগারম্যান, এটি বিশ্রামের কারণে ভুলে যাবেন না, এর অর্থ এই নয় যে পোস্টগুলি থেকে প্রস্তুতি স্থাপন করতে হবে।

কোনও উত্সের যে কোনও প্রদত্ত প্রতিনিধিত্বের মধ্যে আপনি কী অন্তর্ভুক্ত করবেন তা আপনার উপর নির্ভর করে।

আপনার পৃথকভাবে উল্লেখ করা কভারগুলির কেসটি কেবলমাত্র পিতামাতুল সংস্থান (কমিক বই) তৈরি করা যার সন্তানের সংস্থানগুলি (কভারগুলি) ক্রস-রেফারেন্সড হতে পারে। উদাহরণস্বরূপ, আপনি লেখক, প্রকাশক, চরিত্র বা বিভাগগুলি পৃথকভাবে সরবরাহ করতে পারেন। আপনি এই সংস্থানগুলি আলাদাভাবে বা কমিক বইয়ের আগে তৈরি করতে চাইতে পারেন যা তাদের শিশু সম্পদ হিসাবে উল্লেখ করে। বিকল্পভাবে, আপনি পিতামাত্ত সংস্থান তৈরির পরে নতুন শিশু সংস্থান তৈরি করতে ইচ্ছুক হতে পারেন।

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

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

এই টিউটোরিয়ালটি ক্রস-রেফারেন্সযুক্ত সংস্থানগুলির দুর্দান্ত উদাহরণ সরবরাহ করে। http://www.peej.co.uk/articles/restfully-delicious.html

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

আপনার বাইনারি তথ্য ক্ষেত্রে একটি উদাহরণ। উদাহরণস্বরূপ, আপনি বাইনারি ডেটা শিশু সংস্থান হিসাবে পোস্ট করতে চান। আপনি যখন প্যারেন্ট রিসোর্স পাবেন তখন আপনি সেই শিশু সংস্থাগুলিকে একই বাইনারি ডেটা বা ইউআরআই হিসাবে বাইনারি ডেটার প্রতিনিধিত্ব করতে পারেন represent

ফর্মগুলি এবং প্যারামিটারগুলি সম্পদের HTML উপস্থাপনার চেয়ে ইতিমধ্যে পৃথক। বাইনারি / ফাইলের পরামিতি পোস্ট করা যার ফলস্বরূপ ইউআরএল আসে না।

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

আপনি কোনও এইচআইএমএল, এক্সএমএল, বা জেএসওএন উপস্থাপনাকে কোনও এপিআই বা অনুরূপ উদ্দেশ্যে, সংস্থান সংস্থায় পোস্ট করার অনুমতি দিতে চাইতে পারেন।

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

  • বিলম্বিত কভার তৈরির অনুমতি দেয়
  • প্রয়োজনীয় কভার সহ কমিক বই তৈরির অনুমতি দেয়
  • কভারগুলি ক্রস-রেফারেন্স করার অনুমতি দেয়
  • একাধিক কভার অনুমতি দেয়
  • খসড়া কমিক বই তৈরি করুন
  • খসড়া কমিক বইয়ের কভার তৈরি করুন
  • খসড়া কমিক বই প্রকাশ করুন

GET / কমিক-বই
=> 200 ঠিক আছে, সমস্ত কমিক বই পান।

GET / কমিক-বই / 0
=> 200 ঠিক আছে, কভার (/ কভার / 1, / কভার / 2) সহ কমিক বই (আইডি: 0) পান।

GET / কমিক-বই / 0 / Cover
=> 200 ঠিক আছে, কমিক বইয়ের জন্য কভার পান (আইডি: 0)।

GET / Cover
=> 200 ঠিক আছে, সমস্ত কভার পান।

GET / Cover / 1
=> 200 ঠিক আছে, কমিক বই (/ কমিক-বই / 0) সহ কভার (আইডি: 1) পান।

জিইটি / কমিক-বই / নতুন
=> 200 ঠিক আছে, কমিক বইটি তৈরি করতে ফর্ম পান (ফর্ম: পোস্ট / খসড়া-কমিক-বই) books

পোস্ট / খসড়া-কমিক-বইয়ের
শিরোনাম = foo
লেখক = বু
প্রকাশক = goo
প্রকাশিত = 2011-01-01
=> 302 পাওয়া গেছে, অবস্থান: / খসড়া-কমিক-বই / 3, খসড়া কমিক বইতে পুনর্নির্দেশ (আইডি: 3) সহ কভারস (বাইনারি)

জিইটি / খসড়া-কমিক-বই / 3
=> 200 ঠিক আছে, কভার সহ খসড়া কমিক বই (আইডি: 3) পান।

জিইটি / খসড়া-কমিক-বই / 3 / কভার
=> 200 ঠিক আছে, খসড়া কমিক বইয়ের জন্য কভার পান (/ খসড়া-কমিক-বই / 3)।

জিইটি / খসড়া-কমিক-বই / 3 / কভার / নতুন
=> 200 ঠিক আছে, খসড়া কমিক বইয়ের জন্য কভার তৈরি করতে ফর্ম পান (/ খসড়া-কমিক-বই / 3) (ফর্ম: পোস্ট / খসড়া-কমিক-বই / 3 / কভার)।

পোস্ট / ড্রাফ্ট-কমিক-বই / 3 / কভার
কভার_ টাইপ = ফ্রন্ট
কভার_ডাটা = (বাইনারি)
=> 302 পাওয়া গেছে, অবস্থান: / খসড়া-কমিক-বই / 3 / কভার, খসড়া কমিক বইয়ের জন্য নতুন কভারটিতে পুনঃনির্দেশ করুন (/ খসড়া-কমিক) -book / 3 / কভার / 1)।

জিইটি / খসড়া-কমিক-বই / 3 / প্রকাশ
=> 200 ঠিক আছে, খসড়া কমিক বই প্রকাশের জন্য ফর্ম পান (আইডি: 3) (ফর্ম: পোস্ট / প্রকাশিত-কমিক-বই)।

পোষ্ট / প্রকাশিত-কমিক-বইয়ের
শিরোনাম = ফু
লেখক = বু
প্রকাশক = গু
প্রকাশিত = 2011-01-01
Cover_type = সামনের
কভার_ডেটা = (বাইনারি)
=> 302 পাওয়া গেছে, অবস্থান: / কমিক-বই / 3, প্রকাশিত কমিক বইতে পুনর্নির্দেশ (আইডি: 3) কভার সহ।


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

3
@ গ্যারিম্যাকগিল তার উদাহরণে, / খসড়া-কমিক-বই / 3 / প্রকাশ কেবলমাত্র একটি HTML ফর্ম দেয় (কোনও ডেটা সংশোধন করে না)।
অলিভিয়ের লালনডে

@ অলিভার সঠিক is ফর্মটি কী করে তা বোঝাতে এখানে প্রকাশ শব্দটি রয়েছে। তবে, আপনি ক্রিয়াটি এইচটিটিপি পদ্ধতিতে সীমাবদ্ধ রাখতে চান বলে আপনার প্রকাশিত কমিক বইয়ের জন্য কোনও উত্সে পোস্ট করা উচিত। ... এটি যদি কোনও ওয়েবসাইট হয় তবে কিছু প্রকাশের জন্য আপনাকে ফর্মের জন্য ইউআরআই লাগতে পারে। ... যদিও, প্রকাশের ক্রিয়াটি যদি কমিক বইয়ের পৃষ্ঠায় কেবলমাত্র একটি একক বোতাম হয় তবে সেই একক-বোতাম ফর্মটি সরাসরি / প্রকাশিত-কমিক-বই ইউআরআইতে পোস্ট করতে পারে।
অ্যালেক্স

@ অ্যালেক্স, পোষ্ট অনুরোধে আমি পরিবর্তে একটি 201 তৈরি করব, প্রতিক্রিয়া শিরোনামে অবস্থান হিসাবে নতুন সংস্থানটির URL দিয়ে।
ismriv

2
@ স্টেফেন, পুনঃনির্দেশগুলি নিয়ন্ত্রণকারীদের জন্য সবকিছুকে আরও সহজ করে তোলে। এমনকি কোনও এপিআইয়ের জন্যও, ক্রিয়েট কন্ট্রোলার নতুন সামগ্রীর জন্য অবস্থানটি ফিরিয়ে দেওয়া সহজ, এবং তারপরে শো কন্ট্রোলারটিকে নতুন সামগ্রীর প্রদর্শন পরিচালনা করতে দেয়। যদিও, এটিপি এর ক্লায়েন্টের পক্ষে কেবল সামগ্রীটি পাওয়া এবং পুনঃনির্দেশগুলি নিয়ে বিরক্ত না করা সহজ / সহজ।
অ্যালেক্স

45

সম্পদ হিসাবে কভার চিকিত্সা অবশ্যই বিশ্রামের স্পিরিটে, বিশেষত HATEOAS ATE হ্যাঁ, কভারগুলির জন্য ইউআরআই সেট সহ বৈশিষ্ট্য সহ আপনাকে বই 1 এর একটি প্রতিনিধিত্ব করার GETঅনুরোধ http://example.com/comic-books/1রইল। এ পর্যন্ত সব ঠিকই.

আপনার প্রশ্নটি কীভাবে কমিক বই তৈরির সাথে ডিল করবেন। যদি আপনার ব্যবসায়ের নিয়মটি ছিল যে কোনও বইতে 0 বা তার বেশি কভার থাকে তবে আপনার কোনও সমস্যা নেই:

POST http://example.com/comic-books

কভারলেস কমিক বইয়ের ডেটা সহ একটি নতুন কমিক বই তৈরি করবে এবং সার্ভারটি উত্পন্ন আইডি ফিরিয়ে দেবে (এটি আবার 8 হিসাবে ফিরে আসে বলে মনে হয়), এবং এখন আপনি এটির মতো কভার যুক্ত করতে পারেন:

POST http://example.com/comic-books/8/covers

সত্তা শরীরের কভার সহ।

এখন আপনার কাছে একটি ভাল প্রশ্ন রয়েছে যা আপনার ব্যবসায়ের নিয়মটিতে সর্বদা কমপক্ষে একটি কভার থাকা আবশ্যক হলে কি হয়। এখানে কিছু পছন্দ রয়েছে, যার মধ্যে প্রথমটি আপনি আপনার প্রশ্নে চিহ্নিত করেছেন:

  1. প্রথমে একটি কভার তৈরি করার জন্য বাধ্য করুন, এখন মূলত একটি অননির্ভরশীল সংস্থানটি কভার করে, বা আপনি প্রাথমিক কভারটি পোস্টের সত্তা বডিতে রাখেন যা কমিক বইটি তৈরি করে। আপনি যেমনটি বলছেন এর অর্থ হ'ল আপনি যে প্রতিনিধিত্বটি তৈরি করতে পারেন তা আপনার যে প্রতিনিধিত্বের থেকে আলাদা হবে।

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

কেবল কভারলেস কমিকসকে অনুমতি দেওয়ার বিরুদ্ধে আপনার এই দুটি পছন্দ বিবেচনা করা উচিত।

আপনার তিনটি পছন্দ কোনটি গ্রহণ করা উচিত? আপনার পরিস্থিতি সম্পর্কে খুব বেশি কিছু না জেনে, তবে সাধারণের উত্তর দিন।

  • আপনি যদি আপনার রেস্টস্টুল সার্ভিস লেয়ারের জন্য 0..N এর সাথে যেতে পারেন তবে দুর্দান্ত। কমপক্ষে একটি প্রয়োজন হলে সম্ভবত আপনার বিশ্রামের এসওএর মধ্যে একটি স্তর আরও ব্যবসায়ের সীমাবদ্ধতা পরিচালনা করতে পারে। (এটি কীভাবে দেখতে পারা যায় তা নিশ্চিত নয় তবে এটি অনুসন্ধানের পক্ষে মূল্যবান হতে পারে .... শেষ ব্যবহারকারীরা সাধারণত এসওএ দেখতে পাবেন না))

  • যদি আপনার কেবল একটি 1..N সীমাবদ্ধতা মডেল করা আবশ্যক, তবে নিজেকে জিজ্ঞাসা করুন যে কভারগুলি কেবল শেয়ারযোগ্য সংস্থান হতে পারে, অন্য কথায়, এগুলি কমিক বই ব্যতীত অন্য কোনও জিনিসে থাকতে পারে। এখন তারা নির্ভরশীল সংস্থান নয় এবং আপনি প্রথমে এগুলি তৈরি করতে এবং আপনার পোষ্টে ইউআরআই সরবরাহ করতে পারেন যা কমিকের বই তৈরি করে।

  • আপনার যদি 1..N প্রয়োজন হয় এবং কভারগুলি নির্ভরশীল থাকে তবে কেবল উপস্থাপনাটি পোষ্টে রাখার জন্য ঝোঁকটি শিথিল করুন বা সেগুলি একই করুন।

শেষ আইটেমটি এর মতো ব্যাখ্যা করা হয়েছে:

<comic-book>
  <name>...</name>
  <edition>...</edition>
  <cover-image>...BASE64...</cover-image>
  <cover-image>...BASE64...</cover-image>
  <cover>...URI...</cover>
  <cover>...URI...</cover>
</comic-book>

আপনি যখন পোস্ট করেন আপনি বিদ্যমান ইউরিসগুলি যদি তা (অন্য বই থেকে ধার করা) থাকে তবে তা এক বা একাধিক প্রাথমিক ছবিতে রাখার অনুমতি দিন। আপনি যদি একটি বই তৈরি করছেন এবং আপনার সত্তার কোনও প্রাথমিক কভার-চিত্র না থাকলে একটি 409 বা অনুরূপ প্রতিক্রিয়া ফিরিয়ে দিন। জিইটি-তে আপনি ইউআরআই ফিরিয়ে দিতে পারবেন ..

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

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