संसाधन नहीं मिलने पर क्या मुझे 204 या 404 प्रतिसाद वापस करना चाहिए?


15

मैं टूर्नामेंट और शेड्यूल के लिए एक सरल रेस्टफुल सेवा विकसित कर रहा हूं। जब एक JSON निकाय वाले POST अनुरोध के माध्यम से एक टूर्नामेंट बनाया जाता है, तो टूर्नामेंट BiMapडीएओ क्रमांक में निम्नानुसार घोषित किया जाता है।

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

जब कोई टूर्नामेंट बनाया जाता है, तो उसकी संबद्ध स्ट्रिंग आईडी वापस कर दी जाती है ताकि उपयोगकर्ता के पास उस टूर्नामेंट का भविष्य संदर्भ हो सके। वह निम्नलिखित अनुरोध करने वाले नए टूर्नामेंट से जानकारी वापस प्राप्त कर सकता है:

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

लेकिन अगर ऐसी आईडी वाला कोई टूर्नामेंट न मिले तो क्या होगा? अब तक, मैं 204 प्रतिक्रिया दे रहा हूं। खैर, जर्सी 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/ Isdate-goes-here] । 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
RFC 2616 का विशेष ध्यान रखें । यदि आप संदेश निकाय को पूरी तरह से छोड़ रहे हैं, तो 204 प्रतिक्रियाएँ केवल कल्पना हैं। कुछ हद तक, 204 प्रतिक्रिया का बिंदु यह कहना है, "नहीं, यह कोई दुर्घटना नहीं है कि मैंने कोई सामग्री नहीं लौटाई है।" मेनमा के उदाहरण पर विस्तार करने के लिए: यदि कोई लॉग लुकअप टूल पाठ फ़ाइलों को थूक देता है (उदाहरण के लिए, लॉग फ़ाइलों के चारों ओर एक पतली आवरण जो कि लॉग फ़ाइल को इस प्रकार है), एक खाली लॉग फ़ाइल के लिए 204 उपयुक्त होगा। यदि प्रतिक्रिया एक खाली JSON ऑब्जेक्ट (उदाहरण के लिए {content: ''}) थी, तो 204 प्रतिक्रिया अनुचित होगी।
ब्रायन

" क्योंकि, ठीक है, भविष्य को लॉग करना मुश्किल है। " - यह बिट एक मनमानी तारीख पर निर्भर करता है; क्यों न इसे कुछ ऐसा बनाया जाए जो पाठक को यह दिखावा करने की आवश्यकता न हो कि यह आज नहीं है? शायद का उपयोग 2015-02-29करना बेहतर होगा, क्योंकि यह एक तारीख है जो बिल्कुल मौजूद नहीं है?
निधि मोनिका का मुकदमा

3

आपको एक 404 लौटाना चाहिए। आप इसे NotFoundException ( https://jersey.java.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 वापस करना चाहिए। आप एक संसाधन ( /eventscheduler/) का उपयोग करने का प्रयास कर रहे हैं जो मौजूद नहीं है। यह एक क्लाइंट को इंगित करेगा कि सर्वर मौजूद है localhost:8080, लेकिन eventschedulerअंतिम बिंदु पर कुछ भी नहीं है ।

यदि http://localhost:8080/eventscheduler/कोई समापन बिंदु के रूप में मौजूद है, लेकिन आवश्यक संसाधन अनुपलब्ध हैं, तो 5xx त्रुटि उपयुक्त है। इसका एक अच्छा उदाहरण यह होगा कि यदि कोई डेटाबेस ऑफ़लाइन है, जहां आप 503 लौटा सकते हैं। बेशक, आप एक विशिष्ट उदाहरण के बजाय सामान्य 500 त्रुटि वापस करना चाहते हैं।

यदि http://localhost:8080/eventscheduler/मौजूद है, लेकिन जिस चीज़ का प्रतिनिधित्व किया गया c15268ce-474a-49bd-a623-b0b865386f39है, वह मौजूद नहीं है, तो मैं विवरण का संकेत देने वाले निकाय के साथ 200 वापस करूंगा। समापन बिंदु मौजूद है, किया गया अनुरोध पूरी तरह से मान्य था और इसे संसाधित किया जा सकता था, लेकिन कोई मेल नहीं था।

यदि समापन बिंदु पर आपके ग्राहक का अनुरोध मान्य नहीं था, तो आप अन्य 4xx त्रुटियों को देखेंगे। आप संकेत कर सकते हैं कि क्लाइंट 401 या 403 के साथ अनुरोध किए गए एंडपॉइंट या आइटम (एक्सेस) को एक्सेस करने के लिए अधिकृत नहीं है या यह इंगित करने के लिए 400 का उपयोग कर सकता है कि अनुरोध अमान्य है। इनमें से किसी के साथ, प्रतिक्रिया निकाय में अतिरिक्त जानकारी प्रदान की जा सकती है।


समापन बिंदु और संसाधन के बीच अंतर करने की कोई आवश्यकता नहीं है। यदि URI किसी भी संसाधन से मेल नहीं खाता है, तो किसी भी कारण से, सर्वर को 404 वापस करना चाहिए।
bdsl

सही काम करने वाली साइट के उदाहरण के लिए इस साइट पर प्रतिक्रिया कोड की जांच करें। यह एक वेबसाइट है, एक एपीआई नहीं, लेकिन एक ही http युक्ति लागू होती है। softwareengineering.stackexchange.com/questions/266183385
bdsl

@ बीडीएसएल मैं आपको बता सकता हूं कि यह बिल्कुल गलत है। उदाहरण के लिए, मैं एक उपयोगकर्ता सेवा के साथ बातचीत कर रहा हूं जो उपयोगकर्ता प्रोफ़ाइल लौटा सकती है। मान लीजिए कि यह समापन बिंदु है /userऔर इसका उपयोग किया जाता है /user?email=test@example.com। एक एपीआई उपभोक्ता के रूप में, मैं जानना चाहता हूं कि क्या /userकिसी कारण से सर्वर पर मौजूद नहीं है (शायद यह एपीआई के v2 में जोड़ा गया था और सर्वर v1 पर है या इसे v3 में बदल दिया गया था) या यदि उपयोगकर्ता ईमेल के साथ है test@example.comमौजूद नहीं है। पहला एक 404 है, दूसरा एक 200 बॉडी है जो उस ईमेल पते वाले उपयोगकर्ता को इंगित नहीं करता है।
थॉमस ओवेन्स

@bdsl यह अच्छा है, लेकिन इसका मतलब यह नहीं है कि यह सही है या सबसे अच्छा है। मुझे यह भी नहीं लगता है कि आप एक वेबसाइट की तुलना कर सकते हैं जो एक वेब ब्राउज़र के माध्यम से मानव संपर्क के लिए डिज़ाइन की गई है बनाम एक सॉफ्टवेयर सिस्टम में उपयोग के लिए डिज़ाइन किया गया एपीआई।
थॉमस ओवेन्स

1
इस मुद्दे पर आगे youtube.com/watch?v=nSKp2StlS6s
bdsl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.