RESTful API: ভাগ করা বা নির্দিষ্ট ইউআরএল সহ HTTP ক্রিয়াগুলি?


25

একটি RESTful এপিআই তৈরি করার সময় , আমি কি একই ইউআরএলটিতে HTTP ক্রিয়াগুলি ব্যবহার করতে পারি (যখন এটি সম্ভব হয়) বা ক্রিয়া প্রতি আমার একটি নির্দিষ্ট ইউআরএল তৈরি করা উচিত?

উদাহরণ স্বরূপ:

GET     /items      # Read all items
GET     /items/:id  # Read one item
POST    /items      # Create a new item
PUT     /items/:id  # Update one item
DELETE  /items/:id  # Delete one item

অথবা নির্দিষ্ট URL গুলি সহ:

GET     /items            # Read all items
GET     /item/:id         # Read one item
POST    /items/new        # Create a new item
PUT     /item/edit/:id    # Update one item
DELETE  /item/delete/:id  # Delete one item

উত্তর:


46

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

কেবল একবার দেখুন DELETE /item/delete/:id, আপনি একই অনুরোধে দু'বার একই তথ্য রাখেন । এটি অতি ضرورتবহ এবং এড়ানো উচিত। ব্যক্তিগতভাবে, আমি এটির সাথে বিভ্রান্ত হব। এপিআই কি আসলে DELETEঅনুরোধ সমর্থন করে ? আমি যদি deleteইউআরএল এ রাখি এবং পরিবর্তে একটি আলাদা এইচটিটিপি ক্রিয়া ব্যবহার করি? এটি কিছু মিলবে? যদি তা হয় তবে কোনটি বেছে নেওয়া হবে? সঠিকভাবে ডিজাইন করা এপিআইয়ের ক্লায়েন্ট হিসাবে, আমাকে এই জাতীয় প্রশ্ন জিজ্ঞাসা করা উচিত নয়।

সম্ভবত আপনার কোনও প্রয়োজন এমন ক্লায়েন্টকে সমর্থন করা দরকার যা জারি DELETEবা PUTঅনুরোধ করতে পারে না । যদি এটি হয় তবে আমি এই তথ্যটি একটি এইচটিটিপি শিরোনামের মধ্যে দিয়ে দেব। কিছু এপিআই X-HTTP-Method-Overrideএই নির্দিষ্ট উদ্দেশ্যে (যা আমি যাইহোক বেশ কুৎসিত বলে মনে করি) জন্য একটি শিরোলেখ ব্যবহার করে। আমি অবশ্যই পথেগুলিতে ক্রিয়াগুলি রাখব না।

যাও

GET     /items      # Read all items
GET     /items/:id  # Read one item
POST    /items      # Create a new item
PUT     /items/:id  # Update one item
DELETE  /items/:id  # Delete one item

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

আরও কী, একটি RESTful API এ ক্রিয়াগুলি (বা এর কোনও উপসেট) কোনও অ্যাপ্লিকেশন শব্দার্থবিজ্ঞানের কোনও সেটগুলিতে ম্যাপ করতে পারে, যতক্ষণ না এটি HTTP নির্দিষ্টকরণের বিরুদ্ধে না যায়। উদাহরণস্বরূপ, একটি RESTful API তৈরি করা পুরোপুরি সম্ভব যা কেবলমাত্র জিইটি অনুরোধগুলি ব্যবহার করে যদি এটির অনুমতি দেওয়া সমস্ত ক্রিয়াকলাপ নিরাপদ এবং আদর্শবান্ধব উভয়ই থাকে । উপরের ম্যাপিংটি কেবলমাত্র একটি উদাহরণ যা আপনার ব্যবহারের ক্ষেত্রে ফিট করে এবং সেই অনুমানের সাথে সামঞ্জস্যপূর্ণ। অগত্যা এটির মতো হওয়ার দরকার নেই।

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


4
অভাবে PUTএবং DELETEআমি পথে এটি যোগ, না একটি কোয়েরি স্ট্রিং সঙ্গে এটি পার্থক্যকারী তাওফীক দিবেন। এটি কোনও বিদ্যমান ক্রিয়াকলাপে কোয়েরি স্ট্রিং পরিবর্তন নয়; এটি একটি পৃথক অপারেশন।
রবার্ট হার্ভে

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

আপনার যদি সমস্ত ক্রিয়াপদ না থাকে তবে তা কোনওভাবেই সম্পূর্ণ বিশ্রামের নয়, তাই না?
রবার্ট হার্ভে

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

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

14

প্রথমটি.

একটি ইউআরআই / ইউআরএল হ'ল সংস্থান শনাক্তকরণ (নামে ইঙ্গিত: অভিন্ন সংস্থান শনাক্তকারী)। প্রথম কনভেনশন সহ, আপনি যখন "জিইটি / ব্যবহারকারী / 123" করবেন এবং যখন আপনি "ডিলেট / ব্যবহারকারী / 123" করবেন তখন যে সংস্থানটি সম্পর্কে কথা বলা হচ্ছে তা স্পষ্টতই একই উত্স কারণ তাদের একই URL রয়েছে।

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

আপনি যখন বলছেন DELETE /user/123, আপনি "123 আইডি আইডি দিয়ে" ব্যবহারকারী রেকর্ডটি মুছুন "বলছেন। আপনি যদি বলছেন DELETE /user/delete/123, আপনি যা বোঝাচ্ছেন বলে মনে হচ্ছে তা হল "আইডি 123 'দিয়ে" ব্যবহারকারী মুছে ফেলা রেকর্ড "মুছে ফেলা, যা সম্ভবত আপনি বলতে চান না। এমনকি যদি আপনি এই পরিস্থিতিতে আরও সঠিক ক্রিয়াটি ব্যবহার করেন: "পোস্ট / ব্যবহারকারী / মুছুন / 123" যা "আইডি 123 'দিয়ে" ব্যবহারকারী মুছে ফেলার সাথে সংযুক্ত অপারেশন করুন ", এটি এখনও একটি রেকর্ড মুছে ফেলার বলার পথ নয় (এটি ইংরেজিতে ক্রিয়াপদের নামকরণের অনুরূপ)।

ইউআরএল সম্পর্কে আপনি যেভাবে ভাবতে পারেন তা হ'ল বিষয়বস্তু ও সংস্থানগুলিকে পয়েন্টারগুলির মতো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের বিষয় হিসাবে বিবেচনা করা। আপনি যখন তা করবেন GET /user/123, DELETE /user/123: আপনি বস্তুর পদ্ধতি যেমন তাদের মনে মনে করতে পারেন [/user/123].get(), [/user/123].delete()যেখানে []একটি পয়েন্টার অপারেটর dereferencing মত কিন্তু URL গুলি জন্য (যদি আপনি আছে পয়েন্টার একটি ভাষা জানেন)। আরইএসটি-র অন্তর্নিহিত নীতিগুলির মধ্যে একটি হ'ল ইউনিফর্ম ইন্টারফেস, অর্থাত্ সংক্ষিপ্ত ক্রিয়া / পদ্ধতিগুলির একটি ছোট এবং সীমাবদ্ধ সেট থাকা যা সম্পদ / অবজেক্টের বিশাল নেটওয়ার্কের প্রতিটি কিছুর জন্য কাজ করে।

সুতরাং, প্রথমটি আরও ভাল।

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



6

(দুঃখিত, আমি আমার প্রথম বার / সম্পাদনা / এবং / মোছা / ইন (2) মিস করেছি ...)

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

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

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

সুতরাং "/ আইটেম / ডিলিট / 123" REST কে বিরতি দেয় কারণ এটি কোনও উত্সকে নির্দেশ করে না, এটি আরও একটি পদ্ধতির প্রার্থনা।

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

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

সুতরাং, উদাহরণস্বরূপ, যদি আপনি সত্যিই কোনও কারণে এটি ব্যবহার করতে পারেন না:

DELETE /items/123

আপনি বিশ্বের কাছে ঘোষণা করতে পারেন যে আপনার কাছে একটি "মুছে ফেলা" প্রক্রিয়াকরণ সংস্থান এবং ব্যবহার রয়েছে

POST /items/deletor  { id: 123 }

এখন, এটি দেখতে অনেকটা আরপিসির (রিমোট প্রসিডিউর কল) এর মতো, তবে এটি পিটিএসটি স্পেসিফিকেশনটির "ডেটা প্রসেসিং" ক্লজটির এইচটিটিপি স্পেসে বর্ণিত বিশাল লুপফুলের মধ্য দিয়ে পড়ে।

তবে এটি করা একধরনের ব্যতিক্রমী এবং যদি আপনি তৈরি / আপডেটের জন্য সাধারণ পুট ব্যবহার করতে পারেন, মুছে ফেলার জন্য মুছে ফেলুন, এবং সংযোজন, তৈরি এবং অন্য সব কিছুর জন্য পোস্ট করুন, তবে আপনার উচিত , কারণ এটি HTTP এর আরও মানক ব্যবহার standard তবে আপনার যদি "কমিট" বা "প্রকাশ" বা "রেডাক্ট" এর মতো কৃপণ মামলা থাকে, তবে প্রসেসরের বিশেষ্যটি ব্যবহারের ক্ষেত্রে আরইএসটি পিউরিস্টদের সন্তুষ্ট করে এবং তারপরেও আপনাকে প্রয়োজনীয় শব্দার্থবিদ্যা দেয়।

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