এক অনুরোধে একাধিক আইটেম তৈরির বিশ্রামের উপায়


122

আমি অর্ডার সংগ্রহের জন্য একটি ছোট ক্লায়েন্ট সার্ভার প্রোগ্রামে কাজ করছি। আমি এটি "রেস্ট (পুরো) উপায়ে করতে চাই।

আমি যা করতে চাই তা হ'ল:

সমস্ত অর্ডারলাইন (পণ্য এবং পরিমাণ) সংগ্রহ করুন এবং সম্পূর্ণ অর্ডারটি সার্ভারে প্রেরণ করুন

এই মুহূর্তে আমি এটি করার জন্য দুটি বিকল্প দেখছি:

  1. প্রতিটি অর্ডারলাইন সার্ভারে প্রেরণ করুন: পোস্ট পোস্ট এবং পণ্য_আইডি

আমি আসলে এটি করতে চাই না কারণ আমি সার্ভারে অনুরোধের সংখ্যা সীমাবদ্ধ করতে চাই তাই বিকল্প 2:

  1. সমস্ত অর্ডারলাইন সংগ্রহ করুন এবং তাদের একবারে সার্ভারে প্রেরণ করুন।

বিকল্প 2 আমি কীভাবে প্রয়োগ করব? আমার কাছে বেশ কয়েকটি ধারণাগুলি হ'ল: কোনও জেএসওএন অবজেক্টে সমস্ত অর্ডারলাইনগুলি মোড়ানো এবং এটি সার্ভারে প্রেরণ করুন বা অর্ডারলাইনগুলি পোস্ট করতে একটি অ্যারে ব্যবহার করুন।

বিকল্প 2 বাস্তবায়ন করা কি একটি ভাল ধারণা বা ভাল অনুশীলন, এবং যদি তা হয় তবে কীভাবে আমি এটি করব।

ভাল অনুশীলন কি?

rest  post 

উত্তর:


74

আমি বিশ্বাস করি যে এটির কাছে যাওয়ার আরও একটি সঠিক উপায় হ'ল অন্য সংস্থান তৈরি করা যা আপনার সংস্থার সংগ্রহকে উপস্থাপন করে। উদাহরণস্বরূপ, কল্পনা করুন যে আমাদের মতো একটি এন্ডপয়েন্ট রয়েছে /api/sheep/{id}এবং আমরা /api/sheepভেড়ার সংস্থান তৈরি করতে পোস্ট করতে পারি ।

এখন, আমরা যদি বাল্ক তৈরিতে সমর্থন করতে চাই, তবে আমাদের নতুন ফ্লকের সংস্থান বিবেচনা করা উচিত /api/flock(বা /api/<your-resource>-collectionযদি আপনার আরও ভাল অর্থবোধক নাম না থাকে)। মনে রাখবেন যে সংস্থানগুলি আপনার ডাটাবেস বা অ্যাপ্লিকেশন মডেলগুলিতে মানচিত্রের প্রয়োজন নেই । এটি একটি সাধারণ ভুল ধারণা হয়।

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

আমি মনে করি এটি নিরাপদ যে কোনও রিসোর্স পরিচালনার অর্থ পার্শ্ব প্রতিক্রিয়া হিসাবে আরও কয়েকটি সত্ত্বা তৈরির অর্থ হতে পারে।


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

এটি সঠিক পন্থা। এটি POST সংগ্রহের অনুরোধটি ভঙ্গ করে না। যেহেতু, এটি একটি একক সত্ত্বা পোস্ট করতে ব্যবহৃত হয়। "পৃথক বাল্ক সত্তা" দিয়ে একটি বাল্ক অনুরোধ প্রেরণ সঠিক পদ্ধতি।
নির্বাচক

2
আমি আপনার মত এপি এন্ডপয়েন্টটি ভেড়া এবং পালের সাথে এত নামকরণ করছি! কিছুটা বিমূর্ততার সাথে এটি বাইবেলের একটি উল্লেখ রয়েছে: "আমার কাছে আরও মেষ রয়েছে, যা এই ভাঁড়ার নয়; তাদের অবশ্যই আমার কাছে আনতে হবে এবং তারা আমার আওয়াজ শুনতে পাবে; এবং তারা এক রাখালের সাথে এক পাল হয়ে যাবে" " জন 10:16।
ইভজেনি

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

@ code4kix আপনি ব্যবহার করতে পারে /api/book-group, /api/book-collectionবা অনুরূপ কিছু।
মাইগুয়েলকোবাইন

46

যদিও বাল্ক অপারেশনগুলি (যেমন ব্যাচ তৈরি) অনেক সিস্টেমে প্রয়োজনীয়, তবে তারা আনুষ্ঠানিকভাবে রেস্টস্টুল আর্কিটেকচার স্টাইলে সম্বোধন করে না।

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


3
ব্যাচিংয়ের ক্ষেত্রে ত্রুটিগুলির জন্য আপনি কী সমাধান খুঁজে পেয়েছেন? কোনও মোবাইল সংযোগে 100 টি পোষ্ট অনুরোধ প্রেরণে কোনও খারাপ ধারণার মতো পৃষ্ঠা সিম দেখানোর জন্য।
টমাস আহলে

আমি ত্রুটিগুলি একটি অ্যারেতে যুক্ত করি, ব্যবহারকারীকে একটি 419 সংঘাতের ত্রুটি পৃষ্ঠায় নিয়ে যাই (এবং সেই ত্রুটিটি ক্লায়েন্টকে ফিরিয়ে দেব) এবং ত্রুটির অ্যারে প্রদর্শন করি। আরও তথ্যের জন্য নীচে আমার উত্তর দেখুন।
এরিক ফুলার

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

2
@ থেকোশম্যান ৩.২৫ বছরে অনেক পরিবর্তন হয়েছে। আপনার প্রশ্নের উত্তর সম্ভবত পোস্ট করা উচিত।
dlamblin

3
@ ড্লেলব্লিন হ্যাঁ, আমার সম্ভবত অনেক কিছু করা উচিত ... আমি কিছু পর্যায়ে এটি পৌঁছে দিতে পারি ...
থোকোশম্যান

9

এটি কীভাবে করবেন তা ফেসবুক ব্যাখ্যা করে: https://developers.facebook.com/docs/ راف-api/making-m Multipleple- requests

সাধারণ ব্যাচেড অনুরোধগুলি

ব্যাচ API এ JSON অ্যারে হিসাবে উপস্থাপিত লজিক্যাল এইচটিটিপি অনুরোধগুলির একটি অ্যারে গ্রহণ করে - প্রতিটি অনুরোধের একটি পদ্ধতি থাকে (HTTP পদ্ধতি GET / PUT / পোষ্ট / ডিএলটিই ইত্যাদি সম্পর্কিত), একটি আপেক্ষিক_ url (গ্রাফ.ফেসবুকের পরে URL এর অংশ)। com), alচ্ছিক শিরোনাম অ্যারে (HTTP শিরোনামগুলির সাথে সম্পর্কিত) এবং একটি alচ্ছিক সংস্থা (POST এবং PUT অনুরোধের জন্য)। ব্যাচ API এ JSON অ্যারে হিসাবে উপস্থাপিত লজিক্যাল এইচটিটিপি প্রতিক্রিয়াগুলির একটি অ্যারে প্রদান করে - প্রতিটি প্রতিক্রিয়ায় একটি স্থিতি কোড, একটি alচ্ছিক শিরোনাম অ্যারে এবং একটি alচ্ছিক বডি থাকে (যা জেএসএন এনকোডেড স্ট্রিং)।


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

7
এটি সত্যই ফেসবুকের এটি করার পদ্ধতি, ওপি যেমনটি বলেছে
ততটুকু বিশ্রামের দরকার নেই

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

8

আপনার ধারণা আমার কাছে বৈধ বলে মনে হচ্ছে। বাস্তবায়ন আপনার পছন্দ বিষয়। আপনি ("অর্ডার_লাইনস []" অ্যারে) এর জন্য জেএসএন বা কেবলমাত্র পরামিতি ব্যবহার করতে পারেন এবং করতে পারেন

POST /orders

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


6

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


5

আমি আসলে ইদানীং এর সাথে কুস্তি করে চলেছি, এবং আমি যা করছি তার জন্য এখানে।

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

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


-2

আপনি 100 টি অর্ডলাইনের জন্য HTTP শিরোনাম প্রেরণ করতে চাইবেন না। আপনি প্রয়োজনের চেয়ে আর কোনও অনুরোধ উত্পন্ন করতে চান না।

সার্ভারের কাছে একটি JSON অবজেক্টে পুরো অর্ডারটি প্রেরণ করুন: সার্ভার / অর্ডার বা সার্ভার / আদেশ / নতুন। কিছু নির্দেশ করুন যা সার্ভার / অর্ডার / অর্ডার_আইডি করুন:

এছাড়াও পোষ্টের পরিবর্তে ক্রেট পুট ব্যবহার বিবেচনা করুন


আমি মনে করি তিনি এইচটিটিপি পোষ্ট পদ্ধতিতে মনোযোগ দিচ্ছেন। ক্রিয়েট এইচটিটিপি পদ্ধতি হিসাবে এমন কোনও জিনিস নেই।
মিলান নভোটা

নেই তো? ওহ অপেক্ষা, সেখানে ছিল না। পরিবর্তে পুট ছিল।
উত্সাহিত করুন

22
কেন আপনি পৃথিবীতে সামগ্রী তৈরি করার জন্য পুট ব্যবহার করবেন? এইচটিটিপি পোস্ট পদ্ধতিটি হ'ল এটি।
থোকোশম্যান

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

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