কোনও উত্স পাওয়া না গেলে আমি কি 204 বা 404 এর প্রতিক্রিয়া ফিরিয়ে দেব?


15

আমি টুর্নামেন্ট এবং সময়সূচীর জন্য একটি সাধারণ RESTful পরিষেবা বিকাশ করছি। যখন কোনও টুর্নামেন্ট জেএসওএন বডি সমন্বিত কোনও পোস্টের অনুরোধের মাধ্যমে তৈরি করা হয়, তখন টুর্নামেন্টটি BiMapএকটিতে প্রবেশ করানো হয় , ডিএও বাস্তবায়নে নিম্নলিখিত হিসাবে ঘোষণা করা হয়:

private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create());

যখন কোনও টুর্নামেন্ট তৈরি করা হয়, এর সাথে সম্পর্কিত স্ট্রিং আইডি ফিরিয়ে দেওয়া হয় যাতে ব্যবহারকারীর সেই টুর্নামেন্টের ভবিষ্যতের রেফারেন্স থাকতে পারে। তিনি নিম্নলিখিত অনুরোধটি সম্পাদন করে নতুন টুর্নামেন্ট থেকে তথ্য ফিরে পেতে পারেন:

GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39

কিন্তু যদি এই জাতীয় আইডির সাথে কোনও টুর্নামেন্ট না পাওয়া যায়? এখনও অবধি আমি ২০৪ টি প্রতিক্রিয়া ফিরিয়ে দিচ্ছি ঠিক আছে, জার্সিটি এর একটি nullপদ্ধতি থেকে ফিরে আসার সময় আমার জন্য এটি করছে । এটি সেই পদ্ধতি যা উপরের রুটের সাথে সম্পর্কিত:

@Path("/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("id") String id) {
    Optional<Tournament> optTournament = tournamentDao.getTournament(id);
    if (optTournament.isPresent())
        return optTournament.get();
    return null;
}

আমার প্রশ্ন হ'ল: কোনও 204: No Contentপ্রতিক্রিয়া ফিরিয়ে দেওয়া কি ঠিক হবে , বা এটির 404পরিবর্তে কোনও প্রতিক্রিয়া হওয়া উচিত , যেহেতু সংস্থানটি পাওয়া যায় নি?

যদি আমি এটিকে 404 এ পরিবর্তন করতে পারি তবে সুস্পষ্ট প্রশ্ন: আমার কি পদ্ধতিটির স্বাক্ষরটি সঠিকভাবে পরিবর্তন করা উচিত? যেহেতু এখন কোনও টুর্নামেন্ট (প্রকারের Tournament) ফিরে না আসতে পারে, তাই পদ্ধতিটি আলাদা হওয়া উচিত। এর Responseপরিবর্তে আমার কি টাইপটি রিটার্ন টাইপ হিসাবে ব্যবহার করা উচিত ?

উত্তর:


32

HTTP 204মানে এমন কিছু বিষয় যা ছিল পাওয়া গিয়েছিলো, কিন্তু এটা খালি। উদাহরণস্বরূপ, কল করুন যে আপনি HTTP- র মাধ্যমে লগ ফাইলগুলি সরবরাহ করছেন, যেমন http://example.com/logs/ পরিবারdate-goes- এখানে] অনুরোধগুলি দিয়ে । 18 ই মে, 2015 তে:

  • http://example.com/logs/2015-05-19 ফিরে আসবে HTTP 404, যার অর্থ কোনও লগ নেই, কারণ, ভাল, ভবিষ্যতে লগ করা কঠিন।

  • http://example.com/logs/2015-05-18 যাইহোক, HTTP 200প্রতিক্রিয়ার সামগ্রীটিতে লগ এন্ট্রি সহ, অথবা HTTP 204লগ ফাইলটি তৈরি করা হয়েছিল, তবে এখনও এর জন্য কোনও লগ রেকর্ড করা হয়নি তারিখ।

আপনি প্রদান তাহলে nullএকটি অনুরোধের উত্তর হিসেবে ফ্রেমওয়ার্ক, এটা যে আপনি একটি এন্ট্রি পাওয়া অনুমান, এবং এই এন্ট্রি খালি থাকে, এইভাবে HTTP 204। পরিবর্তে, আপনার throw new NotFoundException();ফ্রেমওয়ার্কটি নির্দেশ করতে হবে যে এন্ট্রি বিদ্যমান নেই, যাতে এটি তৈরি করে HTTP 404

যদি আমি এটিকে 404 এ পরিবর্তন করতে পারি তবে সুস্পষ্ট প্রশ্ন: আমার কি পদ্ধতিটির স্বাক্ষরটি সঠিকভাবে পরিবর্তন করা উচিত?

না, আপনি না। এটি সম্পর্কে সুন্দর জিনিস throw new NotFoundException();। আপনার পদ্ধতির আসল রিটার্নের ধরন কী তা বিবেচনা করেই এটি কাজ করবে।


5
আরএফসি 2616 এর বিশেষ দ্রষ্টব্য । 204 টি প্রতিক্রিয়া কেবলমাত্র ম্যাসেজের মতো হয় যদি আপনি বার্তাটি পুরোপুরি বাদ দিচ্ছেন। কিছুটা হলেও, ২০৪ এর প্রতিক্রিয়াটির বিন্দুটি বলতে হয়, "না, এটি কোনও দুর্ঘটনা নয় যে আমি কোনও বিষয়বস্তু ফেরিনি"। মাইনমার উদাহরণটিতে প্রসারিত করার জন্য: যদি কোনও লগ দেখার সরঞ্জামটি টেক্সট ফাইলগুলিতে থুতু ফেলে (যেমন লগ ফাইলগুলির চারপাশে একটি পাতলা মোড়ক যা কেবল লগ ফাইলকে যেমন থাকে তেমনই আলাদা করে দেয়), একটি 204 খালি লগ ফাইলের জন্য উপযুক্ত হবে। যদি প্রতিক্রিয়াটি একটি খালি JSON অবজেক্ট (যেমন, {content: ''}) হয়, একটি 204 প্রতিক্রিয়া অনুপযুক্ত।
ব্রায়ান

" কারণ, ভাল, ভবিষ্যতে লগ করা কঠিন " "- এই বিটটি একটি স্বেচ্ছাসেবী তারিখের উপর নির্ভর করে; কেন এমন কিছু তৈরি করবেন না যার জন্য পাঠকের প্রয়োজন হবে না যে ভান করার জন্য এটি আজ নেই? সম্ভবত ব্যবহার 2015-02-29করা আরও ভাল হবে, যেহেতু এটি এমন একটি তারিখ যা একেবারেই নেই?
তহবিল মনিকার লসুইট

3

আপনার একটি 404 ফিরিয়ে দেওয়া উচিত a আপনি এটি একটি নটফাউন্ডএক্সেপশন ( https://jersey.java.net.net/apidocs/2.6/jersey/javax/ws/rs/NotFoundException.html ) ছুঁড়ে দিয়ে করতে পারেন ।

এছাড়াও যদি আপনাকে ফিরে আসা সামগ্রীর ধরণটি /programming/23858488/how-i-return-http-404-json-xML-response-in-jax-rs- এ নিয়ন্ত্রণ করতে হয় তবে দয়া করে এই এসও প্রশ্নটি দেখুন জার্সি-অন-হুল বিড়াল


1

আপনার অনুরোধ GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39

যদি http://localhost:8080/eventscheduler/শেষ পয়েন্ট হিসাবে উপস্থিত না থাকে তবে আপনাকে একটি 404 ফেরত দেওয়া উচিত You আপনি কোনও সংস্থান ( /eventscheduler/) অ্যাক্সেস করার চেষ্টা করছেন যা অস্তিত্বহীন। এটি কোনও ক্লায়েন্টকে নির্দেশ করবে যে কোনও সার্ভার রয়েছে localhost:8080, তবে eventschedulerশেষের বিন্দুতে কিছুই নেই ।

যদি http://localhost:8080/eventscheduler/শেষ পয়েন্ট হিসাবে উপস্থিত থাকে তবে প্রয়োজনীয় সংস্থানগুলি অনুপলব্ধ থাকে তবে একটি 5 এক্সএক্স ত্রুটি উপযুক্ত। এর একটি ভাল উদাহরণ হ'ল যদি কোনও ডাটাবেস অফলাইনে থাকে, যেখানে আপনি 503 ফেরত দিতে পারেন Of

যদি http://localhost:8080/eventscheduler/উপস্থিত থাকে তবে প্রতিনিধিত্ব করা জিনিসটি c15268ce-474a-49bd-a623-b0b865386f39বিদ্যমান না থাকে, আমি বিশদটি নির্দেশ করে একটি শরীরে 200 ফিরিয়ে দেব। শেষের অবস্থানটি বিদ্যমান, অনুরোধটি সম্পূর্ণ বৈধ ছিল এবং প্রক্রিয়া করা যেতে পারে, তবে কোনও মিল ছিল না।

যদি আপনার ক্লায়েন্টের শেষ পয়েন্টে অনুরোধটি বৈধ না হয় তবে আপনি অন্যান্য 4XX ত্রুটিটি দেখবেন। আপনি ইঙ্গিত করতে পারবেন যে ক্লায়েন্টটি 401 বা 403 এর সাথে অনুরোধ করা শেষ পয়েন্ট বা আইটেমগুলিতে অ্যাক্সেসের জন্য অনুমোদিত নয় বা অনুরোধটি অবৈধ তা নির্দেশ করার জন্য 400 ব্যবহার করতে পারেন। এর যে কোনওটির সাথে, অতিরিক্ত তথ্য প্রতিক্রিয়া সংস্থায় সরবরাহ করা যেতে পারে।


শেষ পয়েন্ট এবং সংস্থানটির মধ্যে পার্থক্য করার দরকার নেই। যদি ইউআরআই কোনও সংস্থার সাথে মেলে না, তবে যে কোনও কারণেই হোক না কেন, সার্ভারটি 404 ফেরত আসতে হবে
বিডএসএল

কোনও সাইটের সঠিক কাজ করার উদাহরণের জন্য এই সাইটে প্রতিক্রিয়া কোডটি দেখুন। এটি কোনও ওয়েবসাইট, কোনও এপিআই নয়, তবে একই HTTP স্পেস প্রয়োগ হয়। সফ্টওয়্যারেনজেনিং.স্ট্যাকেক্সেঞ্জারিংয়েজ
প্রশ্নস

@ বিডিএসএল আমি আপনাকে বলতে পারি যে এটি একেবারে ভুল। উদাহরণস্বরূপ, আমি এমন একটি ব্যবহারকারীর পরিষেবাতে ইন্টারঅ্যাক্ট করছি যা কোনও ব্যবহারকারীর প্রোফাইল ফেরত দিতে পারে। আসুন যে এই শেষবিন্দু নেই /userমত ব্যবহার করা হয় /user?email=test@example.com। এপিআই গ্রাহক হিসাবে, আমি জানতে চাই যে /userকোনও কারণে যদি সার্ভারে উপস্থিত না থাকে (সম্ভবত এটি API এর v2 এ যুক্ত হয়েছিল এবং সার্ভারটি v1 এ রয়েছে বা এটির নামকরণ v3 হয়েছে) অথবা ইমেল সহ ব্যবহারকারী যদি test@example.comঅস্তিত্ব নেই প্রথমটি একটি 404, দ্বিতীয়টি এমন 200 টি যা একটি ইমেল ঠিকানা সহ কোনও ব্যবহারকারীকে নির্দেশ করে না।
টমাস ওয়ানস

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

1
এই ইস্যুটি আরও আলোচনা করা হয়েছে youtube.com/watch?v=nSKp2StlS6s
বিডিএসএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.