क्या JSON API से HTML वापस करना ठीक है?


25

अपनी वर्तमान परियोजना पर, मैं एक ऐसी सेवा के कार्यान्वयन के लिए जिम्मेदार हूं जिसमें नव निर्मित रेस्टफुल एपीआई की खपत शामिल है, जिसे केवल JSON का समर्थन करने के रूप में प्रलेखित किया गया है।

क्लाइंट लगातार 'एप्लीकेशन / जॉन्स' के हेडर और कंटेंट-टाइप 'एप्लीकेशन / जेसन' के एक्सेप्ट हेडर के साथ रिक्वेस्ट करता है। हालाँकि कुछ एंडपॉइंट्स HTML-के एक कंटेंट-टाइप, यहां तक ​​कि HTML बॉडी के साथ प्रतिक्रिया भेजते हैं। मेरे लिए यह स्पष्ट रूप से गलत दृष्टिकोण है और इसे कभी भी उचित नहीं ठहराया जा सकता है।

परियोजना के दौरान यह एक ही अभ्यास दो अलग-अलग विक्रेताओं और दो अलग-अलग सेवाओं में लागू किया गया है। मैंने खुद को यह बताना चाहा कि सेवाओं को बदलने की आवश्यकता क्यों है। विक्रेताओं ने कहा कि ग्राहक को इसके साथ सामना करना चाहिए और यहां तक ​​कि मेरी पसंद की REST लाइब्रेरी (रेस्टएसी) पर भी सवाल उठाया गया है क्योंकि यह डिफ़ॉल्ट रूप से 'बॉक्स आउट' से सामना नहीं करता है।

यह हताशा का एक प्रमुख बिंदु रहा है। मुझे अपने तर्क का समर्थन करने के लिए कई संदर्भ नहीं मिल रहे हैं, मुझे लगता है कि ऐसा इसलिए है क्योंकि यह बिंदु बहुत ही स्पष्ट है।

सवाल यह है कि क्या मुझे कुछ याद आ रहा है? क्या मुझे इस बारे में पांडित्य है? क्या JSON API होना ठीक है, जिसमें इस परिदृश्य में एप्लिकेशन / json की सामग्री-प्रकार नहीं है? संदर्भ की सराहना की जाएगी। आप वाणिज्यिक दृष्टिकोण से इस स्थिति को कैसे हल करते हैं?


1
संदर्भ-प्रकार से क्या आपका मतलब सामग्री-प्रकार HTTP हेडर से है?
मार्जन वेंमा

हां मैं HTTP कंटेंट-टाइप हेडर की बात कर रहा हूं। संपादित।
phillip.darley

खैर, कम से कम उन्हें HTML JEST API होने पर इसे "JSON REST API" नहीं कहना चाहिए।
बरगी

जवाबों:


28

जब आप acceptकिसी विशिष्ट मीडिया प्रकार का अनुरोध करने वाले हेडर भेज रहे हैं , तो सर्वर को कुछ और वापस नहीं भेजना चाहिए, और निश्चित रूप से 200 ओके स्टेटस कोड के साथ नहीं।

Restpatterns.org से :

यदि कोई स्वीकार्य हेडर फ़ील्ड मौजूद नहीं है, तो यह माना जाता है कि क्लाइंट सभी मीडिया प्रकारों को स्वीकार करता है। यदि एक स्वीकार शीर्षक फ़ील्ड मौजूद है, और यदि सर्वर एक प्रतिक्रिया नहीं भेज सकता है जो संयुक्त स्वीकार फ़ील्ड मान के अनुसार स्वीकार्य है, तो सर्वर SHOULD 406 (स्वीकार्य नहीं) प्रतिक्रिया भेजें।

(जोर मेरा)

Restpatterns.org इसे वास्तविक HTTP मानक से ले जाता है: हेडर फ़ील्ड परिभाषाएँ - स्वीकार करें

संक्षेप में: आप पांडित्यपूर्ण नहीं हैं। यदि वे एचटीएमएल वापस कर रहे हैं तो एचटीटीपी मानक का पालन नहीं कर रहे हैं जब स्वीकार हैडर विशेष रूप से उन्हें वापस जाने के लिए कहता है application/jsonऔर कुछ नहीं।


1
+1। मैं इस उत्तर से सहमत हूं, लेकिन दुख की बात है कि शब्द shouldका उपयोग HTTP विशिष्टताओं में बार-बार किया जाता है। हमें उन शब्दों को बदलने के लिए एक ऑनलाइन याचिका शुरू करनी होगी must
अभिकेन्द्र

3
@MarjanVenema "को" सही होना चाहिए क्योंकि उसी rfc से धारा 10 में एक नोट है: "HTTP / 1.1 सर्वरों को उन प्रतिक्रियाओं को वापस करने की अनुमति है जो अनुरोध में भेजे गए हेडर के अनुसार स्वीकार्य नहीं हैं। कुछ मामलों में, यह कुछ मामलों में भी हो सकता है।" 406 प्रतिसाद भेजने के लिए बेहतर होगा। "
imel96

1
यदि एक ग्राहक एक ऐसे संसाधन का अनुरोध करता है, जिसमें वास्तव में JSON प्रतिनिधित्व नहीं है, तो कोई फर्क नहीं पड़ता कि वे JSON कितना चाहते हैं, वे शायद कुछ और प्राप्त करने से बेहतर हैं जो निश्चित है; आपको 406 प्राप्त करने की गारंटी नहीं है। यह महत्वपूर्ण है कि सर्वर को यह वर्णन करना चाहिए कि वास्तव में प्रतिक्रिया का सामग्री प्रकार क्या है।
डोनल फैलो

6
@ डोनल फेलो: नहीं, वे वास्तव में मामला क्या है, इसकी जानकारी होने से बेहतर होगा। सर्वर को केवल कुछ भी वापस नहीं भेजना चाहिए जो उसे उपयुक्त लगता है, लेकिन मानक में बताए अनुसार 406 नहीं स्वीकार्य प्रतिक्रिया भेजें। ध्यान रखें कि जब क्लाइंट विशेष रूप से मीडिया प्रकार का अनुरोध करता है और किसी भी प्रकार की कमियां निर्दिष्ट नहीं करता है, तो संभवतः किसी अन्य मीडिया प्रकार के प्रसंस्करण का कोई तरीका नहीं है।
मार्जन वेंमा

2
@ imel96: यह तथ्य कि इंटरनेट कभी भी सख्त नहीं रहा है, विभिन्न ब्राउज़रों का समर्थन करने के लिए और सर्वरों को अब गैर-वैध HTML के साथ संगत बने रहने के लिए मजबूर करने में भिन्नता पैदा हुई है, क्योंकि वहां अभी भी बहुत कुछ है। (और यह दुर्भाग्य से अभी भी बनाया जा रहा है)।
मार्जन वेनमा

9

"RESTful JSON API" से आपका क्या तात्पर्य है - मुझे लगता है कि यहां पहला मुद्दा यह है कि आप अवधारणाओं (या संभवत: आपके और आपके तकनीकी समकक्षों के बीच आपके "आपूर्तिकर्ताओं" से मिल रहे हैं)।

एक RESTful API (चाहे आप स्तर 1 पर वास्तव में आराम नहीं कर रहे हों या स्तर 3 या उससे ऊपर cf http://martinfowler.com/articles/richardsonMaturityModel.html पर कुछ ऐसा हो ) जिस तरह से आप एपीआई के बारे में बातचीत करते हैं। से भेजी या प्राप्त की गई सामग्री का प्रारूप। इसके प्रोटोकॉल या परिवहन तंत्र के बारे में भी नहीं ...

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

HTTP पर चलने वाला एक अच्छा एपीआई (यह मानने के लिए उचित है कि जिस संदर्भ में आप HTTP पर एपीआई के बारे में बात कर रहे हैं) आपको विभिन्न स्वरूपों में सामग्री का अनुरोध करने की अनुमति देनी चाहिए और उन प्रारूपों (और संभवतः चाहिए) में HTML के साथ-साथ शामिल होना चाहिए। JSON और XML। क्यूं कर? वैसे यह एपीआई को सीखना बहुत आसान बना देगा, वैचारिक रूप से यह जो भी उद्देश्य और इतने पर के लिए एक तत्काल ब्राउज़र आधारित यूएक्स प्रदान करता है ...

दिलचस्प सवाल तब बन जाता है यदि मेरा एपीआई, जो विभिन्न प्रकार के सामग्री प्रारूपों का समर्थन करता है, को यह बताए बिना कहा जाता है कि ग्राहक किस प्रारूप की अपेक्षा करता है तो उसे किस प्रारूप में लौटना चाहिए ...? यह एक धार्मिक तर्क की ओर जाता है - लेकिन एचटीएमएल प्रदाता को सहायक जानकारी (जैसे "सामग्री स्वीकार हेडर सेट करने के लिए याद रखें) सहित विकल्प प्रदान करता है।"

एक एपीआई के सवाल का जवाब देने के लिए, एक वह जो बेचैन है और एक वह जो जसन का समर्थन करता है, अगर वह अनुरोधित सामग्री है तो वह HTML को वापस करने में सक्षम होना चाहिए।


1
मैं आपके दोनों बिंदु लेता हूं और उसी के अनुसार अपना प्रश्न संपादित करता हूं। यह तथ्य कि सेवा Restful प्रासंगिक नहीं है और मैंने विस्तृत किया है कि ग्राहक प्रत्येक अनुरोध में 'आवेदन / json' स्वीकार करता है।
phillip.darley

मैं कहूंगा कि "RESTful JSON API" का बहुत स्पष्ट अर्थ है।
gnasher729

1
मैं कहूंगा कि मेरे शिक्षकों ने यह सुनिश्चित करने के लिए बहुत प्रयास किया कि हम यह समझें कि क्यों "कभी नहीं मानें" एक अच्छा प्रोग्रामर होने का एक महत्वपूर्ण हिस्सा था
मर्फ़

5

क्लाइंट लगातार 'एप्लीकेशन / जॉन्स' के एक्सेप्ट हेडर और 'एप्लीकेशन / जसन' के कंटेंट-टाइप के साथ अनुरोध करता है

हां, यह सही बात है, लेकिन इसका मतलब यह नहीं है कि विक्रेता परवाह करता है। जबकि मैं आपकी निराशा को पूरी तरह से समझता हूं, क्योंकि मुझे भी लगता है कि JSON सेवा को हमेशा JSON प्रतिक्रिया देनी चाहिए, लेकिन कई उदाहरण हैं जहां ऐसा नहीं है।

परियोजना के दौरान यह एक ही अभ्यास दो अलग-अलग विक्रेताओं और दो अलग-अलग सेवाओं में लागू किया गया है। मैंने खुद को यह बताना चाहा कि सेवाओं को बदलने की आवश्यकता क्यों है। विक्रेताओं ने कहा कि ग्राहक को इसके साथ सामना करना चाहिए और यहां तक ​​कि मेरी पसंद की REST लाइब्रेरी (रेस्टएसी) पर भी सवाल उठाया गया है क्योंकि यह डिफ़ॉल्ट रूप से 'बॉक्स आउट' से सामना नहीं करता है।

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

सवाल यह है कि क्या मुझे कुछ याद आ रहा है?

अनुरोध शीर्षलेखों का मतलब कुछ भी नहीं है जब तक कि वे दूसरे छोर पर सही ढंग से बाधित न हों। मुझे पता है कि अगर मैं PHP का उपयोग करके एक वेब एपीआई विकसित करता हूं, तो अनुरोध हेडर के साथ नरक में। मैं जो चाहूं, उसका जवाब दे सकता हूं। जबकि, C के साथ IIS में कॉन्फ़िगर की गई सेवा अनुरोध हेडर, उनके प्रकार और प्रतिक्रिया प्रकार को संभालने में बहुत आसान प्रदान करती है। एपीआई का निर्माण करने के लिए विक्रेता द्वारा उपयोग किए जाने वाले उपकरणों के साथ इसका बहुत कुछ करना है।

क्या मुझे इस बारे में पांडित्य हो रहा है?

हां और नहीं, मेरे पास डेवलपर मित्र हैं जो इस अतीत को आगे बढ़ाने में असमर्थ होंगे। जब तक एपीआई काम करने की उम्मीद नहीं कर लेगा, तब तक वे समस्या से ठीक हो जाएंगे और अन्य कार्यों में असमर्थ होंगे। अब वह पांडित्यपूर्ण हो रहा है।

यह एक समस्या है क्योंकि विक्रेता ने आपके कार्यों को पूरा करने के लिए "अधिक काम" बनाया है। इससे किसी को भी निराशा होती होगी। मैं जानता हूँ की मैं होंगा।

क्या JSON API होना ठीक है, जिसमें इस परिदृश्य में एप्लिकेशन / json की सामग्री-प्रकार नहीं है?

बिल्कुल, लेकिन यह एक अच्छा अभ्यास नहीं है।

एक क्लाइंट केवल सर्वर को बता सकता है कि संदर्भ का प्रकार क्या requestहै। इसमें सामग्री के लिए सामग्री-प्रकार लागू करने की कोई क्षमता नहीं है response। क्लाइंट केवल सर्वर को सूचित कर सकता है कि यह acceptसंभावित सामग्री-प्रकारों का एक संग्रह होगा ।

हेडर फील्ड परिभाषाएँ

कुछ मीडिया प्रकारों को निर्दिष्ट करने के लिए स्वीकार अनुरोध-हेडर फ़ील्ड का उपयोग किया जा सकता है जो प्रतिक्रिया के लिए स्वीकार्य हैं। स्वीकार हेडर का उपयोग यह इंगित करने के लिए किया जा सकता है कि अनुरोध विशेष रूप से वांछित प्रकारों के एक छोटे सेट तक सीमित है, जैसा कि इन-लाइन छवि के लिए अनुरोध के मामले में है।

क्लाइंट के लिए छवि का अनुरोध करना संभव है image/jpeg, लेकिन सर्वर प्रतिक्रियाएं text/htmlऔर 404छवि कोड नहीं मिलने पर स्थिति कोड के साथ । सर्वर गलत तरीके से जवाब भी दे सकते हैं। वहाँ कई वर्डप्रेस वेबसाइटें हैं जो फाइलों text/htmlके 200लिए स्टेटस कोड और स्टेटस कोड के साथ नहीं मिली हैं।

अब वह सब BAD प्रैक्टिस सर्वर के हिस्से पर है। जो मैं आपको बताने की कोशिश कर रहा हूं वह यह है कि यह बिल्कुल संभव है, और अक्सर होता है। जब वे इन चीजों को कॉन्फ़िगर करते हैं तो लोग नहीं जानते कि वे क्या कर रहे हैं।

संदर्भ की सराहना की जाएगी। आप वाणिज्यिक दृष्टिकोण से इस स्थिति को कैसे हल करते हैं?

मैं कुछ परियोजनाओं पर इस समस्या में चला गया हूँ। आप postJSON सर्वर को डेटा और यह या तो JSON या HTML प्रतिक्रिया देता है।

यह जानना वास्तव में कोई बड़ी बात नहीं है कि प्रतिक्रिया में कौन सा प्रकार था। यदि पहला चरित्र है {या [आप JSON मान सकते हैं। यदि यह <आप HTML मान सकते हैं। मैंने इसे अतीत में कैसे संभाला है। कभी-कभी एपीआई लिखने वाले प्रोग्रामर को एचटीटीपी हेडर के बारे में सब पता होता है। text/htmlप्रतिक्रिया के रूप में सब कुछ वापस आ जाता है । यदि आप भाग्यशाली हैं तो उनके पास अपाचे को डिफ़ॉल्ट रूप से कॉन्फ़िगर किया गया है text/plainजो कभी-कभी मदद कर सकता है।

ये समस्याएं मौजूद हैं और भविष्य में भी दूर तक मौजूद रहेंगी। सर्वर टू सर्वर संचार अब तक एक अनियमित गतिविधि है। ऐसा कोई शासी निकाय नहीं है जो किसी विक्रेता से खराब HTTP प्रतिक्रिया देने वाले सर्वर के लिए यूनियन से वेंडर को बाहर निकाल देगा।


यह @ मार्जन वेनेमा के उत्तर के साथ इनलाइन है लेकिन आपके द्वारा उठाया गया एक और महत्वपूर्ण बिंदु इस व्यवहार का दस्तावेजीकरण है। मेरी निराशा में जोड़ने के लिए विक्रेता ने इस व्यवहार का दस्तावेजीकरण नहीं किया है। सत्र-स्थिति के आधार पर सामग्री-प्रकार भिन्न होता है, फिर भी केवल JSON प्रतिक्रिया का दस्तावेजीकरण किया जाता है।
phillip.darley
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.