ইউআরআই বনাম কোয়েরি স্ট্রিং দ্বারা একটি আরএসটি এপিআই ডিজাইন করা


73

ধরা যাক আমার কাছে তিনটি সংস্থান রয়েছে যা এর মতো সম্পর্কিত:

Grandparent (collection) -> Parent (collection) -> and Child (collection)

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

যদি আমার ক্লায়েন্টরা কোনও পিতামাতার কাছে আইডি রেফারেন্স দেয় তবে আমি কেবল সেই শিশুদের বিরুদ্ধে অনুসন্ধান করতে চাই যারা এই পিতামাতার সরাসরি বংশধর।

যদি আমার ক্লায়েন্টরা আমাকে কোনও পিতামাতার কাছে আইডি রেফারেন্স দেয় তবে আমি কেবল তাদের পিতামাতার সরাসরি বংশধর শিশুদের বিরুদ্ধে অনুসন্ধান করতে চাই।

আমি এরকম কিছু ভেবেছি:

GET /myservice/api/v1/grandparents/{grandparentID}/parents/children?search={text}

এবং

GET /myservice/api/v1/parents/{parentID}/children?search={text}

উপরোক্ত প্রয়োজনীয়তার জন্য যথাক্রমে।

তবে আমি এটির মতোও কিছু করতে পারি:

GET /myservice/api/v1/children?search={text}&grandparentID={id}&parentID=${id}

এই নকশায়, আমি আমার ক্লায়েন্টকে কোয়েরি স্ট্রিংয়ে আমাকে একজন বা অন্যটি পাস করার অনুমতি দিতে পারলাম: دادপিতি বা প্যারেন্টআইডি, তবে উভয়ই নয়।

আমার প্রশ্নগুলি হ'ল:

1) কোন এপিআই ডিজাইনটি বেশি বিশিষ্ট এবং কেন? শব্দার্থকভাবে, তারা একইভাবে বোঝায় এবং আচরণ করে। ইউআরআই-এর সর্বশেষ সংস্থান হ'ল "শিশু", কার্যকরভাবে বোঝায় যে ক্লায়েন্ট বাচ্চাদের সংস্থানগুলিতে কাজ করছে।

২) ক্লায়েন্টের দৃষ্টিকোণ থেকে বোধগম্যতার দিক থেকে এবং ডিজাইনারের দৃষ্টিকোণ থেকে রক্ষণাবেক্ষণের দিক থেকে প্রতিটিের পক্ষে কী কী মতামত রয়েছে?

3) আপনার সংস্থানটিতে "ফিল্টারিং" ছাড়াও কোয়েরি স্ট্রিংগুলি আসলে কী জন্য ব্যবহৃত হয়? আপনি যদি প্রথম পদ্ধতির সাথে যান তবে ফিল্টার প্যারামিটারটি ক্যোরি স্ট্রিং প্যারামিটারের পরিবর্তে ইউআরআইতে একটি প্যাথ প্যারামিটার হিসাবে এম্বেড করা থাকে।

ধন্যবাদ!


3
আপনার প্রশ্নের শিরোনাম এটি দেখার জন্য যে কেউ বিভ্রান্তিকর হওয়া উচিত। একটি ইউআরআইয়ের বৈধ বিভাগগুলিকে <স্কেমে>: // <ব্যবহারকারীর: <পাসওয়ার্ড> @ <হোস্ট>: <port> / <পাথ>; <params>? <ক্যুরি> / # <ফ্রেমমেন্ট> (যদিও < পাসওয়ার্ড> অবচয় করা হয়েছে) একটি "ক্যোয়ারী স্ট্রিং" একটি ইউআরআইয়ের একটি বৈধ উপাদান তাই শিরোনামে আপনার "বনাম" ক্রেজি কথাবার্তা।
কে। অ্যালান বেটস

মানে I want to only search against children who are INdirect descendants of that grandparent.? আপনার কাঠামো অনুসারে, দাদির কোনও সরাসরি সন্তান নেই।
নাল

একটি শিশু এবং একটি পিতামাতার মধ্যে দ্বন্দ্ব কি? বাবা-মা কি সন্তান না থাকলে পিতা-মাতা? একটি ডিজাইনের ত্রুটির গন্ধ
পিনোনিক

পুনরায়: potential design flawএবং যদি আপনার কাছে কোনও ব্যক্তির তথ্য থাকে তবে তাদের বাবা-মায়ের কোনও তথ্য না থাকে তবে তারা childকী হিসাবে যোগ্যতা অর্জন করবে ? (উদাঃ, আদম এবং ইভ) :)
জেসি চিশলম

উত্তর:


64

প্রথম

অনুযায়ী বোঝায় যা RFC 3986 §3.4 (ইউনিফর্ম রিসোর্স শনাক্তকারীগণ § (সিনট্যাক্স উপাদান) | ক্যোয়ারী

৩.৪ প্রশ্ন

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

অনুসন্ধান উপাদানগুলি হায়ারার্কিকাল ডেটা পুনরুদ্ধারের জন্য; পারিবারিক গাছের চেয়ে প্রকৃতিতে আরও কিছু শ্রেণিবিন্যাসের বিষয় রয়েছে! এরগো - আপনার মনে হয় এটি "REST-y" কিনা তা বিবেচনা না করেই - ইন্টারনেটে এবং সিস্টেমের বিকাশ, বিন্যাস, প্রোটোকল এবং ফ্রেমওয়ার্কের সাথে সামঞ্জস্য করার জন্য, আপনাকে এই তথ্য সনাক্ত করতে কোয়েরি স্ট্রিং ব্যবহার করা উচিত নয়।

এই সংজ্ঞাটির সাথে REST এর কোনও যোগসূত্র নেই।

আপনার নির্দিষ্ট প্রশ্নগুলির সমাধান করার আগে আপনার "অনুসন্ধান" এর ক্যোয়ারী প্যারামিটারটি খারাপ নাম দেওয়া হয়েছে। আপনার ক্যোয়ারী বিভাগটিকে কী-মান জোড়ার একটি অভিধান হিসাবে বিবেচনা করা ভাল।

আপনার প্রশ্নের স্ট্রিং হিসাবে আরও যথাযথভাবে সংজ্ঞায়িত করা যেতে পারে

?first_name={firstName}&last_name={lastName}&birth_date={birthDate} প্রভৃতি

আপনার নির্দিষ্ট প্রশ্নের উত্তর দিতে

1) কোন এপিআই ডিজাইনটি বেশি বিশিষ্ট এবং কেন? শব্দার্থকভাবে, তারা একইভাবে বোঝায় এবং আচরণ করে। ইউআরআই-এর সর্বশেষ সংস্থান হ'ল "শিশু", কার্যকরভাবে বোঝায় যে ক্লায়েন্ট বাচ্চাদের সংস্থানগুলিতে কাজ করছে।

আপনি বিশ্বাস করেন না বলেই এটি এতটা পরিষ্কার কাটছে বলে আমি মনে করি না।

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

আরআরইএসটি সাহিত্যে যা বলে তা হ'ল আপনি যদি এইচটিটিপিকে আপনার অ্যাপ্লিকেশন প্রোটোকল হিসাবে ব্যবহার করতে চলেছেন তবে আপনাকে অবশ্যই প্রোটোকলের স্পেসিফিকেশনগুলির আনুষ্ঠানিক প্রয়োজনীয়তা মেনে চলতে হবে এবং আপনি "যেতে যেতে এইচটিপি আপ করতে পারবেন না এবং এখনও ঘোষণা করতে পারবেন যে আপনি এইচটিপি ব্যবহার করছেন" ; আপনি যদি আপনার সংস্থানগুলি সনাক্ত করার জন্য ইউআরআই ব্যবহার করতে চলেছেন তবে আপনাকে অবশ্যই ইউআরআই / ইউআরএল সম্পর্কিত স্পেসিফিকেশনের আনুষ্ঠানিক প্রয়োজনীয়তা মেনে চলতে হবে।

আপনার প্রশ্নটি সরাসরি আরএফসি 3986 §3.4 দ্বারা সম্বোধন করা হয়েছে, যা আমি উপরে লিঙ্ক করেছি। এই বিষয়টির মূল কথাটি হ'ল যদিও একটি অনুবর্তনশীল ইউআরআই কোনও API "RESTful" বিবেচনা করা অপর্যাপ্ত, আপনি যদি আপনার সিস্টেমটি আসলে "RESTful" হতে চান এবং আপনি এইচটিটিপি এবং ইউআরআই ব্যবহার করে থাকেন তবে আপনি বিভাগের মাধ্যমে শ্রেণিবদ্ধ তথ্য সনাক্ত করতে পারবেন না ক্যোয়ারী স্ট্রিং কারণ:

৩.৪ প্রশ্ন

ক্যোরির উপাদানটিতে অ-স্তরক্রমিক ডেটা রয়েছে contains

...এটা ঐটার মতই সহজ.

২) ক্লায়েন্টের দৃষ্টিকোণ থেকে বোধগম্যতার দিক থেকে এবং ডিজাইনারের দৃষ্টিকোণ থেকে রক্ষণাবেক্ষণের দিক থেকে প্রতিটিের পক্ষে কী কী মতামত রয়েছে?

প্রথম দুটির "উপকার" হ'ল তারা সঠিক পথে রয়েছে । তৃতীয়টির "কনস" এটি হ'ল এটি ভুল হিসাবে ভুল বলে মনে হচ্ছে।

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

আপনার শব্দভাণ্ডার ইউআরআইয়ের অনুবাদ তাদের অর্থপূর্ণ অর্থের /myservice/api/v1/grandparents/{grandparentID}/parents/children?search={text} জন্য এটি দাদা-দাদির পিতামাতার জন্য search={text} বলা হয়েছে, আপনার ইউআরআইয়ের সাথে আপনি যা বলেছেন তা কেবল তার পিতামাতার ভাই-বোনের সন্ধানের ক্ষেত্রেই সুসংগত find আপনার "দাদা-দাদি, বাবা-মা, বাচ্চাদের" সাথে আপনি খুঁজে পেয়েছেন একটি "দাদা বাবা" তাদের প্রজন্মের কাছে তাদের বাবা-মার কাছে গিয়েছে এবং তারপরে বাবা-মা'র বাচ্চাদের দিকে তাকিয়ে "দাদা-পিতা" প্রজন্মের কাছে ফিরে এসেছিল।

/myservice/api/v1/parents/{parentID}/children?search={text} এটি বলছে যে {প্যারেন্টআইডি by দ্বারা চিহ্নিত পিতামাতার জন্য, তাদের সন্তানের থাকার ?search={text}বিষয়টি আপনি যা চান তা সংশোধন করার আরও কাছাকাছি এবং একটি পিতামাত্ত>> সন্তানের সম্পর্কের প্রতিনিধিত্ব করে যা সম্ভবত আপনার পুরো এপিআইয়ের মডেল হিসাবে ব্যবহার করা যেতে পারে। এটিকে মডেল করার জন্য, ক্লায়েন্টকে বোঝার জন্য বোঝা চাপানো হয়েছে যে তাদের যদি একটি "পিতামহাত্মক আইড" থাকে তবে তারা যে আইডিটি দেখতে চান এবং যে পারিবারিক গ্রাফটি দেখতে চান তার মধ্যে যে দিকনির্দেশের একটি স্তর রয়েছে তার মধ্যে রয়েছে। "পিতামহী আইডি" দ্বারা "সন্তানের" /parents/{parentID}/childrenসন্ধানের জন্য , আপনি আপনার পরিষেবাতে কল করতে পারেন এবং তারপরে ফিরে আসা বাচ্চার পূর্বাভাস দিতে পারেন , তাদের ব্যক্তির পরিচয় সনাক্তকারী হিসাবে তাদের বাচ্চাদের অনুসন্ধান করতে পারেন।

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

1) প্রথমটি, আমি ইতিমধ্যে ইঙ্গিত দিয়েছি। একটি যৌগিক কাঠামো হিসাবে "লোক" এর গ্রাফ উপস্থাপন করুন। প্রতিটি ব্যক্তির তার পিতামাতার পথে এবং তার নীচের প্রজন্মের তার শিশুদের পথ ধরে এর উপরে প্রজন্মের একটি উল্লেখ রয়েছে।

/Persons/Joe/Parents/Mother/Parents জো এর মাতামহ দাদীদের দখল করার উপায় হবে।

/Persons/Joe/Parents/Parents জো এর সমস্ত দাদা দাদীদের দখল করার উপায় হবে।

/Persons/Joe/Parents/Parents?id={Joe.GrandparentID} জো যে দাদুকে আপনার হাতে থাকা শনাক্তকারীটি ধরে ফেলবে।

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

/Persons/Joe/Parents/Parents/Parents/Parents/Parents/Parents/Parents/Parents?id={Joe.NotableAncestor}

তবে এটি এই ডেটা উপস্থাপনের জন্য দ্বিতীয় প্রভাবশালী বিকল্পের দিকে নিয়ে যায়: একটি পাথ প্যারামিটারের মাধ্যমে।


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

147 প্রজন্মের দিকে ফিরে তাকাতে, পাথ প্যারামিটারগুলির সাথে এই উত্স শনাক্তকারীর প্রতিনিধিত্ব আপনাকে করতে দেয়

/Persons/Joe/Parents;generations=147?id={Joe.NotableAncestor}

জোকে তার গ্রেট পিতামাতার কাছ থেকে সনাক্ত করতে আপনি জো এর আইডির জন্য জ্ঞাত সংখ্যক প্রজন্মের গ্রাফটি নীচে দেখতে পারেন। /Persons/JoesGreatGrandparent/Children;generations=3?id={Joe.Id}

এই পদ্ধতির সাথে নোটের প্রধান বিষয়টি হ'ল শনাক্তকারী এবং অনুরোধ সম্পর্কিত আরও তথ্য ছাড়াই আপনার প্রত্যাশা করা উচিত যে প্রথম ইউআরআই জো থেকে 147 প্রজন্মের একজন ব্যক্তিকে জো.অনোটেবলঅ্যানস্টোর সনাক্তকারী সহ পুনরুদ্ধার করছে। আপনার কাছে দ্বিতীয়টিকে জো পুনরুদ্ধার করার আশা করা উচিত। অনুমান করুন যে আপনি যা করতে চান তা হ'ল আপনার কলিং ক্লায়েন্টের পক্ষে মূল ব্যক্তি এবং আপনার ইউআরআইয়ের চূড়ান্ত প্রসঙ্গের মধ্যে পুরো নোড এবং তাদের সম্পর্কগুলির পুরো পুনরুদ্ধার করতে সক্ষম হবেন। আপনি একই ইউআরআই দিয়ে (কিছু অতিরিক্ত সজ্জা সহ) এবং text/vnd.graphvizআপনার অনুরোধে একটি স্বীকৃতি নির্ধারণের মাধ্যমে এটি করতে পারেন, যা .dotগ্রাফের উপস্থাপনের জন্য আইএএনএ নিবন্ধিত মিডিয়া টাইপ । এটির সাথে, ইউআরআইতে পরিবর্তন করুন

/Persons/Joe/Parents;generations=147?id={Joe.NotableAncestor.Id}#directed

এইচটিটিপি রিকোয়েস্ট শিরোনাম সহ Accept: text/vnd.graphviz এবং আপনি ক্লায়েন্টদের মোটামুটি পরিষ্কারভাবে জানাতে পারেন যে তারা জো এবং ১৪7 প্রজন্মের মধ্যে প্রজন্মের শ্রেণিবিন্যাসের নির্দেশিত গ্রাফ চায় যেখানে 147 তম পৈতৃক প্রজন্মের কোনও ব্যক্তি জোয়ের "উল্লেখযোগ্য পূর্বপুরুষ" হিসাবে চিহ্নিত রয়েছে।

আমি নিশ্চিত না যে পাঠ্য / vnd.ગ્રાগ্রিজের খণ্ডের জন্য কোনও পূর্বনির্ধারিত শব্দার্থ রয়েছে; আমি কোনও অনুসন্ধানের জন্য খুঁজে পাইনি none যদি সেই মিডিয়া টাইপটিতে প্রকৃত সংজ্ঞায়িত খণ্ড তথ্য থাকে, তবে এর শব্দার্থকগুলি একটি উপযুক্ত ইউআরআই তৈরি করতে অনুসরণ করা উচিত। তবে, যদি সেই শব্দার্থকগুলি পূর্বনির্ধারিত না হয় তবে ইউআরআই স্পেসিফিকেশনটিতে বলা হয়েছে যে টুকরা শনাক্তকারীগুলির শব্দার্থবিজ্ঞানগুলি নিয়ন্ত্রণহীন এবং পরিবর্তে সার্ভার দ্বারা সংজ্ঞায়িত করা হয়েছে, এই ব্যবহারকে বৈধ করে তুলবে।


3) আপনার সংস্থানটিতে "ফিল্টারিং" ছাড়াও কোয়েরি স্ট্রিংগুলি আসলে কী জন্য ব্যবহৃত হয়? আপনি যদি প্রথম পদ্ধতির সাথে যান তবে ফিল্টার প্যারামিটারটি ক্যোরি স্ট্রিং প্যারামিটারের পরিবর্তে ইউআরআইতে একটি প্যাথ প্যারামিটার হিসাবে এম্বেড করা থাকে।

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


1
আরএফসি কেবল হায়ারার্কি ইনসোফারের সাথেই উদ্বিগ্ন কারণ এটি সম্পর্কিত ইউআরআই রেফারেন্স সমাধান করার জন্য একটি বাক্য গঠন এবং অ্যালগরিদমকে সংজ্ঞায়িত করে। মূল পোস্টের উদাহরণগুলি কেন মেনে চলছে না তা ব্যাখ্যা করে আপনি কিছু উত্স ব্যাখ্যা করতে বা উদ্ধৃত করতে পারেন?
ব্যবহারকারী 2313838

2
পারিবারিক গাছ কি সত্যই কোনও গ্রাফ নয় গাছ এবং নাও একেবারে শ্রেণিবদ্ধ। একাধিক পিতা-মাতার বিবেচনা, বিবাহবিচ্ছেদ এবং পুনরায় বিবাহ ইত্যাদি
মিস্টার

1
@ রবার্তোআলুই এইচটিটিপি এর জন্য ইতিমধ্যে কোনও সংজ্ঞা থাকলে খালি সেট দিয়ে আপনার নিজের "নো আইটেমস পাওয়া যায় না" ইন্টারফেসটি যোগাযোগ করা আমার কাছে বিপরীত বলে মনে হচ্ছে। মূল নীতিটি হ'ল আপনি সার্ভারকে "জিনিস (গুলি)" ফিরিয়ে দিতে বলছেন এবং যদি "জিনিস (গুলি)" ফেরার জন্য না থাকে তবে সার্ভারটি "404 - পাওয়া যায়নি" এর সাথে যোগাযোগ করে যে সে সম্পর্কে কি বিপরীত?
কে। অ্যালান বেটস

1
আমি সর্বদা 404 বিশ্বাস করেছিলাম এটি নির্দেশ করতে যে উত্সটির মূল URL পাওয়া যায় নি, অর্থাত্ সামগ্রিকভাবে সংগ্রহ। সুতরাং আপনি যদি জিজ্ঞাসা করে / বই? লেখক = জিম এবং জিমের কোনও বই না থাকলে আপনি একটি খালি সেট পেয়েছেন []। তবে আপনি যদি নিবন্ধ / নিবন্ধগুলি অনুসন্ধান করেন তবে লেখক = জিম কিন্তু নিবন্ধগুলির সংস্থানটি সংগ্রহ হিসাবেও উপস্থিত ছিল না 404 ইঙ্গিত করতে সহায়তা করবে যে কোনও নিবন্ধ সন্ধানে কোনও লাভ নেই।
29-

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

14

এটি এখানেই আপনি ভুল পেয়েছেন:

যদি আমার ক্লায়েন্টরা আমাকে একটি আইডি রেফারেন্স দেয়

একটি আরআরইএসটি সিস্টেমে ক্লায়েন্টকে কখনই আইডি নিয়ে বিরক্ত করা উচিত নয়। একমাত্র সংস্থান শনাক্তকারী যা ক্লায়েন্ট সম্পর্কে জানা উচিত তা ইউআরআই হওয়া উচিত। এটি "ইউনিফর্ম ইন্টারফেস" এর মূলনীতি।

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

লিংক মত দেখায় কিনা /grandparent/123?search={term}বা /parent?grandparent=123&search={term}বা /parent?grandparentTerm=someterm&someothergplocator=blah&search={term}বিশ্রাম অনুযায়ী তুচ্ছ হয়। লক্ষ্য করুন যে এই সমস্ত ইউআরএলগুলির কীভাবে একই সংখ্যার পরামিতি রয়েছে, {term}যদিও তারা বিভিন্ন মানদণ্ড ব্যবহার করে। আপনি এই URL গুলির যে কোনও একটির মধ্যে স্যুইচ করতে পারেন বা নির্দিষ্ট দাদা-দাদির উপর নির্ভর করে আপনি সেগুলি মিশ্রিত করতে পারেন এবং ক্লায়েন্টটি ভেঙে পড়বে না, কারণ অন্তর্নিহিত বাস্তবায়ন উল্লেখযোগ্যভাবে পৃথক হতে পারে সত্ত্বেও সংস্থানগুলির মধ্যে যৌক্তিক সম্পর্ক একই।

আপনি যদি পরিবর্তে পরিষেবাটি তৈরি করে থাকেন তবে /grandparent/{grandparentID}?search={term}যখন আপনি একপথে যেতে চান তবে /children?parent={parentID}&search={term}একটি} যখন আপনি অন্য পথে যান, এটি খুব বেশি মিলিত হয় কারণ ক্লায়েন্টকে ধারণাগতভাবে সাদৃশ্যযুক্ত বিভিন্ন সম্পর্কের উপর বিভিন্ন জিনিসকে বিভক্ত করতে হবে।

আপনি প্রকৃতপক্ষে যাচ্ছেন /grandparent/123?search={term}বা /parent?grandparent=123&search={term}স্বাদযুক্ত এবং যে কোনও বাস্তবায়ন আপনার পক্ষে এখনই সহজ Whether গুরুত্বপূর্ণ বিষয় হ'ল আপনি যদি আপনার ইউআরএল কৌশল পরিবর্তন করেন বা আপনি বিভিন্ন পিতামাতার-সন্তানের সম্পর্কের ক্ষেত্রে বিভিন্ন কৌশল ব্যবহার করেন তবে ক্লায়েন্টকে সংশোধন করা দরকার না।


10

আমি নিশ্চিত নই কেন লোকেরা ইউআরএল-তে আইডি মান রাখার অর্থ এটি কোনওভাবেই একটি REST এপিআই, REST ক্রিয়াগুলি পরিচালনা করা, সংস্থানগুলি পাস করার বিষয়ে।

সুতরাং আপনি যদি কোনও নতুন ব্যবহারকারীকে পুট রাখতে চান, আপনাকে একটি ন্যায্য তথ্য প্রেরণ করতে হবে এবং একটি পোষ্ট HTTP অনুরোধটি আদর্শ, সুতরাং আপনি কীটি (যেমন, ব্যবহারকারী আইডি) প্রেরণ করতে পারেন, আপনি ব্যবহারকারীর ডেটা প্রেরণ করবেন (যেমন নাম, ঠিকানা) পোস্টের ডেটা হিসাবে।

এখন ইউআরআইতে রিসোর্স আইডেন্টিফায়ার লাগানো একটি প্রচলিত প্রথা, তবে এটি ইউআরআইতে না থাকলে "এটি আরএসটি নয় তবে" নীতিগত কোনও রূপের চেয়ে বেশি কনভেনশন। মনে রাখবেন যে আরইএসটি- র মূল থিসিসটি প্রকৃতপক্ষে কোনও পোস্টের উল্লেখ করে না, এটি কোনও ক্লায়েন্ট-সার্ভারে ডেটা পরিচালনা করার জন্য একটি প্রতিমা, HTTP- র এক্সটেনশন এমন কিছু নয় (যদিও স্পষ্টতই, http আমাদের REST প্রয়োগের প্রাথমিক ফর্ম) ।

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

REST পরিবর্তে লেখক এমন একটি সংস্থান শনাক্তকারী বেছে নেওয়ার উপর নির্ভর করে যা ধারণাটির স্বরূপ চিহ্নিত হওয়ার পরে সবচেয়ে ভাল ফিট করে

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

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

সুতরাং ... আপনার ইউআরআই-তে আপনার কিছু সংস্থান সনাক্তকরণ হওয়া দরকার থাকলেও এটি আপনার আইডি রেফারেন্স হতে হবে না। এটি আনন্দের সাথে নিয়ন্ত্রণ ডেটা হিসাবে, ক্যোরি স্ট্রিং বা এমনকি পোস্টে ডেটা হিসাবে প্রেরণ করা যেতে পারে। আপনি আপনার আরএসটি এপিআইতে যা সত্যই সনাক্ত করছেন তা হ'ল আপনি সন্তানের পরে, যা ইতিমধ্যে আপনার ইউআরআইতে রয়েছে।

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


বাস্তবে, ইউআরআই একটি ধারণা হিসাবে বিশ্রামের কেন্দ্রীয়। ইউআরআই সিনট্যাক্স যদিও যা গুরুত্বপূর্ণ তা নয়। একটি যথাযথ REST ইন্টারফেস অবশ্যই একটি সাধারণ সিনট্যাক্স সহ সংস্থানগুলি সনাক্ত করতে পারে। আরএসটি নীতিটির ভিত্তিতে, আরএফসি 3986 ইউআরআইয়ের পরিবর্তে কোনও জেএসওএন অবজেক্টের সাথে জটিল সংস্থান চিহ্নিত করা অগত্যা খারাপ নয়, যদিও আপনি যদি এটি করেন তবে আপনার পুরো API এর জন্য আপনার JSON RI ব্যবহার করা উচিত।
মিথ্যা রায়ান

4

প্রচুর লোকেরা রেস্টের অর্থ কী, ইত্যাদির বিষয়ে অলরেডি কথা বলেছে তবে আসল সমস্যাটির কোনওোটাকেই সম্বোধন করতে পারে বলে মনে হচ্ছে না: আপনার নকশা।

পিতামহ কেন পিতাদের চেয়ে আলাদা? তাদের দুজনেরই এমন সন্তান রয়েছে যার সম্ভবত এমন বাচ্চা থাকতে পারে ...

শেষ পর্যন্ত তারা সবাই 'মানুষ' ' আপনার সম্ভবত এটি আপনার কোডেও রয়েছে। সুতরাং এটি ব্যবহার করুন:

GET /<api-endpoint>/humans/<ID>

মানব সম্পর্কে কিছু দরকারী তথ্য ফিরিয়ে দেবে। (নাম এবং স্টাফ)

GET /<api-endpoint>/humans/<ID>/children

স্পষ্টতই বাচ্চাদের একটি অ্যারে ফিরিয়ে দেবে। যদি কোনও শিশুদের অস্তিত্ব না থাকে তবে একটি খালি অ্যারে সম্ভবত যাওয়ার উপায়।

এটি সহজ করার জন্য, আপনি উদাহরণস্বরূপ একটি 'হ্যাজ চিলড্রেন' পতাকা যুক্ত করতে পারেন। বা 'hasGrandChildren'।

আরও বেশি স্মার্ট চিন্তা করুন


1

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

GET /myservice/api/v1/grandparents/{grandparentID}
GET /myservice/api/v1/grandparents/{grandparentID}/parents/children?search={text}

ক্যোয়ারী প্যারামিটার অনুসন্ধানটি সেই সংস্থানটির প্রসঙ্গ থেকে কোনও অনুসন্ধান চালানোর জন্য একটি ভাল উপায়।

যখন কোনও পরিবার খুব বড় হয়ে উঠছে আপনি উদাহরণস্বরূপ ক্যোয়ারী বিকল্প হিসাবে শুরু / সীমা ব্যবহার করতে পারেন:

GET /myservice/api/v1/grandparents/{grandparentID}/children?start=1&limit=50

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

হতে পারে এটি একটি ভাল পঠনযোগ্য http://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling এবং অন্যথায় রায় টি ফিল্ডিংয়ের মূল পিএইচডি থিসিস https://www.ics.uci.edu /~fielding/pubs/dissertation/fielding_dissertation.pdf যা ধারণাগুলি খুব ভাল এবং সম্পূর্ণরূপে ব্যাখ্যা করে।


1

আমি সাথে যাব

/myservice/api/v1/people/{personID}/descendants/2?search={text}

এক্ষেত্রে প্রতিটি উপসর্গ বৈধ সংস্থান:

  • /myservice/api/v1/people: সমস্ত মানুষ
  • /myservice/api/v1/people/{personID}: সম্পূর্ণ তথ্য সহ এক ব্যক্তি (পূর্বপুরুষ, ভাইবোন, বংশধর সহ)
  • /myservice/api/v1/people/{personID}/descendants: এক ব্যক্তির বংশধর
  • /myservice/api/v1/people/{personID}/descendants/2: এক ব্যক্তির নাতি নাতনি

সেরা উত্তর নাও হতে পারে তবে কমপক্ষে আমার কাছে তা বোধগম্য হয়।


-1

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

আপনার উদাহরণে / মাইসারওয়াইস / এপিআই / ভি 1 / দাদা-দাদী / {দাদা-পিতামহান} / পিতা-মাতা / বাচ্চারা? অনুসন্ধান = {পাঠ্য}

আপনি যদি এটিকে / মাইসারওয়াইস / এপি / ভি 1 / ভাইবোনফফ গ্র্যান্ডপ্যারেন্টস সংক্ষিপ্ত করে রাখেন তবে আরও অর্থবহ সংস্থান হতে পারে? অনুসন্ধান = ..

এক্ষেত্রে আপনি 'ভাইবোনআফগ্র্যান্ড প্যারেন্টস' রিসোর্স হিসাবে ঘোষণা করতে পারেন..এটি ইউআরএলকে সহজ করে তোলে

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


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

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