আমি কখন একটি রিয়েলস্টুল এপিআইতে পাথ পেরাম বনাম কোয়েরি প্যারাম ব্যবহার করব?


141

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

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


1
একই ধরণের প্রশ্নের উত্তর এখানে দেওয়া আছে ... stackoverflow.com/questions/3198492/…
ললিত মেহরা

উত্তর:


239

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

এখানে একটি উদাহরণ। মনে করুন আপনি গাড়ি নামে একটি সত্তার জন্য RESTful API এন্ডপয়েন্টগুলি প্রয়োগ করছেন। আপনি আপনার শেষ পয়েন্টগুলি এভাবে গঠন করবেন:

তাহলে GET /cars
তাহলে GET /cars/:id
পোস্ট /cars
রাখুন /cars/:id
মুছে দিন/cars/:id

আপনি যখন কোন উত্সটি আনবেন তা সুনির্দিষ্ট করার সময় আপনি কেবলমাত্র পথের পরামিতিগুলি ব্যবহার করছেন তবে এটি কোনওভাবেই সংস্থানগুলি / ছাঁটাই করে না resources

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

পাওয়া /cars?color=blue

এই শেষ পয়েন্টটি কার্যকর করা হবে যাতে কেবল নীল গাড়িগুলিই ফিরে আসবে।

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

যাত্রা। /two-words


3
আপনার উত্তর মাইকে জন্য ধন্যবাদ। এটি একটি ক্লিয়ারকাট এবং সহজ পদ্ধতি; আমার কাছ থেকে একটি ভোট মূল্য। তবুও, প্রায়শই, বিকাশকারীরা 'গাড়ি / নীল' পদ্ধতির বিকল্প বেছে নেয়, আমি ভাবছি যে এটি করার জন্য তাদের যুক্তিটি কী ... সম্ভবত তারা বাধ্যতামূলক ক্ষেত্রগুলির জন্য পথের প্যারামগুলি তৈরি করার সিদ্ধান্ত নিয়েছে বা সম্ভবত তারা এটি চিহ্নিত করতে এটি করে ডাটাবেসটি সেই শার্ড দ্বারা বিভক্ত হয়।
কোসবোর্ড 11

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

3
আইডি = 1 এবং রঙ = গাড়ি / 1 /? রঙ = নীল পরিবর্তে কি? আপনি প্রতিটি
দৃশ্যে

1
ভুল যেহেতু আইডি 1 সহ গাড়ী কেবল একটিতে রয়েছে তবে রঙ নীল রঙের গাড়িগুলি অনেকেরই হতে পারে। পরিচয় এবং ফিল্টার মধ্যে পার্থক্য আছে
পল

1
পথের প্যারামগুলি কেন ব্যবহার করা যায় তা সম্পর্কে আমার হাইপোথিসিসটি হ'ল কারণ অনেকগুলি বিকাশকারীরা তাদের দ্বারা নকশা করা ফ্রেমওয়ার্কগুলি থেকে শিখেছিলেন যাঁরা
আরইএসটি

58

এই বিষয়টি সম্পর্কে চিন্তা করার মৌলিক উপায়টি নিম্নরূপ:

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

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

GET /cars/honda/civic/coupe/{vin}/{color=red}

এবং বছরগুলি পরে, যদি এই খুব একই গাড়ির রঙটি কালো হয়ে যায়:

GET /cars/honda/civic/coupe/{vin}/{color=black}

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

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

GET /cars/honda/civic/coupe/{vin}?color={black}

নীচের লাইন - ভাবনা বহুবচন।


2
আকর্ষণীয় দৃষ্টান্ত .. এটি কি সাধারণভাবে ব্যবহৃত ডিজাইনের প্যাটেন? আপনি কি কিছু এপিআই প্রদান করতে পারেন যা তাদের ডকুমেন্টেশনে এটি ব্যবহার করে বা কিছু কৌশল যা এই কৌশলটির রূপরেখা দেয়?
কোসবার 11

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

15

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

যাইহোক, আমি ধরে নিই যে আপনি একটি সত্যই REST এপিআই তৈরি করছেন না, তবে একটি 'REST অনুপ্রাণিত' API (যেমন গুগল ড্রাইভের মতো)। এই ক্ষেত্রে থাম্বের নিয়ম হ'ল 'প্যাথ প্যারামস = রিসোর্স আইডেন্টিফিকেশন' এবং 'ক্যোয়ারী প্যারামগুলি = রিসোর্স সাজ্টিং'। সুতরাং, প্রশ্নটি হয়ে ওঠে, আপনি কি অনন্যভাবে আপনার সংস্থানটি / অঞ্চল ছাড়াই সনাক্ত করতে পারবেন? যদি হ্যাঁ, তবে সম্ভবত এটি একটি কোয়েরি পরম। যদি না হয়, তবে এটি একটি পথ পরম।

আছে HTH।


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

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

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

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

3
নিম্নলিখিত শব্দগুলি ব্যবহার করার জন্য +1: "'পথের প্যারামগুলি = সংস্থান সনাক্তকরণ' এবং 'ক্যোয়ারী প্যারামগুলি = সংস্থান সাজানো'"। এটি সত্যিই আমার জন্য এটি পরিষ্কার করেছে।
ডগ

3

একবার আমি একটি এপিআই ডিজাইন করেছিলাম যা প্রধান সংস্থান ছিল people। সাধারণত ব্যবহারকারীরা ফিল্টারটির জন্য অনুরোধ করতেন people, যাতে /people?settlement=urbanপ্রতিবারের মতো কিছু কল করার জন্য ব্যবহারকারীদের বাধা দিতে , আমি কার্যকর করেছিলাম /people/urbanযা পরে আমাকে সহজেই যুক্ত করতে সক্ষম করে /people/rural। এছাড়াও /peopleএটি পরবর্তী তালিকাতে যদি কোনও কাজে আসে তবে পুরো তালিকাটি অ্যাক্সেস করার অনুমতি দেয় । সংক্ষেপে, আমার যুক্তিটি ছিল সাধারণ সাবসেটের জন্য একটি পথ যুক্ত করা

থেকে এখানে :

সাধারণ প্রশ্নের জন্য উপাত্ত

গড় গ্রাহকের পক্ষে API অভিজ্ঞতা আরও সুখকর করতে, সহজেই অ্যাক্সেসযোগ্য RESTful পাথগুলিতে শর্তের সেটগুলি প্যাকেজিংয়ের বিষয়টি বিবেচনা করুন। উদাহরণস্বরূপ, উপরে সম্প্রতি বন্ধ টিকিট ক্যোয়ারী হিসাবে প্যাকেজ করা যেতে পারেGET /tickets/recently_closed


1

সাধারণভাবে বলতে গেলে, যখন সংস্থানটিতে স্পষ্টত 'শ্রেণিবিন্যাস' থাকে তখন আমি পথের পরামিতিগুলি ব্যবহার করি:

/region/state/42

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

/region/state/42/status

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


0

বিভাগটি আরও শ্রেণিবদ্ধ এবং "সুন্দর" তবে সীমাবদ্ধ হতে পারে।

উদাহরণস্বরূপ, যদি আপনার কাছে তিনটি বিভাগের ইউআরএল থাকে তবে প্রতিটি, মেক, মডেল এবং রঙের মাধ্যমে গাড়ি অনুসন্ধান করার জন্য বিভিন্ন পরামিতিগুলি পেরিয়ে যায়:

www.example.com/search/honda/civic/blue

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

www.example.com/search?color=blue
www.example.com/search?make=civic

এখন আপনার কীটির কোডটির মাধ্যমে মানটি উল্লেখ করার একটি উপায় রয়েছে - আপনার কোয়েরি কোডে "রঙ" বা "মেক" হয়।

আপনি সম্ভবত আরও বেশি বিভাগ ব্যবহার করে এক ধরণের মূল মান কাঠামো তৈরি করতে এগুলি পেতে পারেন:

www.example.com/search/make/honda/model/civic/color/blue

আশা করি তা বোঝায় ..


-2

উদাহরণ ইউআরএল: /rest/{keyword}

এই URL টি পথের পরামিতিগুলির উদাহরণ। আমরা এই ইউআরএল ডেটা ব্যবহার করে পেতে পারি @PathParam

উদাহরণ ইউআরএল: /rest?keyword=java&limit=10

এই URL টি কোয়েরি পরামিতিগুলির একটি উদাহরণ। আমরা এই ইউআরএল ডেটা ব্যবহার করে পেতে পারি @Queryparam

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