এইচটিটিপি স্থিতি কোডগুলি কোনও সার্ভারে ব্যবসায়িক লজিক ত্রুটির উপস্থাপনের জন্য ব্যবহার করা উচিত?


20

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

আমার সমাধানটি ছিল আমাদের এজেএক্স কলগুলির ব্যর্থতা হ্যান্ডলারগুলি মোড়ানো যা 409 এর কারণে কোনও কিছুতে ব্যর্থ হলে ক্লায়েন্টের উপর একটি বিজ্ঞপ্তি প্রদর্শন করবে - এটি সব ঠিক আছে এবং একই পদ্ধতি ব্যবহার করে অন্যান্য 4XX এবং 5XX ত্রুটির পাশাপাশি ভালভাবে কাজ করে।

একটি সমস্যা দেখা দিয়েছে যেখানে আমাদের রুট হ্যান্ডলারের একজন যখন ব্যবসায়ের যুক্তিযুক্ত ত্রুটির মুখোমুখি হয়ে 409 এর সাথে প্রতিক্রিয়া জানায় - আমার এজেএক্স র‍্যাপার জানিয়েছে যে সুরক্ষার লক চালু রয়েছে, যখন ক্লায়েন্টের বিদ্যমান ব্যর্থতা হ্যান্ডলার রিপোর্ট করে যে কী সমস্যা (এটি মনে করে) শরীরের উপর ভিত্তি করে সমস্যাটি রয়েছে প্রতিক্রিয়া। একটি সহজ সমাধান হ্যান্ডলারের প্রতিক্রিয়া বা সুরক্ষা লক উপস্থাপনের জন্য আমরা যে স্ট্যাটাস কোডটি ব্যবহার করি তা হ'ল পরিবর্তন করা।

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

কারও কি এখানে কোন দৃ strong় মতামত আছে? কেউ কি আমাকে বোঝাতে সক্ষম হচ্ছেন ব্যর্থতা উপস্থাপনের এটি ভুল উপায়?


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

@ আইভো কাউম্যানস: দয়া করে এটিকে একটি উত্তর করুন যাতে আমি এটির উন্নতি করতে পারি। 400 Bad Requestকম্বল হিসাবে HTTP কোডটি ক্লাস হিসাবে ব্যবসায়িক লজিক ত্রুটিগুলি কভার করা ভাল বলে মনে হয়।
9000

ব্যক্তিগত পছন্দ, তবে 400 Bad Requestডেটা অনুপস্থিত বা পড়তে / পার্স করা যায় না এমন সময় আমি ব্যবহারের প্রবণতা রাখি । অর্থাৎ অনুরোধের ডেটা নিজেই কোনওভাবে খারাপ।
কাসি স্পিকম্যান

"ব্যবসায়িক যুক্তি ত্রুটি" বলতে কী বোঝাতে চান দয়া করে তা প্রসারিত করুন। এটা অত্যন্ত অস্পষ্ট। আপনি কি বোঝাতে চাইছেন যে (সঠিক) ডেটা বৈধতা যাচাইয়ের জন্য অবৈধ চুক্তি, ইনপুট যা সময়ে সময়ে অন্য কোনও সময়ে বৈধ হতে পারে তবে তা বর্তমান অবস্থায় অবৈধ, বা ব্যবসায় যুক্তিটিতে কোনও বাগ যেখানে এটি বৈধ ইনপুট প্রত্যাখ্যান করে?
jpmc26

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

উত্তর:


19

ক্যাসি মূল বিষয়টিকে কভার করে।

কোনও ওয়েব এপিআই-এর মূল ধারণা: আপনি কোনও ডকুমেন্ট স্টোরের মতো দেখতে আপনার ডোমেনটিকে মানিয়ে নিচ্ছেন। GET / PUT / POST / DELETE ইত্যাদি ডকুমেন্ট স্টোরের সাথে ইন্টারঅ্যাক্ট করার সমস্ত উপায়।

সুতরাং কী কোডগুলি ব্যবহার করবেন সে সম্পর্কে চিন্তাভাবনার একটি উপায় হ'ল ডকুমেন্ট স্টোরগুলিতে অ্যানালগেসিয়াল অপারেশনটি কী এবং এই ব্যর্থতাটি কী অ্যানালগটিতে দেখতে হবে তা বোঝা।

2XX সম্পূর্ণরূপে অনুপযুক্ত

স্থিতি কোডের 2XX (সফল) শ্রেণি নির্দেশ করে যে ক্লায়েন্টের অনুরোধটি সফলভাবে প্রাপ্ত, বোঝা এবং গৃহীত হয়েছিল।

5XX এছাড়াও অনুপযুক্ত

স্থিতি কোডের 5XX (সার্ভার ত্রুটি) শ্রেণি নির্দেশ করে যে সার্ভার সচেতন যে এটি ভুল হয়েছে

এই ক্ষেত্রে, সার্ভারটি ভুল করেনি; এটি সচেতন যে আপনার এই মুহুর্তে সেই উত্সটি সংশোধন করার কথা নয়।

ব্যবসায়ের যুক্তি ত্রুটিগুলি (অর্থাত্ ব্যবসায়িক আগমনকারী প্রস্তাবিত সম্পাদনাটি এই মুহুর্তে অনুমতি দেয় না) সম্ভবত একটি 409

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

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

আমার সমাধানটি ছিল আমাদের এজেএক্স কলগুলির ব্যর্থতা হ্যান্ডলারগুলি মোড়ানো যা 409 এর কারণে কোনও কিছুতে ব্যর্থ হলে ক্লায়েন্টের উপর একটি বিজ্ঞপ্তি প্রদর্শন করবে - এটি সব ঠিক আছে এবং একই পদ্ধতি ব্যবহার করে অন্যান্য 4XX এবং 5XX ত্রুটির পাশাপাশি ভালভাবে কাজ করে।

এবং আমি এটিকে সমস্যা হিসাবে চিহ্নিত করব; ক্লায়েন্টে আপনার বাস্তবায়ন ধরে নিয়েছে যে স্থিতি কোডটি সমস্যার সংজ্ঞা দেওয়ার জন্য যথেষ্ট। পরিবর্তে, আপনার ক্লায়েন্ট কোডটি পেডলোডটি পর্যালোচনা করা উচিত এবং সেখানে উপলব্ধ তথ্যের উপর নির্ভরশীল acting

এটি হ'ল, ডকুমেন্ট স্টোর কীভাবে এটি করবে

409  Conflict

your proposed change has been declined because ${REASON}.  
The following resolution protocols are available: ${LINKS[@]})

একটি সঙ্গে একই পদ্ধতি 400 Bad Requestগ্রহণযোগ্য হবে; যা মোটামুটি "অনুবাদ করে" আপনার অনুরোধে একটি সমস্যা ছিল। কোন স্ট্যাটাস কোডটি সবচেয়ে উপযুক্ত এটি নির্ধারণ করার জন্য আমাদের মাথা ঘামানো যায় না, তাই আপনি এখানে যান। বিশদ জন্য পেললোড দেখুন। "

আমি 422 ব্যবহার করব। ইনপুটটি বৈধ তাই 400 ব্যবহার করার জন্য সঠিক ত্রুটি কোড নয়

ওয়েবডিএভি স্পেসিফিকেশনটিতে এই সুপারিশটি অন্তর্ভুক্ত রয়েছে

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

আমি বিশ্বাস করি না যে এটি বেশ একটি ম্যাচ (যদিও আমি সম্মত হই যে এটি 400বিকল্প হিসাবে কিছুটা সন্দেহ এড়ায় )। আমার ব্যাখ্যার 422অর্থ হ'ল "আপনি ভুল সত্তা প্রেরণ করেছেন" যেখানে 409"আপনি ভুল সময় সত্তা প্রেরণ করেছেন" is

অন্য উপায় রাখুন, 422বিচ্ছিন্নতা হিসাবে বিবেচিত অনুরোধ বার্তার একটি সমস্যা নির্দেশ করে, যেখানে 409নির্দেশিত বার্তাটি সংস্থানটির বর্তমান অবস্থার সাথে সাংঘর্ষিক হয়।

বেন নাদালের 422 এর আলোচনাটি বিবেচনা করা কার্যকর হতে পারে।


5
" আপনি নিজের ডোমেনটিকে একটি দস্তাবেজের স্টোরের মতো দেখতে মানিয়ে নিচ্ছেন" - আমি লোকেরা এটি পড়তে দেখতে চাইবে এবং তারা বিশ্রামের সিদ্ধান্ত নেওয়ার আগে (বা বিপক্ষে) সমস্ত ফলাফল এবং ফলাফলগুলি পুরোপুরি বুঝতে পারত । সত্যিই।
জেনসজি

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

আমি ৪২২ ব্যবহার করব। ইনপুটটি বৈধ তাই 400 ব্যবহার করার জন্য সঠিক ত্রুটি কোড নয়
কনরাড

19

আমার অভিজ্ঞতায়, HTTP ত্রুটি কোডগুলি ব্যবসায়িক ত্রুটি উপস্থাপনের জন্য পর্যাপ্ত নয়। যাইহোক, তারা ত্রুটির শ্রেণীর প্রতিনিধিত্ব করতে দরকারী।

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

উদাহরণ

// error with text response
409 Conflict "safety_lock_engaged"
409 Conflict "customer_not_eligible_for_selected_discount"
// warning with JSON response
202 Accepted { "backorderedProductIds": [ 37, 476 ] }

৪০০ এর উপরে 4XX স্থিতির কোডগুলির খুব নির্দিষ্ট অর্থ রয়েছে। আপনার কেস অন্যদের দ্বারা বিশেষভাবে আবৃত না হলে 400 বেছে নিন।
jpmc26

@ jpmc26 যদি আমি এইভাবে স্থিতি কোডগুলি ব্যবহার না করি তবে সেগুলি কখনই ব্যবহৃত হয় না। তবে আপনার উত্তরগুলিতে এগুলি সঠিক এবং সঠিক উপায়ে ব্যবহার করতে নির্দ্বিধায়।
ক্যাসি স্পিকম্যান

কিছুটা অর্থে, আপনি ঠিক বলেছেন। তারা কখনও ব্যবহার করা হয় না। নির্দিষ্ট কোডগুলির জন্য নির্বাচিত অর্থগুলি বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য খুব সাধারণ ব্যবহারের ক্ষেত্রে মনে হয় না। ঠিক আছে. অনেকগুলি ব্যতিক্রম রয়েছে যা আমরা ধরার জন্য কোডটি কখনও লিখি না।
jpmc26

@ jpmc26 ওয়েল ব্যতিক্রমগুলি অনুসরণ করা সর্বাধিক মডেল নয় । তবে নিশ্চিত, এগিয়ে যান।
ক্যাসি স্পিকম্যান

নির্দিষ্ট ব্যতিক্রম প্রকারের জন্য ছোঁড়া বা না ধরা হ'ল নির্দিষ্ট HTTP কোড বা অন্য কোনও ত্রুটি কোডগুলি কখনও ব্যবহার না করার জন্য অ্যানালগ। আমি ধরে নিলাম এটি সুস্পষ্ট হবে। ব্যতিক্রম মডেলটি "সেরা" কিনা তা পুরোপুরি অপ্রাসঙ্গিক।
jpmc26

5

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

সাম্প্রতিক, অনুরূপ, গবেষণায় আমি যা পেয়েছি তা হ'ল 400 Bad Requestবৈধতা ত্রুটি এবং এরকম ক্ষেত্রে সাধারণত এটি ব্যবহার করতে গৃহীত হয় । এইভাবে, আপনি সমস্ত ব্যবসায়ের যুক্তি ত্রুটির জন্য একটি স্থিতি কোড ব্যবহার করেন।

ঘটনাক্রমে, 409যখন আপনি সম্পাদনা করার সময় কোনও উত্স পরিবর্তিত হয়ে আবার এটি সংরক্ষণ করার চেষ্টা করা হয়েছে তখন ব্যবহার করা উচিত।


4

আপনি "খারাপ অনুরোধ" ব্যবহার করতে পারেন এবং লঙ্ঘিত ব্যবসায়িক বিধি আইডির সাথে সাথে প্রতিক্রিয়ার শরীরে আরও কিছু বিশদ অন্তর্ভুক্ত করতে পারেন।


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