बाकी एपीआई 404: खराब यूआरआई, या गुम संसाधन?


219

मैं एक REST API बना रहा हूं, लेकिन मैंने एक समस्या का सामना किया है।

ऐसा लगता है कि REST API को डिजाइन करने में स्वीकृत अभ्यास यह है कि यदि अनुरोधित संसाधन मौजूद नहीं है, तो 404 लौटाया जाता है।

हालांकि, मेरे लिए, यह अनावश्यक अस्पष्टता जोड़ता है। HTTP 404 पारंपरिक रूप से एक खराब URI के साथ जुड़ा हुआ है। इसलिए वास्तव में हम कह रहे हैं "या तो आप सही जगह पर पहुंच गए, लेकिन वह विशिष्ट रिकॉर्ड मौजूद नहीं है, या इंटर्नेट में ऐसा कोई स्थान नहीं है! मुझे वास्तव में यकीन नहीं है कि कौन सा ..."

निम्नलिखित URI पर विचार करें:

http://mywebsite/api/user/13

यदि मुझे 404 वापस मिल जाता है, तो क्या इसलिए कि उपयोगकर्ता 13 मौजूद नहीं है? या यह इसलिए है क्योंकि मेरा URL होना चाहिए था:

http://mywebsite/restapi/user/13

अतीत में, मैं सिर्फ एक HTTP 200 OKप्रतिक्रिया कोड के साथ एक पूर्ण परिणाम लौटा हूं यदि रिकॉर्ड मौजूद नहीं है। यह सरल है, और मेरी राय में बहुत साफ है, भले ही यह आवश्यक रूप से स्वीकृत अभ्यास नहीं है। लेकिन क्या ऐसा करने का एक बेहतर तरीका है?


शायद एक डुप्लिकेट। stackoverflow.com/questions/3821663/…
स्पेंसर कोरमोस

7
अन्य प्रश्न URI क्वेरी स्ट्रिंग स्वरूपों से संबंधित प्रतीत होता है। 404 पर चर्चा मेरे प्रश्न का उत्तर देने के लिए पर्याप्त नहीं है, जो यह निर्धारित करने के लिए कि क्या 404 वास्तव में है, यह निर्धारित करने के लिए एक अधिक उपयुक्त या उपयोगी तरीका है। मैंने पोस्ट करने से पहले समीक्षा की।
ब्रायन लेसी

क्या यह सामान्य है जब ब्राउज़र शंकु में 404 त्रुटियां होती हैं? जब मैं सही uri के साथ नियमित संचालन करता हूं, लेकिन संसाधन नहीं मिला।
वासिली माज़ेकिन

3
404 एक खराब यूआरआई का संकेत नहीं देता है, यह एक संसाधन को नहीं मिला इंगित करता है। ऐसा इसलिए हो सकता है क्योंकि कोई उपयोगकर्ता '13' नहीं है, या ऐसा इसलिए हो सकता है क्योंकि कोई संसाधन / mywebsite / api नहीं है।
क्रिस

जवाबों:


101

404 केवल HTTP प्रतिक्रिया कोड है। उसके शीर्ष पर, आप अधिक सार्थक त्रुटि संदेश के साथ एक प्रतिक्रिया निकाय और / या अन्य शीर्ष लेख प्रदान कर सकते हैं जो डेवलपर्स देखेंगे।


7
यह समझ में आता है। मुझे आश्चर्य है, हालांकि, क्या कोई लाभ वास्तव में पहले स्थान पर 404 को वापस लेने से प्राप्त होता है, या एक शून्य प्रतिक्रिया के साथ 200 लौटाता है?
ब्रायन लैसी

15
यदि आप एक 200 के साथ वापस आ जाते हैं तो आप HTTP स्पेक के खिलाफ जा रहे हैं। आप ऐसा कर सकते हैं, लेकिन तब आपका एपीआई "यूनिफाइड इंटरफेस" का विरोध नहीं करेगा।
मुकदमा

5
... और आपके प्रतिक्रिया शरीर में मान्य URI के लिए हाइपरलिंक शामिल होना चाहिए। मूल URI, और शायद एक बुकमार्क या दो को छोड़कर, आपके क्लाइंट को सर्वर द्वारा दिए गए लिंक का हमेशा अनुसरण करना चाहिए । फिर सिस्टम के बाहर काम करने का फैसला करने के तरीके के बारे में विस्तृत शब्दार्थ का आविष्कार करने की आवश्यकता नहीं है।
फुमानचु

@DarrylHebbes का क्या मतलब है, मैं एक अनुरोध कर सकता हूं और क्रोम डेवलपर कंसोल के नेटवर्क टैब में प्रतिक्रिया की पूरी सामग्री देख सकता हूं।
जापज़ j

किसी भी प्रश्न के लिए एक त्रुटि (404 या जो भी) वापस करना अविश्वसनीय रूप से बुरा है जो खाली परिणाम देता है। कोई भी डेटाबेस ऐसा नहीं करेगा और आमतौर पर आप उपयोगकर्ता को एक अप्रत्याशित स्थिति के रूप में एक खाली परिणाम की रिपोर्ट नहीं करना चाहते हैं। उदाहरण: यदि आप अगले 30 मिनट के लिए कोई अपॉइंटमेंट निर्धारित है, तो यह जांचने के लिए आप अपने एप को क्वेरी करें। यदि कोई नहीं है, तो आपको 404 नहीं लौटाना चाहिए। एक 200 ओके और एक खाली सरणी लौटाएं, कृपया।
esmiralha

59

404संसाधन मौजूद न होने पर उपयोग करें । 200एक खाली शरीर के साथ वापस मत आना ।

यह प्रोग्रामिंग में undefinedखाली स्ट्रिंग (जैसे "") के समान है । जबकि बहुत समान है, निश्चित रूप से एक अंतर है।

404इसका मतलब है कि उस URI (प्रोग्रामिंग में अपरिभाषित चर की तरह) पर कुछ भी मौजूद नहीं है। 200खाली शरीर के साथ लौटने का मतलब है कि वहां कुछ मौजूद है और अभी कुछ खाली है (जैसे प्रोग्रामिंग में एक खाली स्ट्रिंग)।

404इसका मतलब यह नहीं है कि यह एक "बुरा यूआरआई" था। विशेष HTTP कोड हैं जो URI त्रुटियों (जैसे 414 Request-URI Too Long) के लिए अभिप्रेत हैं ।


1
अरे, मुझे लगता है कि आप कुछ पर हो सकते हैं। यह "41" में से एक को वापस करने के लिए और अधिक समझ में नहीं आएगा? अनुरोधित संसाधन के साथ कोई समस्या होने पर त्रुटियाँ? उदाहरण के लिए, 410 गॉन का अर्थ है "अनुरोधित संसाधन अब सर्वर पर उपलब्ध नहीं है और कोई अग्रेषण पता ज्ञात नहीं है।" - ( w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.11 देखें )
ब्रायन लेसी

दरअसल, मैंने जो संसाधन ऊपर संदर्भित किया है, वह यह भी कहता है, "यदि सर्वर को पता नहीं है, या यह निर्धारित करने के लिए कोई सुविधा नहीं है कि क्या स्थिति स्थायी है या नहीं, तो स्थिति कोड 404 (नहीं मिला) SHOULD का उपयोग किया जाना चाहिए।" तो शायद यह जरूरी नहीं है कि सबसे अच्छा विकल्प या तो ..
ब्रायन लेसी

2
मुझे नहीं लगता कि 41x त्रुटियों में से कोई भी आपके उपयोग के मामले में उपयुक्त है। मुझे अपरिभाषित बनाम खाली स्ट्रिंग की तुलना पसंद है, जो मेरे उत्तर में मेरी बात का अधिक संक्षिप्त संस्करण है। एक अंतर है, लेकिन इसका मतलब यह नहीं है कि एक खाली स्ट्रिंग एक त्रुटि है। सादृश्य को फैलाने के लिए: आपके पास एक ऐसी विधि हो सकती String getName()है जिसका कार्यान्वयन इस तरह से हो return this.name == null ? "" : this.name:। जब तक आप ग्राहक को पता है कि चाहते हैं यह गलत नहीं है this.nameहै null
jhericks

1
404 अभी भी सबसे उपयुक्त विकल्प है। आप त्रुटि प्राप्त करने के लिए विशिष्ट विवरण के उपयोगकर्ता / ग्राहक को सूचित करने के लिए उस 404 प्रतिक्रिया के शरीर का उपयोग (और प्रोत्साहित किया जाता है) कर सकते हैं। देखें: stackoverflow.com/a/9999335/105484 । आपके मामले में आप उपयोगकर्ता को यह सुझाव देने के लिए उस निकाय का उपयोग करना चाह सकते हैं कि वे अपने URI को सुधारने के लिए / restapi / user / USER_ID
nategood

ठीक है, मैं यहां कुछ अच्छे बिंदु देख सकता हूं, लेकिन 4XX त्रुटि कोड हैं, यह कैसे एक त्रुटि स्थिति है? ग्राहक को 404 होने से कैसे रोका जा सकता है?
Krzysztof Kubicki

20

ज्यादातर चीजों के साथ, "यह निर्भर करता है"। लेकिन मेरे लिए, आपका अभ्यास बुरा नहीं है और प्रति सेहत HTTP युक्ति के खिलाफ नहीं जा रहा है । हालाँकि, चलिए कुछ बातें स्पष्ट करते हैं।

सबसे पहले, यूआरआई को अपारदर्शी होना चाहिए। यहां तक ​​कि अगर वे लोगों के लिए अपारदर्शी नहीं हैं, तो वे मशीनों के लिए अपारदर्शी हैं। दूसरे शब्दों में, के बीच का अंतर http://mywebsite/api/user/13, http://mywebsite/restapi/user/13के बीच अंतर के रूप में ही है http://mywebsite/api/user/13और http://mywebsite/api/user/14एक ही इसी अवधि नहीं है नहीं अर्थात्। तो एक 404 के लिए पूरी तरह से उपयुक्त होगा http://mywebsite/api/user/14(यदि ऐसा कोई उपयोगकर्ता नहीं है) लेकिन जरूरी नहीं कि केवल उचित प्रतिक्रिया हो।

आप एक खाली 200 प्रतिसाद या अधिक स्पष्ट रूप से 204 (कोई सामग्री नहीं) प्रतिसाद भी दे सकते हैं। यह ग्राहक को कुछ और बताएगा। इसका अर्थ यह होगा कि जिस संसाधन की पहचान की गई है, http://mywebsite/api/user/14उसकी कोई सामग्री नहीं है या अनिवार्य रूप से कुछ भी नहीं है। इसका मतलब यह है कि वहाँ है इस तरह के एक संसाधन। हालांकि, यह जरूरी नहीं है कि आप दावा कर रहे हैं कि कुछ उपयोगकर्ता आईडी 14. के साथ डेटा स्टोर में बने हुए हैं, यह आपकी निजी चिंता है, न कि ग्राहक द्वारा अनुरोध करने की चिंता। इसलिए, अगर यह आपके संसाधनों को उस तरह से मॉडल करने के लिए समझ में आता है, तो आगे बढ़ें।

आपके ग्राहकों को जानकारी देने के लिए कुछ सुरक्षा निहितार्थ हैं जो उनके लिए वैध यूआरआई का अनुमान लगाना आसान बनाते हैं। 404 के बजाय 200 को मिस करने पर क्लाइंट को एक सुराग दे सकता है कि कम से कम http://mywebsite/api/userहिस्सा सही है। एक दुर्भावनापूर्ण ग्राहक बस अलग-अलग पूर्णांकों की कोशिश कर सकता है। लेकिन मेरे लिए, एक दुर्भावनापूर्ण ग्राहक http://mywebsite/api/userवैसे भी इस भाग का अनुमान लगाने में सक्षम होगा । UUID का उपयोग करने के लिए एक बेहतर उपाय होगा। यानी इससे http://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66बेहतर है http://mywebsite/api/user/14। ऐसा करते हुए, आप 200 की वापसी की तकनीक का उपयोग कर सकते हैं, बिना ज्यादा दूर दिए।


1
यह वह समाधान है जिसे मैंने चुना और 404 के बजाय 204 का उपयोग करके चला गया। मेरे लिए 204 का अर्थ है "मुझे आपका कोड मिला, लेकिन परिणाम नहीं मिला" और 404 का अर्थ है "मुझे निष्पादित करने के लिए कोई कोड नहीं मिला, क्या यह है गलत रास्ता? "
मैट सैंडर्स

11

404 नहीं मिला तकनीकी रूप से इसका मतलब है कि वर्तमान में उरई एक संसाधन के लिए मैप नहीं करता है । आपके उदाहरण में, मैं एक अनुरोध की व्याख्या करता हूं http://mywebsite/api/user/13कि ४०४ रिटर्न का मतलब यह है कि इस यूआरएल को संसाधन के लिए मैप नहीं किया गया था । क्लाइंट के लिए, वह बातचीत का अंत होना चाहिए।

अस्पष्टता के साथ चिंताओं को दूर करने के लिए, आप अन्य प्रतिक्रिया कोड प्रदान करके अपना एपीआई बढ़ा सकते हैं। उदाहरण के लिए, मान लीजिए कि आप ग्राहकों को url के लिए GET अनुरोध जारी करने की अनुमति देना चाहते हैं http://mywebsite/api/user/13, तो आप यह संवाद करना चाहते हैं कि ग्राहकों को canon url का उपयोग करना चाहिए http://mywebsite/restapi/user/13। उस स्थिति में, आप स्थायी रूप से 301 मूव्ड लौटाकर स्थायी पुनर्निर्देशन जारी करने पर विचार कर सकते हैं और प्रतिक्रिया के स्थान हेडर में कैनोनिकल यूआरएल की आपूर्ति कर सकते हैं । यह क्लाइंट को बताता है कि भविष्य के अनुरोधों के लिए उन्हें विहित यूआरएल का उपयोग करना चाहिए।


11

इसलिए संक्षेप में, ऐसा लगता है कि उत्तर इस बात पर निर्भर कर सकता है कि अनुरोध कैसे बनता है।

यदि अनुरोधित संसाधन URI के भाग के अनुसार अनुरोध करता है http://mywebsite/restapi/user/13और उपयोगकर्ता 13 मौजूद नहीं है, तो 404 शायद उपयुक्त और सहज है क्योंकि URI एक गैर-मौजूद उपयोगकर्ता / संस्था / दस्तावेज़ / आदि का प्रतिनिधि है। वही GUID http://mywebsite/api/user/3dd5b770-79ea-11e1-b0c4-0800200c9a66और ऊपर Api / restapi तर्क का उपयोग करके अधिक सुरक्षित तकनीक के लिए धारण करेगा ।

हालाँकि, यदि अनुरोध किए गए संसाधन आईडी को अनुरोध शीर्षलेख में शामिल किया गया था [अपने स्वयं के उदाहरण को शामिल करें], या वास्तव में, एक पैरामीटर के रूप में, यूआरआई में, http://mywebsite/restapi/user/?UID=13तो फिर यूआरआई अभी भी सही होगा (क्योंकि एक USER की अवधारणा से बाहर निकलता है http://mywebsite/restapi/user/); और इसलिए प्रतिक्रिया उचित हो सकती है एक 200 (एक उचित रूप से संदेश के साथ) होने की उम्मीद है क्योंकि 13 के रूप में जाना जाने वाला विशिष्ट उपयोगकर्ता मौजूद नहीं है लेकिन यूआरआई करता है। इस तरह हम कह रहे हैं कि यूआरआई अच्छा है, लेकिन डेटा के अनुरोध के लिए कोई सामग्री नहीं है।

व्यक्तिगत रूप से एक 200 अभी भी सही नहीं लगता है (हालांकि मैंने पहले यह तर्क दिया है)। एक गलत प्रतिक्रिया उदाहरण के लिए भेजे जाने पर 200 प्रतिक्रिया कोड (क्रिया प्रतिक्रिया के बिना) एक समस्या का कारण नहीं बन सकता है।

204 - No Contentप्रतिक्रिया भेजने के लिए एक बेहतर तरीका होगा । यह w3c के विवरण के अनुरूप है। सर्वर ने अनुरोध पूरा कर लिया है, लेकिन उसे निकाय-निकाय को वापस करने की आवश्यकता नहीं है, और अद्यतन मेटेनफॉर्मेशन वापस करना चाह सकता है। * 1 भ्रम, मेरी राय में विकिपीडिया प्रविष्टि के कारण 204 में कोई सामग्री नहीं है। - सर्वर ने अनुरोध को सफलतापूर्वक संसाधित किया, लेकिन कोई भी सामग्री वापस नहीं कर रहा है। आमतौर पर एक सफल डिलीट रिक्वेस्ट के जवाब के रूप में इस्तेमाल किया जाता हैअंतिम वाक्य अत्यधिक बहस योग्य है। उस वाक्य के बिना स्थिति पर विचार करें और समाधान आसान है - बस एक 204 भेजें यदि इकाई मौजूद नहीं है। 404 के बजाय 204 को वापस करने के लिए एक तर्क है, अनुरोध संसाधित किया गया है और कोई भी सामग्री वापस नहीं की गई है! कृपया ध्यान रखें कि, 204 प्रतिक्रिया शरीर में सामग्री की अनुमति नहीं देते हैं

सूत्रों का कहना है

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 1. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


9

यह एक बहुत पुरानी पोस्ट है लेकिन मुझे एक ऐसी ही समस्या का सामना करना पड़ा है और मैं अपना अनुभव आप लोगों के साथ साझा करना चाहूंगा।

मैं बाकी APIs के साथ माइक्रोसॉर्फ़ आर्किटेक्चर का निर्माण कर रहा हूं। मेरे पास कुछ बाकी जीईटी सेवाएं हैं, वे अनुरोध मापदंडों के आधार पर बैक-एंड सिस्टम से डेटा एकत्र करते हैं।

मैंने बाकी एपीआई डिज़ाइन दस्तावेज़ों का पालन किया और मैंने क्लाइंट को एक सही JSON त्रुटि संदेश के साथ HTTP 404 वापस भेजा जब कोई डेटा नहीं था जो क्वेरी शर्तों के लिए संरेखित था (उदाहरण के लिए शून्य रिकॉर्ड चुना गया था)।

जब क्लाइंट के पास वापस भेजने के लिए कोई डेटा नहीं था, तो मैंने "नॉट फाउंड" के कारण के बारे में क्लाइंट को सूचित करने के लिए आंतरिक त्रुटि कोड, आदि के साथ एक परिपूर्ण JSON संदेश तैयार किया और इसे HTTP 404 के साथ क्लाइंट को वापस भेज दिया गया। ठीक काम करता है।

बाद में मैंने एक आराम एपीआई क्लाइंट क्लास बनाया है जो HTTP संचार से संबंधित कोड को छिपाने के लिए एक आसान सहायक है और मैंने अपने कोड से अपने बाकी एपीआई को कॉल करने पर हर समय इस सहायक का उपयोग किया है।

लेकिन मुझे भ्रामक अतिरिक्त कोड लिखने की आवश्यकता थी क्योंकि HTTP 404 में दो अलग-अलग कार्य थे:

  • असली HTTP 404, जब दिए गए url में बाकी API उपलब्ध नहीं है, इसे एप्लिकेशन सर्वर या वेब-सर्वर द्वारा फेंक दिया जाता है, जहां बाकी API एप्लिकेशन चलता है
  • क्लाइंट को HTTP 404 वापस मिल जाता है और जब क्वेरी की स्थिति के आधार पर डेटाबेस में कोई डेटा नहीं होता है।

महत्वपूर्ण: मेरा बाकी एपीआई त्रुटि हैंडलर पकड़ता है सभी अपवाद बैक-एंड सेवा में दिखाई देते हैं जिसका मतलब है कि किसी भी त्रुटि के मामले में मेरा बाकी एपीआई हमेशा संदेश विवरण के साथ एक परिपूर्ण JSON संदेश के साथ लौटता है।

यह मेरे क्लाइंट सहायक विधि का पहला संस्करण है जो दो अलग-अलग HTTP 404 प्रतिक्रिया को संभालता है:

public static String getSomething(final String uuid) {
    String serviceUrl = getServiceUrl();
    String path = "user/" + , uuid);
    String requestUrl = serviceUrl + path;
    String httpMethod = "GET";

    Response response = client
            .target(serviceUrl)
            .path(path)
            .request(ExtendedMediaType.APPLICATION_UTF8)
            .get();

    if (response.getStatus() == Response.Status.OK.getStatusCode()) {
        // HTTP 200
        return response.readEntity(String.class);
    } else {
        // confusing code comes here just because
        // I need to decide the type of HTTP 404...

        // trying to parse response body
        try {
            String responseBody = response.readEntity(String.class);
            ObjectMapper mapper = new ObjectMapper();
            ErrorInfo errorInfo = mapper.readValue(responseBody, ErrorInfo.class);

            // re-throw the original exception
            throw new MyException(errorInfo);

        } catch (IOException e) {
            // this is a real HTTP 404
            throw new ServiceUnavailableError(response, requestUrl, httpMethod);
        }

    // this exception will never be thrown
    throw new Exception("UNEXPECTED ERRORS, BETTER IF YOU DO NOT SEE IT IN THE LOG");
}

लेकिन , क्योंकि मेरा जावा या जावास्क्रिप्ट क्लाइंट दो तरह का HTTP 404 प्राप्त कर सकता है, मुझे किसी तरह HTTP 404 के मामले में प्रतिक्रिया की बॉडी की जांच करने की आवश्यकता है। यदि मैं प्रतिक्रिया निकाय को पार्स कर सकता हूं, तो मुझे यकीन है कि मुझे एक प्रतिक्रिया वापस मिल गई है, जहां था ग्राहक को वापस भेजने के लिए कोई डेटा नहीं।

यदि मैं उस प्रतिक्रिया को पार्स नहीं कर पा रहा हूं, जिसका अर्थ है कि मुझे वेब सर्वर से एक वास्तविक HTTP 404 मिला है (बाकी एपीआई एप्लिकेशन से नहीं)।

यह बहुत भ्रामक है और क्लाइंट एप्लिकेशन को HTTP 404 के वास्तविक कारण की जांच करने के लिए हमेशा अतिरिक्त पार्सिंग करने की आवश्यकता होती है।

ईमानदारी से मुझे यह समाधान पसंद नहीं है। यह भ्रामक है, ग्राहकों को हर समय अतिरिक्त बकवास कोड जोड़ने की आवश्यकता है।

इसलिए मैंने इस दो अलग-अलग परिदृश्यों में HTTP 404 का उपयोग करने के बजाय यह निर्णय लिया कि मैं निम्नलिखित कार्य करूंगा:

  • मैं अपने बाकी एप्लिकेशन में अब HTTP 404 को एक प्रतिक्रिया HTTP कोड के रूप में उपयोग नहीं कर रहा हूं।
  • मैं HTTP 404 के बजाय HTTP 204 (नो कंटेंट) का उपयोग करने जा रहा हूं।

उस स्थिति में क्लाइंट कोड अधिक सुरुचिपूर्ण हो सकता है:

public static String getString(final String processId, final String key) {
    String serviceUrl = getServiceUrl();
    String path = String.format("key/%s", key);
    String requestUrl = serviceUrl + path;
    String httpMethod = "GET";

    log(requestUrl);

    Response response = client
            .target(serviceUrl)
            .path(path)
            .request(ExtendedMediaType.APPLICATION_JSON_UTF8)
            .header(CustomHttpHeader.PROCESS_ID, processId)
            .get();

    if (response.getStatus() == Response.Status.OK.getStatusCode()) {
        return response.readEntity(String.class);
    } else {
        String body = response.readEntity(String.class);
        ObjectMapper mapper = new ObjectMapper();
        ErrorInfo errorInfo = mapper.readValue(body, ErrorInfo.class);
        throw new MyException(errorInfo);
    }

    throw new AnyServerError(response, requestUrl, httpMethod);
}

मुझे लगता है कि यह इस मुद्दे को बेहतर तरीके से संभालता है।

यदि आपके पास कोई बेहतर उपाय है तो कृपया हमारे साथ साझा करें।


अपाचे HttpClient तरीकों ने एक 204 प्रतिक्रिया पर अपवाद नहीं फेंका। यदि आपका ग्राहक व्यावसायिक वस्तुओं (मॉडल) का उत्तर देता है, तो यह अशक्त हो जाएगा। काम करता है, लेकिन अंतिम उपयोगकर्ताओं के लिए 204 स्थिति का पता लगाना मुश्किल है।
क्रिसिनटाउन

यह सब अच्छा है, लेकिन एक सवाल यह है: यदि आप 404 के लिए बयान करते हैं तो कितनी बार लिखते हैं? और यह क्या होगा? दूसरी ओर, यदि आप एपी को कॉल करते हैं, जो कि संभावित 404 को त्रुटि के साथ परिभाषित करता है, तो आप इसे केवल इस मामले के लिए संभाल सकते हैं।
अधिकतम

zappee मैं आपसे सहमत हूँ। मेरे पास एक सेवा है जो डेटा लौटाती है। लेकिन ऐसी स्थितियां हैं जहां डेटा टूट गया है। अनुरोध URL सही है (इसलिए 404 नहीं), लेकिन यह वास्तव में एक तर्क त्रुटि (500) नहीं है, इसलिए 204 सबसे उपयुक्त लगता है। यह वास्तव में एक संदेश शरीर की कमी के बारे में गुस्सा है। हालांकि यकीनन मैं एक हैडर में एक कारण डाल सकता हूं।
cs94njw

6

यह पुराना लेकिन उत्कृष्ट लेख ... http://www.infoq.com/articles/webber-rest-workflow इसके बारे में यही कहता है ...

404 नहीं मिला - यह सेवा हमें एक वास्तविक कारण बताने के लिए बहुत अधिक आलसी (या सुरक्षित) है कि हमारा अनुरोध क्यों विफल रहा, लेकिन कारण जो भी हो, हमें इससे निपटने की आवश्यकता है।


1

यूनिफ़ॉर्म रिसोर्स आइडेंटिफ़ायर संसाधन के लिए एक अनूठा सूचक है। एक खराब फॉर्म URI संसाधन की ओर इशारा नहीं करता है और इसलिए उस पर GET का प्रदर्शन करने से संसाधन वापस नहीं आएगा। 404 का अर्थ है कि सर्वर को अनुरोध-यूआरआई से मेल खाते हुए कुछ भी नहीं मिला है। यदि आप गलत यूआरआई या खराब यूआरआई में डालते हैं जो आपकी समस्या है और इसका कारण आपको एक संसाधन नहीं मिला है चाहे वह HTML पृष्ठ हो या आईएमजी।


0

इस परिदृश्य के लिए HTTP 404 REST API से प्रतिक्रिया के लिए प्रतिक्रिया कोड है जैसे 400, 401, 404, 422 अप्राप्य इकाई

पूर्ण अपवाद संदेश की जांच करने के लिए अपवाद हैंडलिंग का उपयोग करें।

try{
  // call the rest api
} catch(RestClientException e) {
     //process exception
     if(e instanceof HttpStatusCodeException){
        String responseText=((HttpStatusCodeException)e).getResponseBodyAsString();
         //now you have the response, construct json from it, and extract the errors
         System.out.println("Exception :" +responseText);
     }

}

यह अपवाद ब्लॉक आपको REST API द्वारा फेंका गया उचित संदेश देता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.