RESTful API কোনও জিনিসের অনুপস্থিতি উপস্থাপন করে


18

কোনও ব্যক্তি তাদের আত্মিক প্রাণী নির্বাচন করেছেন কিনা তা সনাক্ত করার জন্য একটি এপিআই কল্পনা করুন। তাদের কেবল শূন্য বা একটি আত্মিক প্রাণী থাকতে পারে।

বর্তমানে:

/person/{id}/selectedSpiritAnimal

যখন তারা একটি প্রাণী নির্বাচন করেছেন তখন 200 এএসপি এবং 200 ফেরত দেয় {selectedAnimal:mole}

কিন্তু যখন তাদের কোনও নির্বাচন নেই তখন এটি 404 এ ফিরে আসে।

এটি আমার আত্মা প্রাণীটিকে অসন্তুষ্ট করে তোলে কারণ আমরা কোনও বৈধ ডোমেন উদ্বেগের প্রতিনিধিত্ব করছি - এখনও কোনও আত্মিক প্রাণী বেছে নেই - এইচটিটিপি ত্রুটি হিসাবে।

প্লাস, একটি ব্যবসা হিসাবে - স্প্রিট-এনিমেল-হ্যাম্পার্স-আর-আমাদের - আমরা জানতে চাই যখন কারও কোন নির্বাচন নেই যাতে আমরা তাদেরকে অনুরোধ জানাতে পারি।

এখানে আরও ভাল প্রতিক্রিয়া কি:

এইচটিটিপি 200 এবং {selectedAnimal:null}

বা আরও স্পষ্টত

এইচটিটিপি 200 এবং {selectedAnimal:null, spiritAnimalSelected: false}

নাকি 404 ফেরত দেওয়া ভাল? যেহেতু this image has not yet been uploadedঅনলাইনে ছবি দেখার সময় অনেকটা পছন্দ হয় 404 this person has not selected a spirit animalmight একটি 404 হতে পারে


এই প্রশ্নটিকে সদৃশ হিসাবে প্রস্তাব করা হয়েছে তবে এই প্রশ্নটি URL টি প্রতিনিধিত্ব করে এমন পরিবর্তনের অনুমতি না দেওয়ার জন্য যখন অ্যাপ্লিকেশনটি কনফিগার করা হয়েছে তখন অন্য কোনও বৈধ URL অনুরোধ করা হচ্ছে।

যদিও আমি এখানে দেখছি যে কীভাবে একজন এমন সংস্থান উপস্থাপন করে যেখানে সংস্থানটির অনুপস্থিতি অর্থবহ হয়। অর্থাৎ ক্লায়েন্টের জন্য ইউআরএল অনুরোধ করা বৈধ এবং প্রতিক্রিয়া হ'ল আপনি সাফল্যের সাথে অনুরোধ করেছেন যা কোনও জিনিসের অনুপস্থিতি প্রতিনিধিত্ব করে।

সুতরাং এটি 'ব্যবসায়িক যুক্তি' নয় বরং এমন একটি পরিস্থিতিতে যেখানে কোনও জিনিসের অনুপস্থিতির অর্থ রয়েছে (এটি আমার অনেক সহকর্মীই যুক্তি দিচ্ছেন যে ৪০৪ এখনও সঠিক আছে) তবে কীভাবে মানচিত্র করবেন তা আমি নিশ্চিত নই বৈশিষ্ট।


উত্তর বাছাই করা খুব কঠিন। আমি এখানে কথোপকথন এবং কাজ চলমান একাধিকবার আমার মন পরিবর্তন করেছি।

এখানে যে বিষয়টি আমার জন্য এটি নিষ্পত্তি করে তা হল যে অনুমানটি বলে যে ক্লায়েন্টটি ভুল হয়ে গেলে 4XX হয় । এই দৃষ্টিতে ক্লায়েন্টকে নির্বাচিতস্পিরিটমিনাল url এর কাছ থেকে প্রতিক্রিয়া আশা করতে বলা হয়েছে সুতরাং ভুল হয়নি।

আমার সহকর্মীদের মধ্যে sensকমত্যটি এটি একটি খারাপ এপিআই ডিজাইনের লক্ষণ

সম্ভবত আমরা / person / {id request কে অনুরোধ করব এবং সেই ব্যক্তির জন্য সংযুক্ত সম্পর্কের একটি সেট ফেরত দেওয়া সম্ভবত আরও ভাল হবে ... তারপরে আপনাকে / নির্বাচিতস্পিরিট আনমিনাল লিঙ্কটি (যদি কোনও ব্যক্তির কোনও নির্বাচন নেই) দেওয়া হয় তবে আপনি যাইহোক এটি কল করুন তারপর একটি 404 বোঝা যায়। অথবা যে আপনি আংশিক প্রতিক্রিয়াগুলি প্রয়োগ করেছেন এবং ক্লায়েন্টটি ডেটার একটি উপসেটের জন্য অনুরোধ না করা পর্যন্ত একটি আরও সম্পূর্ণ ডকুমেন্ট ফিরিয়ে দিন


5
404 ফিরিয়ে দেওয়ার বিষয়টি কেন আপনি বিশ্বাস করেন তা আপনি ব্যাখ্যা করেন নি a
ভিনসেন্ট সাভার্ড

14
অথবা হতে পারে 204 নন-কনটেন্ট ফিরিয়ে দেওয়া ভাল?
পল

6
আমি মনে করি 404 এর সাথে আমার উদ্বেগ এমন একটি কনফিগার
Paul D'Ambra

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

উত্তর:


24

এই দৃশ্যের জন্য এইচটিটিপি 4XX কোডগুলি সম্ভবত সঠিক পছন্দ নয়। আপনি উল্লেখ করেছেন যে শূন্য আত্মা প্রাণী থাকা একটি বৈধ রাষ্ট্র এবং এপিআই রুটটি person/{id}/selectedSpiritAnimalব্যক্তির কাছে idআছে বা না আছে তার জন্য অ্যাকাউন্ট হবে ।

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

সুতরাং আমি প্রতিক্রিয়াতে একটি সঠিকভাবে ফর্ম্যাট করা JSON বডি এবং একটি এইচটিটিপি 2XX কোড ব্যবহার করে দ্বিতীয় সমাধানগুলির দিকে ঝুঁকছি।

এখন আপনি যদি এই জাতীয় অনুরোধটি পান এবং এটি প্রমাণিত হয় যে ব্যক্তিটির idঅস্তিত্ব নেই, একটি 4XX কোড আরও অর্থবোধ করে।


17
"যখন কোনও ক্লায়েন্ট অনুরোধে কোনও ভুল কাজ করেছে তখন এইচটিটিপি 4XX প্রতিক্রিয়া পরিস্থিতিগুলির জন্য সংরক্ষিত থাকে"। অনুমান সম্পর্কে অনুমোদনমূলক বিবৃতি দেওয়ার সময়, দয়া করে প্রকৃত এইচটিটিপি অনুগ্রহটি উল্লেখ করুন, এবং (ক) এর উপরে নির্মিত ফ্রেমওয়ার্ক নয়, বা (খ) একটি এলোমেলো ব্লগ পোস্ট।
এরিক স্টেইন

5
@ এরিকস্টাইন আমি সে সম্পর্কে কিছুটা অলস অনুভব করেছি; সমালোচনার জন্য ধন্যবাদ আপডেট করা হয়েছে।
ব্র্যান্ডন আর্নল্ড

1
আমি এখানে আরএফসি লিঙ্কটি মতবিরোধী বলে মনে করি। একদিকে 4xx অংশ বলে cases in which the client seems to have erred, তবে অন্যদিকে 404 সরাসরি বলে The server has not found anything matching the Request-URI। আপনি এমন কোনও কিছুর অনুরোধ বিবেচনা করতে পারেন যা ক্লায়েন্টের ত্রুটির উপস্থিতি নেই। আমি বুঝতে পারি যে কোনও ব্যক্তি নেই যার বিরুদ্ধে বনাম একটি সাব প্রপ বিদ্যমান নেই, তবে এটি প্রতিক্রিয়া বার্তা হিসাবে চিহ্নিত করা যেতে পারে। 204 এছাড়াও প্রাসঙ্গিক বলে মনে হচ্ছে, যেহেতু সত্তাটি বিদ্যমান, তবে উপ-সম্পত্তির জন্য কোনও সামগ্রী নেই।
shorttuffsushi

1
ক্লায়েন্ট কিছু ভুল করেছে; এটি কোনও ব্যবহারকারীর জন্য নির্বাচিত আত্মিক প্রাণীটির উপস্থিতি না থাকলে এটির জন্য অনুরোধ করেছিল। 404 এর অর্থ হ'ল ... আপনি এমন কিছু চেয়েছিলেন যা সেখানে নেই।
অ্যান্ডি

5
যখন আমার ব্রাউজারটি সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেঞ্জঞ্জ / প্রশ্নগুলি / ইউনিকর্নকে একটি বৈধ অনুরোধ জানায় এবং এখনও আমি একটি 404 পাই (সেখানে "ইউনিকর্ন" আইডি নিয়ে কোনও প্রশ্নই আসে না)।
ব্যবহারকারী 253751

24

আমাকে আপনাকে রিচার্ডসন ম্যাচিউরিটি মডেলের সাথে পরিচয় করিয়ে দিন

আপনার সমস্যাটি হ'ল আপনি দু'টি সংস্থানকে এক হিসাবে প্রতিনিধিত্ব করছেন, যেখানে আপনার দুটি সংস্থান থাকতে হবে যার হাইপারমিডিয়া দ্বারা নির্দেশিত একটি সম্পর্ক রয়েছে। সম্পর্কের বর্ণনা দিতে হাইপারমিডিয়া ব্যবহার করা বিশ্রামের গৌরবময় স্তর 3।

আপনার ব্যক্তির ইউআরআই এর অধীনে বাস করা উচিত /person/{id}এবং প্রাণীটি এর অধীনে বাস করা উচিত/spiritanimal/{id} । ব্যক্তির ইঙ্গিত দেওয়া উচিত যে এটি প্রাণীর সাথে একটি লিঙ্ক ব্যবহার করে আত্মিক প্রাণী রয়েছে।

বব নামে পরিচিত এমন এক ব্যক্তির কল্পনা করতে দিন, যার আইডি 123 এবং একটি ইউনিকর্ন স্পিরিট প্রাণী রয়েছে।

GET /person/123

ফিরে আসত;

{
  "name": "Bob",
  "links": [
    {
      "rel": "spiritanimal",
      "uri": "/spiritanimals/789"
    }
  ]
}

এখন যে কেউ 123 জন পড়েন তারা জানতে পারবেন যে তাদের একটি আত্মিক প্রাণী রয়েছে এবং তাদের ইউআরআই রয়েছে যেখানে তারা এ সম্পর্কে আরও তথ্য পেতে পারেন।

GET /spitiranimal/789

ফিরে আসতে পারে

{
  "type": "Unicorn"
}

এখন ফ্রেড নামে পরিচিত এমন একজন ব্যক্তির কল্পনা করা যাক যার আইডি 456 এবং কোনও আত্মিক প্রাণী নেই।

GET /person/456

ফিরে আসত;

{
  "name": "Fred",
  "links": [
  ]
}

এখন যে কেউ 456 জন পড়েন তারা বুঝতে পারবেন যে তাদের কোনও আত্মিক প্রাণী নেই, কারণ কোনও লিঙ্ক নেই। সম্পর্কের অভাবকে প্রতিনিধিত্ব করতে কোনও HTTP স্থিতি কোড ব্যবহার করার দরকার নেই।


1
কেবল এই প্রশ্নের সাথে যুক্ত হচ্ছিল যে, এপিআই পরিবর্তন করার ক্ষমতা দেওয়া, কিছু স্তরের HATEOAS সম্ভবত সঠিক সমাধান হতে পারে। এটি এর দুর্দান্ত উদাহরণ
পল

1

আত্মিক প্রাণী পাওয়ার জন্য এটি উপযুক্ত ইউআরএল; অতএব, একটি 404 ত্রুটি অনুপযুক্ত। 404 প্রযুক্তিগত সমস্যা উপস্থাপনের জন্য, লজিক সমস্যা নয়।

উপযুক্ত সমাধানটি হ'ল http 200 এবং {"selectedAnimal": null}

আপনার কাছে পৃথক ওয়েবমেডোড থাকা উচিত /person/{id}/hasSelectedSpiritAnimalযা প্রত্যাবর্তন করে {"isSpiritAnimalSelected": false}। পর্দার আড়ালে, এটি একই পদ্ধতি কল করতে পারে বা নাও পারে, কেবল বাতিল হলে মিথ্যা ফিরিয়ে দেয়, তবে এটি সিদ্ধান্ত নেবে, গ্রাহক কোড নয়।

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


1
আপনি কেন এটি সঠিক সমাধান বলে বিশ্বাস করেন? যখন কোনও ডেটা ফেরত দেওয়া যায় না তখন আমি ডেটা ফেরার কোনও ধারণা করতে পারি না। আমি আপনার সাথে একমত যে 4040 ইউআরএল ঠিক আছে বলে কোনও অর্থ হয় না, সুতরাং 204 আমার কাছে সর্বাধিক অর্থ বোধ করছে বলে মনে হচ্ছে।
ভিনসেন্ট সাভার্ড

2
@ ভিনসেন্টস্যাওয়ার্ড স্থিতি কোডগুলি জসন প্রতিক্রিয়াগুলির চেয়ে কাজ করা আরও বেশি কঠিন এবং প্রযুক্তিগত সমস্যাগুলির জন্য ডোমেন তথ্য যোগাযোগের পরিবর্তে আরও উপযুক্ত।
দ্যাটিক্যাটহিস্পেরার

2
204: খালি শরীরের সাথে কোনও সামগ্রী নেই । এটি সমস্ত পরিষ্কার এবং স্ব ব্যাখ্যাযোগ্য। আর তর্ক করার দরকার নেই। সব মিলিয়ে, যখন কোনও স্পষ্ট ডিজাইনের প্যাটার্ন নেই তখন কোনও এসই একটি বেছে নিতে হবে, এটির প্রয়োজনমুখে বাঁকানো এবং ডকুমেন্টেশন সরবরাহ করতে হবে। 204 টি প্রতিক্রিয়া সহ একটি দেহ ফিরে পাওয়া ফলস্বরূপ নয়।
ফর্মিক্সিয়ান

2
@ ফর্মিক্সিয়ান ... আপনি যদি কোনও জসন / এইচটিপি-র পরিবর্তে কোনও বিজেসন / টিসিপি এপি তৈরি করছিলেন তবে এই ক্ষেত্রে আপনি কী ফিরিয়ে দেবেন? এইচপি কোডের উপর নির্ভর করা আমার কাছে এপিআই-র ফলাফলগুলি তার HTTP বাস্তবায়নে অযৌক্তিকভাবে বাঁধতে বলে মনে হচ্ছে।
দ্যাটিক্যাটহিসার

2
@ ভিনসেন্টস্যাভার্ড When you said "the spirit animal is not currently on file", it seemed quite similar to me to "there is no content"কোনও বিষয়বস্তু বলতে কোনও সামগ্রী নেই । যেমন: এটি ফিরে আসে ""। এই দুটি মোটেই সাদৃশ্য নয়। "আত্মা প্রাণী বর্তমানে ফাইলটিতে নেই" "" থেকে একেবারেই আলাদা।
শেন

1

আপনার শেষ পয়েন্টটি কেবল একটি প্রাণী নয়; এটি একটি প্রাণী বা এর অভাব। এটি একটি মান Optional/ Maybe/ দ্বারা সেরা উপস্থাপনNullable / ইত্যাদি

সুতরাং বৈধ মান (200 ঠিক আছে হিসাবে) হতে পারে:

  • {'animal': <some animal>, 'selected': true}
  • {'animal': null, 'selected': false}

আমি সেই DELETEপদ্ধতিটি কল্পনা করতে পারি , যখন শেষ পয়েন্টটিতে প্রয়োগ করা হয় তখন সেট 'selected'করতে পারেনfalse হয়, আবার , নির্বাচিত প্রাণীটিকে আনসেট করুন।

আপনি অবশ্যই 'selected'এখানে কীটি ফেলে দিতে পারেন, এটি কেবল স্পষ্টতার জন্য দেখানো হয়েছে; স্ট্রিং বনামnull পার্থক্য জন্য যথেষ্ট।


0

আপনার 404 ব্যবহার করা উচিত।

404 (পাওয়া যায়নি) স্থিতি কোডটি ইঙ্গিত দেয় যে উত্সের সার্ভারটি লক্ষ্য সংস্থার জন্য বর্তমান প্রতিনিধিত্ব খুঁজে পায় নি

RFC7231

HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 25 Sep 2017 00:00:00 GMT

"mole"

HTTP/1.1 404 Not Found
Content-Type: text/plain
Date: Mon, 25 Sep 2017 00:00:00 GMT

this person has not selected a spirit animal

আপনি যেহেতু একটি প্রোগ্রামিং ইন্টারফেস তৈরি করছেন, কোনও মানবিক ইন্টারফেস নয়, 404 পাঠ্যটি alচ্ছিক।

আমি এটি পছন্দ করি কারণ আমি যথাসম্ভব স্ট্যান্ডার্ড প্রোটোকলকে পছন্দ করি। এইচটিটিপি-এর অ-অস্তিত্বকে উপস্থাপন করার একটি উপায় রয়েছে এবং আমি এটি ব্যবহার করব।

সম্পাদনা: ধরুন আপনি এমন একটি বৈশিষ্ট্য যুক্ত করেছেন যেখানে ব্যবহারকারীরা তাদের আত্মিক প্রাণীগুলি ভাগ করে নেবেন কিনা তা বেছে নিতে পারে এবং কেউ এটি ভাগ করে নি। আপনি কি 200 ওকে nullবা 200 ঠিক আছে ফিরে আসবেন?"Unauthorized ? অথবা আপনি মান 401 অননুমোদিত / 403 নিষিদ্ধ ব্যবহার করবেন? এটি প্রথম জায়গায় কোনওটি না বেছে নেওয়ার জন্য সরাসরি উপমা বলে মনে হচ্ছে।


বিকল্পভাবে, আপনি যদি 200 ওকে + জেএসএন ব্যবহার করতে চান তবে আপনার ফিরে আসা উচিত null

HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 25 Sep 2017 00:00:00 GMT

"mole"

HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 25 Sep 2017 00:00:00 GMT

null

জিনিস পরিষ্কার রাখুন। প্রয়োজনে আরও মোড়ক তৈরি করুন।


2
তথ্য হয় যদিও পাওয়া যায় নি,। এটি কেবল ঘটে যে ডেটা null(কোনও মূল্য নেই)। এটি ক্লায়েন্টকে এমন কোনও কিছুর জন্য অনুরোধ করছে যার জন্য মান রাখার জন্য কোনও স্লট নেই। AttributeErrorমানটি হয়ে গেলে আপনি পাইথনে একটি নিক্ষেপ করার পরামর্শ দিবেন না None; এটি ইন্টারফেসটিকে অবৈধ এবং অকারণে কাজ করা কঠিন করে তুলবে। আরও যুক্তিযুক্তভাবে, অনেক এইচটিটিপি ক্লায়েন্ট এপিআই 404 কে ভাষার স্ট্যান্ডার্ড ত্রুটি পরিচালনা পদ্ধতিতে (ত্রুটি কোড, ব্যতিক্রম, ত্রুটির ধরণ) রূপান্তর করতে পারে যার অর্থ আপনাকে একটি বহিরাগত ত্রুটি দমন করতে হবে।
jpmc26

@ পোল ড্রপার অনুমানের ক্ষেত্রে কিছুটা উপরে স্ক্রোল করুন, আপনি দেখতে পাবেন যে এটি এইচটিটিপি 4XX সম্পর্কে একটি কম্বল বিবৃতি দিয়েছে: "স্ট্যাটাস কোডের 4XX ক্লাসটি এমন মামলার উদ্দেশ্যে করা হয়েছে যেখানে ক্লায়েন্ট ভুল করেছে বলে মনে হয়।" অপ্টটি স্পষ্টভাবে জানিয়েছে যে আত্মিক প্রাণী না থাকা একটি বৈধ রাষ্ট্র, যার জন্য এপিআই'র অ্যাকাউন্ট নেওয়া উচিত। সরঞ্জাম.এইটিএফ.আর.জি.এইচটিএম
ব্র্যান্ডন আর্নল্ড

তাহলে কীভাবে আপনি অনুরোধ করা সংস্থার অস্তিত্বের ইঙ্গিত দেয় (অর্থাত্ কোনও প্রাণী বাছাই করা হয়নি) এবং ক্লায়েন্ট একটি অবৈধ পথের জন্য অনুরোধ করছেন (যেমন /person/{id}/selectedSpritAnimal, টাইপটি পর্যবেক্ষণ করুন Sprit)।
সাম্পাথিস্রিস

1
অভিপ্রায় নির্বিশেষে, একটি 404 এর কঠোর অর্থ সম্পদটি পাওয়া যায় নি। যদি একটি নির্বাচিতস্পিরিট অ্যানিমাল একটি সংস্থান হয় এবং এর কোনটিই বিদ্যমান না থাকে তবে GET এর কিছুই নেই এবং একটি 404 উপযুক্ত appropriate তবে যদি ক্লায়েন্টটি যদি জানতে চায় যে কোনও আত্মিক প্রাণী বাছাই করা হয়েছে কিনা তবে সার্ভারের অন্য একটি উত্স প্রকাশ করা উচিত /person/{id}/isSpiritAnimalSelectedযা ক্লায়েন্টকে বলা হয়েছিল যে এটি নির্বাচিত কিনা। আমার কাছে এটি পড়ার আগে কোনও ফাইল বিদ্যমান কিনা তা পরীক্ষার একই ক্লাসিক উদাহরণ বলে মনে হয়। কেবল ফাইলটি পড়ুন এবং ENOENT ত্রুটিটি হ্যান্ডেল করা উচিত এটি নিক্ষেপ করা উচিত।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

1
@ পলড্রেপার পয়েন্টটি সংস্থানটির অস্তিত্ব আছে কি নেই তা নয়। পয়েন্টটি হ'ল এইচটিটিপি 4XX কোডগুলি বোঝানো হয় যখন কলার যখন এপিআইটি ভুলভাবে ব্যবহার করছে তখন। ওপ বলেন যে /person/{id}/selectedSpiritAnimalআত্মিক প্রাণীর অস্তিত্ব না থাকলেও এটি ব্যবহার করা। এর অর্থ হ'ল এইচটিটিপি 4XX ভুল, যখন এই জাতীয় ক্ষেত্রে ব্যবহৃত হয়। ওপ এছাড়াও সঠিকভাবে বলেছে যে এটি খারাপ এপিআই ডিজাইনের গন্ধ হতে পারে।
ব্র্যান্ডন আর্নল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.