यदि अनुरोध आवश्यक पैरामीटर गुम है, तो मुझे HTTP स्थिति प्रतिक्रिया कोड का क्या उपयोग करना चाहिए?


जवाबों:


387

स्थिति 422 युक्ति के आधार पर सबसे अधिक उपयुक्त लगती है ।

422 (Unprocessable Entity) स्थिति कोड का अर्थ है कि सर्वर अनुरोध इकाई की सामग्री प्रकार को समझता है (इसलिए 415 (असमर्थित मीडिया प्रकार) स्थिति कोड अनुचित है), और अनुरोध इकाई का सिंटैक्स सही है (इस प्रकार 400 (खराब अनुरोध) ) स्थिति कोड अनुचित है) लेकिन निहित निर्देशों को संसाधित करने में असमर्थ था। उदाहरण के लिए, यह त्रुटि स्थिति तब हो सकती है जब किसी XML अनुरोध बॉडी में अच्छी तरह से गठित (यानी, वाक्यविन्यास रूप से सही) हो, लेकिन शब्दार्थ गलत, XML निर्देश।

वे कहते हैं कि विकृत xml खराब सिंटैक्स (400 के लिए कॉल) का एक उदाहरण है। एक विकृत क्वेरी स्ट्रिंग इस के अनुरूप है, इसलिए 400 एक अच्छी तरह से निर्मित क्वेरी-स्ट्रिंग के लिए उपयुक्त नहीं लगता है जो एक परम को याद कर रहा है।

UPDATE @DavidV सही ढंग से बताता है कि यह युक्ति WebDAV के लिए है, कोर HTTP नहीं। लेकिन कुछ लोकप्रिय गैर-WebDAV API बेहतर स्थिति कोड की कमी (इसे देखें ) के लिए, वैसे भी 422 का उपयोग कर रहे हैं ।


2
IMO मैं इसका उपयोग तब करूंगा जब क्वेरी स्ट्रिंग में मान गलत था, तब नहीं जब कोई अतिरिक्त मान या कोई अनुपलब्ध मान था। अर्थात। एक ई-मेल की अपेक्षा करना और उसका मूल्य '123123' है
डेरेक

2
मैं URL पथ के विधि हस्ताक्षर के रूप में एक GET और POST मापदंडों के बारे में सोचता हूं, इसलिए 404 मेरे लिए समझ में आता है। सार्वजनिक उपभोग के लिए एक मूल्यवान एपीआई में अनुपस्थित / अतिरिक्त मापदंडों को लौटाना समझदारी है। किसी URL के संदर्भ में क्वेरी स्ट्रिंग पैरामीटर आमतौर पर किसी संसाधन की पहचान करने के लिए महत्वपूर्ण होते हैं और अतिरिक्त या अनुपलब्ध पैरामीटर एक ऐसे संसाधन का प्रतिनिधित्व करते हैं जो बिना किसी धारणा के मौजूद नहीं है। बेशक, स्पष्ट होने से मजबूती के साथ व्यापार उतार-चढ़ाव होते हैं, और वैकल्पिक पैरामीटर एक संसाधन को संभावित रूप से मौन त्रुटि के लिए असुरक्षित बनाते हैं। फिर प्रयोज्यता है ...
डेरेक लिट्ज

13
निर्दिष्ट संदर्भ WebDAV के लिए है, और HTTP मानक युक्ति नहीं है।
डेविड वी

1
@ केल्विन उस ब्लॉग पोस्ट को इंगित करने के लिए धन्यवाद। यह देखना उपयोगी है कि ट्विटर, उदाहरण के लिए, 422 का उपयोग कर रहा है। मुझे लगता है कि उत्तर बेहतर हो सकता है यदि आप स्पष्ट करते हैं कि कल्पना पहली पंक्ति में WebDAV है। जब मैंने आपका उत्तर पहली बार पढ़ा तो मुझे लगा कि लिंक का अनुसरण करने तक आपके पास HTTP मानक युक्ति है।
डेविड वी।

3
यह एक पढ़ने के लायक है: bennadel.com/blog/… मैं लापता पैरा के लिए 422 का उपयोग नहीं करूंगा। मुझे लगता 400है कि अधिक उपयुक्त है।
ज़ेल्फिर कल्टस्टाहल

184

मुझे यकीन नहीं है कि एक सेट मानक है, लेकिन मैंने 400 खराब अनुरोध का उपयोग किया होगा , जो नवीनतम HTTP कल्पना (2014 से) दस्तावेज़ निम्नानुसार हैं :

6.5.1। 400 गलत अनुरोध

400 (खराब अनुरोध) स्थिति कोड इंगित करता है कि सर्वर क्लाइंट त्रुटि के कारण होने वाली चीज़ के कारण अनुरोध को संसाधित नहीं कर सकता है या नहीं करेगा (उदाहरण के लिए, विकृत अनुरोध वाक्यविन्यास, अमान्य अनुरोध संदेश फ़्रेमिंग, या भ्रामक अनुरोध रूटिंग)।


65
400 Bad Requestप्रोटोकॉल स्तर की समस्याओं को इंगित करने के लिए है, शब्दार्थ त्रुटियाँ नहीं। यदि हम एप्लिकेशन-स्तर (प्रोटोकॉल-स्तर की बजाय) त्रुटियों को इंगित करने के लिए HTTP स्थिति कोडों को हाईजैक करने जा रहे हैं, तो सभी तरह से क्यों न जाएं और बस उपयोग करें 412?
मैट ज़ुकोवस्की

36
Google का OAuth 1.0 कार्यान्वयन इस उत्तर से सहमत है। 400 जवाब तब दिए जाते हैं जब POST पैरामीटर गायब या असमर्थित होते हैं: code.google.com/apis/accounts/docs/OAuth_ref.html
टॉम

1
@ मैट-ज़ुकोव्स्की: "412: सर्वर पर परीक्षण किए जाने पर अनुरोध-हेडर फ़ील्ड में से एक या अधिक में दिए गए पूर्व-निर्धारण का गलत मूल्यांकन किया गया।" से RFC2616 - यदि यह एक पोस्ट है, मानकों अनुरोध शरीर और नहीं अनुरोध हेडर क्षेत्रों में हैं। तकनीकी रूप से, GET विधि अनुरोध-हेडर में पैरामीटर भेजती है, लेकिन मैं इसके बजाय कुछ निरंतरता रखना चाहूंगा?
टोंग

6
@MattZukowski 400 एक एप्लीकेशन लेवल स्टेटस कोड है। यदि आप RFC 7231 के ड्राफ्ट संस्करण में रीवॉर्डिंग को देखते हैं तो आप देखेंगे। दुर्भाग्य से, नवीनतम संस्करण में शब्दांकन इतना स्पष्ट नहीं है क्योंकि नवीनतम परिवर्तनों के लेखक ने 422 का आविष्कार भी किया था।
डारेल मिलर

9
@DarrelMiller सही है ( सीधा लिंक ): "400 (खराब अनुरोध) स्थिति कोड इंगित करता है कि सर्वर किसी क्लाइंट त्रुटि के कारण होने वाली चीज़ के कारण अनुरोध को संसाधित नहीं कर सकता है या नहीं करेगा (उदाहरण के लिए, विकृत अनुरोध वाक्यविन्यास, अमान्य अनुरोध संदेश) तैयार, या भ्रामक अनुरोध रूटिंग)। " सिमेंटिक्स और एक्स्टेंसिबिलिटी अपेक्षाओं के आधार पर (क्या पैरामीटर के बिना एक अनुरोध जारी करना एक दिन संभव होगा?) तब केवल 400 और 404 मानक HTTP में उचित लगते हैं। और, अपने एपीआई के लिए एक नया कोड का आविष्कार करें, लेकिन शब्दार्थ को अधिभार न डालें।
tne

31

WCF एपीआई नेट हैंडल में एक वापस लौट कर पैरामीटर मौजूद नहीं HTTP 404"Endpoint नहीं मिला" त्रुटि, का उपयोग करते समय WebHttpBinding

404 Not Foundयदि आप अपने पैरामीटर हस्ताक्षर के साथ एक साथ अपने वेब सेवा विधि नाम पर विचार मतलब कर सकते हैं। यही है, यदि आप एक वेब सेवा विधि को उजागर करते हैं LoginUser(string, string)और आप अनुरोध करते हैं LoginUser(string), तो उत्तरार्द्ध नहीं मिला है।

मूल रूप से इसका मतलब यह होगा कि आपके द्वारा निर्दिष्ट वेब सेवा पद्धति, आपके द्वारा निर्दिष्ट पैरामीटर हस्ताक्षर के साथ नहीं मिल सकती है।

10.4.5 404 नहीं मिला

सर्वर को अनुरोध-यूआरआई से मेल खाते हुए कुछ भी नहीं मिला है। कोई संकेत नहीं दिया जाता है कि क्या स्थिति अस्थायी या स्थायी है।

400 Bad Request, के रूप में गर्ट सुझाव दिया , एक वैध प्रतिक्रिया कोड बनी हुई है, लेकिन मैं इसे सामान्य रूप से निचले स्तर की समस्याओं को इंगित करने के लिए किया जाता है लगता है। इसे आसानी से एक विकृत HTTP अनुरोध के रूप में व्याख्या किया जा सकता है, शायद गुम या अमान्य HTTP हेडर, या समान।

10.4.1 400 खराब अनुरोध

अनुरोध सर्वर द्वारा विकृत सिंटैक्स के कारण समझा नहीं जा सका। ग्राहक बिना संशोधनों के अनुरोध को नहीं दोहराएगा।


यह CherryPy डिफ़ॉल्ट रूप से क्या करता है।
डेरेक लित्ज़

जब आप किसी मॉडल को स्वीकार कर रहे हैं और मॉडल का एक हिस्सा गायब है, तो पोस्ट अनुरोध को संभालने के बारे में क्या है? उस स्थिति में आपको 404 नहीं मिलते हैं। इसके बजाय आपको एक मॉडल मिलता है जो कि मान्य नहीं है यदि मैं गलत नहीं हूँ और आपको यह तय करना है कि अब क्या करना है।
शेन कोर्ट्रेल

1
यह व्याख्या एक खिंचाव की तरह लगती है, और REST pov के बजाय RPC को व्यक्त करती है। यूआरआई पहचानकर्ता है, और यह मौजूद है और पाया गया है। शरीर में जो भेजा जाता है वह संसाधन पहचानकर्ता का हिस्सा नहीं है। 422 अधिक उपयुक्त है।
जोनाह

404 सही उत्तर है, सर्वसम्मति खोजने के लिए वेब पर कुछ यूआरएल संपादित करें!
जेंसन-बटन-इवेंट

8

आप 400 खराब अनुरोध कोड भेज सकते हैं। यह अधिक सामान्य-उद्देश्य 4xx स्टेटस कोड में से एक है, इसलिए आप इसका उपयोग उस उद्देश्य के लिए कर सकते हैं जो आप चाहते हैं: ग्राहक एक अनुरोध भेज रहा है जो जानकारी / पैरामीटर को गायब कर रहा है जिसे आपके एप्लिकेशन को सही ढंग से संसाधित करने के लिए आवश्यक है।


7

हमारे एपीआई प्रोजेक्ट में से एक में हम कुछ अनुरोधों के लिए 409 स्टेटस तय करते हैं, जब हम लापता पैरामीटर के कारण इसे 100% पर नहीं भर सकते।

HTTP स्थिति कोड "409 संघर्ष" हमारे लिए एक अच्छी कोशिश थी क्योंकि परिभाषा के लिए उपयोगकर्ता के लिए संघर्ष के स्रोत को पहचानने के लिए पर्याप्त जानकारी शामिल करना आवश्यक है।

संदर्भ: w3.org/Protocols/

तो 400 या 404 जैसी अन्य प्रतिक्रिया के बीच, हमने नए और सही अनुरोध को स्थापित करने के लिए सहायक अनुरोध में कुछ नोटों की तलाश की आवश्यकता को लागू करने के लिए 409 को चुना।

किसी भी तरह से हमारा मामला यह विशेष था क्योंकि हमें अनुरोध पूरी तरह से सही नहीं होने पर कुछ डेटा पूर्व संध्या पर भेजने की आवश्यकता है, और हमें क्लाइंट को संदेश को देखने और समझने की आवश्यकता है कि अनुरोध में क्या गलत था।

सामान्य तौर पर अगर हमारे पास केवल कुछ लापता पैरामीटर हैं तो हम 400 और लापता पैरामीटर की एक सरणी के लिए जाते हैं। लेकिन जब हमें कुछ और जानकारी भेजने की आवश्यकता होती है, जैसे किसी विशेष मामले का संदेश और हम यह सुनिश्चित करना चाहते हैं कि ग्राहक इसका ख्याल रखेगा तो हम 409 भेजेंगे।


2
यह सादा गलत है। 409 समसामयिक मुद्दों के लिए है क्योंकि @ MaximeGélinas इंगित करता है या ऐसी परिस्थितियाँ जहाँ कोई संसाधन पहले से मौजूद है और डुप्लिकेट की अनुमति नहीं है।
जिमीकैल

प्रति कल्पना, "409 (संघर्ष) स्थिति कोड इंगित करता है कि लक्ष्य संसाधन की वर्तमान स्थिति के साथ संघर्ष के कारण अनुरोध पूरा नहीं किया जा सका।" । एक लापता पैरामीटर के लिए इसका उपयोग करना गलत है; यह बिल्कुल अलग तरह की त्रुटि है।
मार्क अमेरी

5

मैं आमतौर पर 422 (अनप्रोसेबल इकाई) के लिए जाता हूं यदि आवश्यक पैरामीटर में कुछ भी मेल नहीं खाता है जो एपीआई एंडपॉइंट की आवश्यकता है (जैसे कि एक बहुत छोटा पासवर्ड) लेकिन एक लापता पैरामीटर के लिए मैं 406 (अस्वीकार्य) के लिए जाऊंगा।


8
ठीक है, 406 अस्वीकार्य हैड हेडर के साथ प्रयोग किया जाता है (यदि सर्वर रिस्पांस नहीं भेज सकता है तो क्लाइंट समझ जाएगा)। "अनुरोध द्वारा पहचाना गया संसाधन केवल प्रतिक्रिया देने वाली संस्थाओं को उत्पन्न करने में सक्षम है जिनके पास अनुरोध में भेजे गए हेडर के अनुसार सामग्री विशेषताएँ स्वीकार्य नहीं हैं।" । मैं 422 के साथ फंस गया हूं क्योंकि वर्तमान विनिर्देश के साथ कोई "सही" विकल्प नहीं है: - /
JakubKnejzlik

इसके लिए 406 का उपयोग करना गलत है। 406 कोड का मतलब यह नहीं है कि अनुरोध स्वीकार्य नहीं था; इसका मतलब है कि आप अनुरोध को पूरा नहीं कर सकते क्योंकि आप जो प्रतिक्रियाएं दे सकते हैं, वे हैं जो ग्राहक को अस्वीकार्य लगती हैं, यह अनुरोध में भेजे गए हेडर के आधार पर होती है। (उदाहरण के लिए, इसमें शामिल अनुरोध Accept-Language: de, यह दर्शाता है कि यह केवल जर्मन में प्रतिक्रियाओं को स्वीकार करेगा, लेकिन आपके सर्वर के पास उपलब्ध दस्तावेज़ के केवल संस्करण अंग्रेजी या फ्रेंच में हैं।) अनुरोध में लापता पैरामीटर को इंगित करने के लिए इसका उपयोग करना गलत है। प्रति परिभाषा में।
मार्क अमेरी

3

रुचि रखने वालों के लिए, स्प्रिंग एमवीसी (3.x कम से कम) इस मामले में 400 लौटाता है, जो मुझे गलत लगता है।

मैंने कई Google URL (accounts.google.com) का परीक्षण किया और आवश्यक पैरामीटर हटा दिए, और वे इस मामले में आम तौर पर 404 वापस करते हैं।

मैं Google को कॉपी करूंगा।


18
क्योंकि Google ऐसा नहीं करता है, इसका मतलब यह नहीं है कि Google इसे सही करता है!
आरवी

4
मैं सहमत हूं, जरूरी नहीं कि 'सही' हो लेकिन कभी-कभी क्या सही है और क्या समझदार, दो अलग-अलग चीजें हैं। किसी भी तरह .. पाठक के लिए :)
Neromancer 15

कुछ Google API 400 लौटाते हैं, जैसे github.com/google/google-api-nodejs-client/issues/404
डेनिस

जो गलत है (और क्यों स्प्रिंग mvc jax-rs अनुरूप नहीं है)
जेन्सन-बटन-घटना

3

यह तर्क दिया जा सकता है कि एक 404 Not Foundका उपयोग किया जाना चाहिए क्योंकि निर्दिष्ट संसाधन नहीं मिल सकता है।


3
यह जावा JAX-RS का डिफ़ॉल्ट व्यवहार है जब क्वेरी पैरामीटर को उचित डेटाटाइप में परिवर्तित नहीं किया जा सकता है। मैं हालांकि इसके साथ सहमत नहीं हूँ। संसाधन WAS पाया गया: क्वेरी पैरामीटर संसाधन को फ़िल्टर करने के लिए हैं और फ़िल्टर में से एक को अस्वीकार्य मान के साथ आपूर्ति की गई थी। मुझे लगता है कि यह 422 अनप्रोसेबल एंटिटी निकटतम और 400 बैड रिक्वेस्ट दूसरे निकटतम से मेल खाता है।
रयान

इसका सही व्यवहार क्योंकि jax-rs का डिफ़ॉल्ट व्यवहार!
जेन्सन-बटन-इवेंट

404 का उपयोग करना उचित है जब क्वेरी स्ट्रिंग पैरामीटर किसी संसाधन की पहचान करने के लिए होता है, तो एक मान दिया गया था, लेकिन यह मान उस संसाधन के अनुरूप नहीं है - उदाहरण के लिए, यदि आप example.com/show-user का अनुरोध कर रहे हैं -प्रोफाइल? user_id = 123 और उपयोगकर्ता 123 मौजूद नहीं है। लेकिन इस सवाल के बारे में यह नहीं पूछा गया है; यह उस परिदृश्य के बारे में था जहां एक आवश्यक पैरामीटर पूरी तरह से छोड़ा गया है। मैं यह नहीं देखता कि कैसे निर्दिष्ट संसाधन से मेल नहीं खाता।
मार्क अमेरी

2

मैं अक्सर 403 निषिद्ध त्रुटि का उपयोग करता हूं। तर्क यह है कि अनुरोध को समझा गया था, लेकिन मैं ऐसा नहीं करूंगा जैसा कि पूछा गया है (क्योंकि चीजें गलत हैं)। प्रतिक्रिया इकाई बताती है कि क्या गलत है, इसलिए यदि प्रतिक्रिया HTML पृष्ठ है, तो पृष्ठ में त्रुटि संदेश हैं। यदि यह JSON या XML प्रतिक्रिया है, तो त्रुटि जानकारी वहां है।

से rfc2616 :

10.4.4 403 निषिद्ध

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


4
शुरू में अच्छा लगता है, हालांकि मैं स्वाभाविक रूप से इसे प्रमाणीकरण या अनुमति आधारित त्रुटियों के साथ जोड़ूंगा। इसके अलावा, कल्पना इस ओर संकेत करती है कि यह कहाँ कहता है "यदि सर्वर ग्राहक को यह जानकारी उपलब्ध नहीं करना चाहता है"। यह भी कि 404 एक बेहतर विकल्प हो सकता है। मैं 404 या 400 एक 403 से की दिशा में सिर था
tonyhb

21
यह एक भयानक विचार है, भले ही तकनीकी रूप से ध्वनि हो। 403 सार्वभौमिक विफलता प्रतिक्रियाओं के लिए उपयोग किया जाता है, और यदि आप पैरामीटर त्रुटियों को इंगित करने के लिए इसका उपयोग करने का प्रयास करते हैं, तो आप अपने ग्राहकों से नरक को भ्रमित करेंगे। उदाहरण के लिए ट्विटर ऐसा करता है - 403 का उपयोग तब किया जाता है जब आप अमान्य OAuth क्रेडेंशियल प्रदान करते हैं, और जब आपके अनुरोध के साथ कुछ गलत होता है - और यह API क्लाइंट के लिए भ्रम का एक निरंतर स्रोत है।
मैट ज़ुकोव्स्की

1
@MattZukowski अच्छी तरह से सिर्फ गलत है। युक्ति कहती है Authorization will not help, इसलिए ट्विटर को अमान्य OAuth क्रेडेंशियल्स के लिए यह नहीं भेजना चाहिए।
टोरविन

@torvin ट्विटर को 401 Unauthorizedइसके बजाय भेजना चाहिए । हालाँकि, आप समझ सकते हैं कि यदि आप एमडीएन डॉक्स के इन दोनों कोडों के विवरणों को देखते हैं तो वे क्यों नहीं करते हैं, जो बहुत समान हैं।
एजी हैमरथिफ़ जूल

-1

ASP.NET Core को एक संदर्भ या उदाहरण के रूप में उपयोग करने के लिए, ASP.NET Core आपको कंट्रोलर को क्रियाओं से रूबरू कराता है, इस प्रकार “विवरण” एक्शन दिखता है।

    // GET: Cars/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
        if (car == null)
        {
            return NotFound();
        }

        return View(car);
    }

यदि पैरामीटर idसेट नहीं है, तो यह 404 रिटर्न नहीं मिला।


-5

404 लौटाएँ - जिसका अर्थ है कि संसाधन नहीं मिला।

किसी ऐसी साइट के URL को संपादित करने का प्रयास करें जिसमें एक आईडी हो। मैंने कुछ कोशिश की:

  • gitub रेपो मुद्दा
  • संगम पृष्ठ
  • अमेज़न उत्पाद देखें
  • ईबे लिस्टिंग
  • बीबीसी समाचार लेख

सभी 404 लौटाते हैं, क्योंकि वे डेवलपर्स मानक की सही ढंग से व्याख्या कर रहे हैं, जिसका उत्तर यहां और कई अन्य हैं, नहीं!


1
मेरा मानना ​​है कि अधिकांश देवता "पैरामीटर" को एक क्वेरी स्ट्रिंग में नाम / मूल्य जोड़े के रूप में परिभाषित करते हैं या POST बॉडी बनाते हैं। Github रेपो समस्या अनुरोध में यह शामिल नहीं है।
केल्विन

@ केल्विन हम देवों को भी सूची में पथ पैरामीटर शामिल करते हैं। यदि कोई url पैरामीटर अनिवार्य है, एक संसाधन के स्थान का प्रतिनिधित्व करता है और इसमें शामिल नहीं है, तो 404 वापस किया जाना चाहिए। यह बाहर रखा गया है requestBody
जेंसन-बटन-इवेंट

-6

मैं 403 के साथ जाऊंगा।

से RFC 2616 - हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल - HTTP / 1.1

403 निषिद्ध

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

आपको अपनी प्रतिक्रिया में विफलता का कारण बताना चाहिए। यदि आप इसे नहीं करना पसंद करते हैं, तो बस 404 का उपयोग करें।


3
नीचा दिखाया क्योंकि यह एक डुप्लिकेट उत्तर है। अपने नवीनतम वाक्य को पुराने उत्तर के लिए एक टिप्पणी के रूप में जोड़ने पर विचार करें जो
उपयोगकर्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.