REST ইউআরআইতে ক্রিয়াগুলি (ক্রিয়াগুলি) উপস্থাপন করুন


16

আমার গ্রাহকের নথিগুলি সম্পাদন করার জন্য আমার একটি মুদ্রণ অপারেশন রয়েছে। আমার অন্যান্য স্ট্যান্ডার্ড ক্রিয়াকলাপগুলিও যেমন সম্পাদন করা, আপডেট করা, মোছার মতো করা দরকার। সুতরাং, আমি নিম্নলিখিত:

  • নতুন গ্রাহক তৈরির জন্য:
    ইউআরআই = / গ্রাহক / {আইডি}, টাইপ করুন = পোষ্ট, পদ্ধতি নাম = ক্রিয়েটমাস্টার ()
  • আপডেট করার জন্য:
    ইউআরআই: / গ্রাহক / {আইডি}, টাইপ করুন = পুট, পদ্ধতি = আপডেটকাস্টমারের ()
  • গ্রাহক
    মোছার জন্য: ইউআরআই = / গ্রাহক / {আইডি}, টাইপ করুন = মুছে ফেলুন, পদ্ধতিটির নাম = মুছে ফেলুন কাস্টমারের ()
  • দেখার জন্য:
    ইউআরআই: / গ্রাহক / {আইডি}, টাইপ = জিইটি, পদ্ধতি = গেটকাস্টার ()

এখন, যদি সেই গ্রাহকের জন্য আমার কোনও নথি মুদ্রণের প্রয়োজন হয় তবে আমার একটি মুদ্রণ ফাংশন প্রয়োজন। আমার ইউআরআই দেখতে দেখতে এটি দেখতে পারে: / গ্রাহক / {আইডি}, টাইপ = পোষ্ট, পদ্ধতি = মুদ্রণ কাস্টমারের ()। তবে আমি সেই ইউআরআই এবং পোষ্ট প্রকারটি ক্রিয়েটকাস্টমারের জন্য ব্যবহার করেছি। আমি ইউআরআই দেখতে চাই: / গ্রাহক / মুদ্রণ / {আইডি}, টাইপ করুন = পোস্ট, পদ্ধতি = মুদ্রণ কাস্টমারের ())

তবে আমার ইউআরআইতে আমার "মুদ্রণ" ক্রিয়াটি থাকতে পারে না। এটি করার সর্বোত্তম উপায় কী? আমি ইউআরআই হিসাবে / গ্রাহক / নথি / {আইডি about সম্পর্কে ভেবেছিলাম ... তবে আমি একই সমস্যাটিতে চলে আসব run আমি "ডকুমেন্ট" এ সিআরইউডি অপারেশন করব। সুতরাং, আমি আবার "প্রিন্ট" এর জন্য যা ব্যবহার করব তা শেষ করেছি। দয়া করে উপদেশ দাও.


2
মুদ্রণটি সাধারণত ক্লায়েন্ট-সাইড অপারেশন হয়, তাই আমি কৌতূহলী - আপনার সেটআপটি কীভাবে এমন যে এটি আপনাকে একটি আরএসটি সার্ভারে একটি আদেশ পাঠানোর প্রয়োজন?
শৌনা

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

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

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

উত্তর হিসাবে পোস্ট করার মতো পর্যাপ্ত পরিমাণে আমার কাছে নেই, তবে আমার কাছে এটি আকর্ষণীয় মনে হয়েছে যে tyk.io/rest-never-crud যুক্তিযুক্ত যে POST /customers/123/printএটি করার জন্য একটি বৈধ জিনিস।
জেএলএইচ

উত্তর:


9

POST"তৈরি" বলতে বোঝায় না, এর অর্থ "প্রক্রিয়া"। আপনি কোনও বিদ্যমান উত্সে উপযুক্ত অনুরোধ পোস্ট করে একটি নতুন সংস্থান তৈরি করতে পারেন (অর্থাত্ /customersনতুন গ্রাহক তৈরির জন্য পোস্ট )। তবে আপনি POSTঅন্যান্য সমস্ত ক্রিয়া পূরণ করার জন্যও ব্যবহার করতে পারেন যা একটি ঝরঝরে CRUD দৃষ্টান্তের সাথে সামঞ্জস্য নয়।

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

জেএসওএন নথি হিসাবে এটি দেখতে দেখতে এটি দেখতে পারে:

{
   contents: ["http://site/customers/12345"],
   paper-size: "A4",
   duplex: "true"
}

স্পষ্টতই, আপনি যা করতে চান তার সাথে প্রাসঙ্গিক হতে আপনার এটিকে কাস্টমাইজ করতে হবে। মূল কথাটি হ'ল আপনি মুদ্রণের জন্য অন্য সংস্থানগুলি তাদের URL নির্দিষ্ট করে সনাক্ত করতে পারেন।

অনুরোধের প্রতিক্রিয়া হিসাবে, আপনি কেবল একটি 200 OKবা একটি ফিরিয়ে দিতে পারেন 204 No-Contentএবং এটিকে আগুন-ভুলে যাওয়া প্রক্রিয়া হিসাবে বিবেচনা করতে পারেন। তবে আপনি যদি এটি বাড়িয়ে তুলতে চান তবে আপনি ফিরে 201 Createdএসে নতুন তৈরি মুদ্রণ কাজের URL টি নির্দিষ্ট করতে পারবেন, যেমন /prints/12345

তারপরে কোনও ব্যবহারকারী GETতাদের মুদ্রণ কাজের স্থিতি (মুলতুবি, অগ্রগতি ইত্যাদি) দেখতে রিসোর্সে একটি সম্পাদন করতে পারে বা একটি জারি করে কাজটি বাতিল করার জন্য অনুরোধ করতে পারে DELETE

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


2
POST এর অর্থ সাধারণত তৈরি / সন্নিবেশ করা হয়, তবে পুটের অর্থ সাধারণত সংরক্ষণ সংরক্ষণ / আপডেট আপডেট হয়। এটি এটি এইচটিএমএলে সাধারণত ব্যবহৃত হয় না তা এমনকি এটি REST এ কীভাবে সংজ্ঞায়িত হয়।
ইভান প্লেস

2
@EvanPlaice HTTP- র বৈশিষ্ট নাম স্থাপন করেছিল তৈরি / আপডেট ক্রিয়া এবং পোষ্ট "প্রক্রিয়াকরণের তথ্য" হয় ক্রিয়া, সেইসাথে "পরিশেষে যোগ" ক্রিয়া (এটি একটি পরিচিত তৈরি + আপডেট উদ্ধার পরিবর্তে + + আপডেট মডেল তৈরি ব্যবহার করে) । রায় ফিল্ডিং তার ব্লগে পোস্টকে ক্রিয়া হিসাবে বর্ণনা করেছেন যখন আপনি অপারেশনটি মানক করতে চান না। আপনি যখন এটি আইটেমের সংকলনে একটি নতুন আইটেম যুক্ত করার বিষয়টি বিবেচনা করেন তখন পোস্ট "ক্রিয়েট" শব্দার্থক পদার্থ গ্রহণ করে। এই ক্ষেত্রে, ট্র্যাজেডিয়ান প্রিন্ট জব প্রসেসিং বা যুক্ত করার জন্য POST ব্যবহার করে মাথায় পেরেকটি আঘাত করেছিলেন।
রব

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

4

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

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


3

কেবলমাত্র বর্তমান ইউআরআই এর জিইটি-তে একটি প্যারামিটার যুক্ত করুন

একাধিক কর্মের জন্য একটি ইউআরআই ব্যবহার করা বেশ সাধারণ।

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

/ গ্রাহক / {আইডি}? মুদ্রণ = সত্য

তারপরে আপনি যেখানে আপনার জিইটি পদ্ধতিটি সংজ্ঞায়িত করেন আপনি মুদ্রণ প্যারামিটারের উপস্থিতি সনাক্ত করে এটি আলাদাভাবে পরিচালনা করেন।

REST নিম্নলিখিত পদ্ধতিতে সংজ্ঞায়িত করা হয়েছে:

  • পোস্ট - একটি রেকর্ড, সম্পদ বা সংস্থান তৈরি করুন
  • পুট - আপডেট, একটি রেকর্ড, সম্পদ, বা সংস্থান
  • মোছা - একটি, রেকর্ড, সম্পদ বা সংস্থান সরান

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

যদিও সম্প্রতি এপিআই এর ভারী ব্যবহার শুরু করেছে তবুও আরআরইএসটি স্পেসিফিকেশনটি বেশ এগিয়ে রয়েছে thinking

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


হালনাগাদ:

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

উদাহরণস্বরূপ, আপনি ইউআরআই হিসাবে প্রতিনিধিত্ব করতে পারেন:

/customer/{id}+print

আপনি যেখানে পাঠ্য / এইচটিএমএল + প্রিন্টে সামগ্রী-প্রকারের প্রতিক্রিয়া সেট করতে পারেন। ভবিষ্যতে আরও রূপান্তর সংজ্ঞা দেওয়ার বিকল্পটিও আপনার কাছে রয়েছে।

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

// for application/json
/customer/{id}+json

// for application/atom+xml
/customer/{id}+atom

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

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


যুক্ত করতে - ক্যোয়ারী স্ট্রিং ( ?print=true) ব্যবহার করার বিকল্প হিসাবে আপনি ইউআরআই প্যারামিটারগুলি (যেমন - /customer/{id}/printable) ব্যবহার করতে পারেন । আপনি কোনটি ব্যবহার করবেন তা হ্যান্ডল করার জন্য আপনার সিস্টেমের (সিএমএস, ফ্রেমওয়ার্ক, সাধারণভাবে কোড) সেট আপ করা মূলত নির্ভর করবে। উভয়ই বৈধ এবং গ্রহণযোগ্য হিসাবে বিবেচিত হয়
শওনা 14

@ শৌনা টেকনিক্যালি, ইউআরআই / গ্রাহক / {আইডি print + প্রিন্টের সাথে মুদ্রণের জন্য নির্দিষ্ট মাইম-টাইপ নিয়োগ এবং মাইম টাইপ / পাঠের এইচটিএমএল + প্রিন্টের জন্য সর্বোত্তম পন্থা নিয়োগ করা হবে। এই জাতীয় পদ্ধতির সুবিধা হওয়ায় আপনি একই ইউআরআইয়ের জন্য অনেকগুলি মাইম টাইম (প্রাক্তন পাঠ্য / এইচটিএমএল, পাঠ্য / এক্স-মার্কডাউন, অ্যাপ্লিকেশন / জেসন, ইত্যাদি) এর জন্য রূপান্তর তৈরি করতে পারেন। আপনি যে সমাধানটি উপস্থাপন করছেন তার অসুবিধা হ'ল, আপনাকে প্রতিটি ভিন্ন মাইম টাইপের জন্য অতিরিক্ত ইউআরআই তৈরি করতে হবে (এবং অন্য কোনও রুট সংজ্ঞায়িত করতে হবে)। এটি কিনে বিশ্রাম ব্যবহারের উদ্দেশ্যকে পরাস্ত করে।
ইভান প্লেস

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

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

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