একটি RESTful API এ কমান্ড প্যাটার্ন প্রয়োগ করা


12

আমি একটি এইচটিটিপি এপিআই ডিজাইনের প্রক্রিয়াধীন, আশা করি এটি যতটা সম্ভব বিশ্রামিত করা যায়।

কিছু ক্রিয়া রয়েছে যা কার্যকারিতা কয়েকটি সংস্থার উপরে ছড়িয়ে পড়ে এবং কিছু সময় পূর্বাবস্থায় ফিরানো দরকার।

আমি নিজেকে ভেবেছিলাম, এটি একটি কমান্ড প্যাটার্নের মতো মনে হচ্ছে, তবে কীভাবে আমি এটি একটি সংস্থান হিসাবে মডেল করব?

আমি ডিপোজিট অ্যাকশন-এর মতো এক্সএক্সএকশন নামে একটি নতুন সংস্থান চালু করব, যা এই জাতীয় কিছু মাধ্যমে তৈরি করা হবে

POST /card/{card-id}/account/{account-id}/Deposit
AmountToDeposit=100, different parameters...

এটি আসলে একটি নতুন আমানত তৈরি করবে এবং এটি কর / সম্পাদন পদ্ধতিটি সক্রিয় করবে। এই ক্ষেত্রে, একটি 201 টি তৈরি HTTP স্থিতি ফিরিয়ে দেওয়ার অর্থ ক্রিয়াটি সফলভাবে সম্পাদিত হয়েছে।

পরে যদি কোনও ক্লায়েন্ট তার করতে পারে এমন ক্রিয়া বিশদটি সন্ধান করতে চায়

GET /action/{action-id}

আপডেট / পুট ব্লক করা উচিত আমার ধারণা, কারণ এটি এখানে প্রাসঙ্গিক নয়।

এবং ক্রিয়াটি পূর্বাবস্থায় ফেলার জন্য, আমি ব্যবহার করার কথা ভেবেছিলাম

DELETE /action/{action-id}

যা প্রকৃতপক্ষে প্রাসঙ্গিক অবজেক্টের পূর্বাবস্থায় ফিরবে এবং তার স্থিতি পরিবর্তন করবে।

ধরা যাক আমি কেবল একটি ডু-আনডো নিয়ে খুশি, আমার আর পুনরায় করার দরকার নেই।

এই পদ্ধতির ঠিক আছে?

এটি ব্যবহার না করার জন্য কোনও সমস্যা আছে কি?

এটি কি ক্লায়েন্টদের পিওভি থেকে বোঝা যায়?


সংক্ষিপ্ত উত্তর, এটি বিশ্রাম নয়।
ইভান প্লেস

3
@ ইভ্যানপ্ল্লেইস এর উপর বিস্তারিত জানাতে যত্নশীল? ঠিক এটাই প্রশ্ন।
মিথির

1
আমি একটি উত্তরে ব্যাখ্যা করতে পারতাম তবে গ্যারি এর উত্তর ইতিমধ্যে বেশিরভাগ / সমস্ত আমি জুড়ে যাব তা জুড়েছে। আমি বলছি এটি বিশ্রাম নয় কারণ ইউআরআই কেবলমাত্র সংস্থানগুলি উপস্থাপন করে (যেমন ক্রিয়া নয়)। GET / POST / PUT / DELETE / HEAD এর মাধ্যমে ক্রিয়াকলাপগুলি পরিচালনা করা হয়। REST কে একটি ওওপি ইন্টারফেস হিসাবে ভাবেন। এপিআইটিকে সাধারণ প্যাটার্নে ফিট করা এবং যতটা সম্ভব সুনির্দিষ্ট বিবরণ বাস্তবায়ন থেকে এটি ডিকুয়াল করা লক্ষ্য।
ইভান প্লেস

1
@ ইভানপ্লাইস ঠিক আছে, আমি বুঝতে পেরেছি। আমি মনে করি এটি এখানে বিভ্রান্তিকর কারণ
ডিপোজিটকে

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

উত্তর:


13

আপনি বিমূর্ততার একটি স্তর যুক্ত করছেন

আপনার এপিআই শুরু খুব পরিষ্কার এবং সহজ। একটি HTTP পোস্ট প্রদত্ত প্যারামিটারগুলি সহ একটি নতুন আমানত সংস্থান তৈরি করে। তারপরে আপনি "ক্রিয়াগুলি" ধারণাটি চালু করে যা এপিআইয়ের মূল অংশটি না করে বাস্তবায়ন বিশদ।

বিকল্প হিসাবে এই HTTP কথোপকথন বিবেচনা করুন ...

পোস্ট / কার্ড / {কার্ড-আইডি} / অ্যাকাউন্ট / {অ্যাকাউন্ট-আইডি} / আমানত

AmountToDeposit = 100, বিভিন্ন পরামিতি ...

201 তৈরি হয়েছে

অবস্থান = / কার্ড / 123 / অ্যাকাউন্ট / 456 / ডিপোজিট / 789

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

ডিলেট / কার্ড / 123 / অ্যাকাউন্ট / 456 / জমা / 789

204 কোন বিষয়বস্তু নেই

এপিআই গ্রাহকরা জানেন যে তারা আমানত সংস্থান নিয়ে কাজ করছে এবং এটিতে সাধারণত কোন অপারেশন অনুমোদিত তা নির্ধারণ করতে সক্ষম হয় (সাধারণত HTTP- এ অপশনগুলির মাধ্যমে)।

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

ডিলেট এবং ডিপোজিটের বিকল্প কভার করতে সম্পাদনা করুন

মুছে ফেলা অপারেশন এড়ানোর জন্য, তবে এখনও কার্যকরভাবে আমানতটি সরিয়ে ফেলুন আপনার নিম্নলিখিতটি করা উচিত (আমানত এবং প্রত্যাহারের জন্য জেনেরিক লেনদেন ব্যবহার করে):

পোস্ট / কার্ড / {কার্ড-আইডি} / অ্যাকাউন্ট / {অ্যাকাউন্ট-আইডি} / লেনদেন

পরিমাণ = -100 , বিভিন্ন পরামিতি ...

201 তৈরি হয়েছে

অবস্থান = / কার্ড / 123 / অ্যাকাউন্ট / 456 / Transation / 790

একটি নতুন লেনদেনের সংস্থান তৈরি করা হয়েছে যা হ'ল বিপরীত পরিমাণ (-100)। আসল লেনদেনকে অগ্রাহ্য করে অ্যাকাউন্টটিতে ব্যালান্স করে 0 এ এর ​​প্রভাব রয়েছে।

আপনি "ইউটিলিটি" এন্ডপয়েন্টটি তৈরির মতো বিবেচনা করতে পারেন

পোস্ট / কার্ড / {কার্ড-আইডি} / অ্যাকাউন্ট / {অ্যাকাউন্ট-আইডি Trans / লেনদেন / 789 / পূর্বাবস্থায় <- বিএডি!

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


3
+1 "প্রযুক্তিগতভাবে এটি ভারসাম্যপূর্ণ অ্যাকাউন্টিং সিস্টেমে মঞ্জুরি দেওয়া উচিত নয়"। কেউ শিম গুনতে জানে। এই বিবৃতিটি একেবারে সঠিক, বিপরীতে আসার উপায় হ'ল ফান্ডগুলিকে জমা করে অন্য লেনদেন তৈরি করা। লেনদেন সম্পন্ন হওয়ার পরে জেনারেল ল্যাজারগুলি সর্বদা অপরিবর্তনীয় এবং স্থায়ী বিবেচনা করা উচিত।
ইভান প্লেস

সুতরাং, আমি যদি আমার প্রশ্নগুলিতে পরিবর্তন / মুছে ফেলার পরিবর্তে / মুছে ফেলা / ... মুছতে / জমা / রাখার জন্য ... ঠিক আছে কি?
মিথির

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

2
(চালিয়ে যাওয়া) ডাটাবেস লগগুলি একইভাবে লেনদেন ব্যবহার করে। এজন্য কেবলমাত্র লগগুলি ব্যবহার করে একটি ডেটাসেটের প্রতিলিপি এবং / বা পুনর্নির্মাণ করা সম্ভব। যতক্ষণ লেনদেনগুলি কালানুক্রমিকভাবে পুনরায় প্লে করা হয় ততক্ষণ ইতিহাসের যে কোনও বিন্দু থেকে ডেটাসেটটি পুনর্নির্মাণ করা উচিত should সমীকরণ থেকে পরিবর্তনের অপসারণ ধারাবাহিকতা নিশ্চিত করে।
ইভান প্লেইস

1
যথেষ্ট পরিমাণে স্রেফ এটি লেনদেনে নতুন নামকরণ করুন।
গ্যারি রোয়ে

1

REST অস্তিত্বের মূল কারণ হ'ল নেটওয়ার্ক ত্রুটির বিরুদ্ধে স্থিতিস্থাপকতা। যার শেষ পর্যন্ত সমস্ত অপারেশন আদর্শবান হতে হবে ।

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

PUT /card/{card-id}/account/{account-id}/Deposit/{action-id}
AmountToDeposit=100, different parameters...

যদি পূর্বের মতো একই সামগ্রীতে একই ইউআরএল-তে অন্য PUT তৈরি করা হয় তবে সামগ্রীটি একই রকম হলে এবং প্রতিক্রিয়াটি হওয়া উচিত 201 createdযদি বিষয়বস্তু আলাদা হয় তবে error এটি ক্লায়েন্টকে অনুরোধ বা প্রতিক্রিয়া হারিয়েছে কিনা তা জানাতে না পারায় এটি ব্যর্থ হলে কেবল অনুরোধটি পুনরায় প্রেরণ করতে দেয় allows

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

লেনদেনের বিশদটি দেখতে ক্লায়েন্টটি GETএকই ইউআরএল, যেমন

GET /card/{card-id}/account/{account-id}/Deposit/{action-id}

এবং এটিকে পূর্বাবস্থায় ফেলার জন্য এটি এটি মুছে ফেলতে পারে। নমুনা হিসাবে যেমন এর অর্থের সাথে আসলে কিছু করার থাকে তবে আমি জবাবদিহিতার জন্য এর পরিবর্তে যুক্ত "বাতিল" ফ্ল্যাগগুলি দিয়ে পাট করার পরামর্শ দেব (যেটি তৈরি এবং বাতিল লেনদেনের চিহ্ন খুঁজে পাওয়া যায়)।

এখন আপনাকে অনন্য আইডি তৈরির একটি পদ্ধতি চয়ন করতে হবে। আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে:

  1. এক্সচেঞ্জের আগে ক্লায়েন্ট-নির্দিষ্ট উপসর্গ জারি করুন যা অবশ্যই অন্তর্ভুক্ত থাকতে হবে।
  2. সার্ভার থেকে ফাঁকা অনন্য আইডি পেতে একটি বিশেষ পোষ্ট অনুরোধ যুক্ত করুন। এই অনুরোধটি আদর্শবান হতে হবে না (এবং সত্যিই পারে না), কারণ অব্যবহৃত আইডি সত্যই কোনও সমস্যা সৃষ্টি করে না।
  3. কেবল ইউআইডি ব্যবহার করুন। প্রত্যেকে এগুলি ব্যবহার করে এবং ম্যাক-ভিত্তিকগুলি বা এলোমেলো বিষয়গুলির সাথে কারওই কোনও সমস্যা নেই বলে মনে হয়।

2
আমি যা জানি, থেকে পোষ্ট আদর্শবান নয়। en.wikipedia.org/wiki/POST_(HTTP)#Affecting_server_state
Mithir

@ মিথির: পোষ্টকে আদর্শবান বলে ধরে নেওয়া হয় না; এটি এখনও হতে পারে। তবে এটি সত্য যেহেতু সমস্ত আরইএসটি অপারেশনগুলি আদর্শবান হওয়ার কথা, তাই পোষ্টের মূলত আরইএসইএসটিতে কোনও স্থান নেই।
জান হুডেক

1
আমি বিভ্রান্ত ... আমি যে বিষয়বস্তু পড়েছি এবং বিদ্যমান প্রয়োগের সাথে আমি পরিচিত (সার্ভিসস্ট্যাক, এএসপি.নেট ওয়েব এপিআই), সমস্তই পরামর্শ দেয় যে পোস্টেরই আরএসটিতে একটি জায়গা রয়েছে।
মিথির

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

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