एपीआई चलाना, अगर मैं एक सामग्री-प्रकार के हेडर को सही करूं तो क्या ग्राहकों के लिए चीजें टूट जाएंगी?


14

हम एक एपीआई का उपयोग कर रहे हैं, जिसमें कुछ लोग इसका उपयोग कर रहे हैं। मेरी ओर से कुछ विरासत अनाड़ी होने के कारण, समापन बिंदु में से एक गलत सामग्री-प्रकार हेडर लौटा रहा है , jsजब यह होना चाहिए json। मेरा सवाल यह है कि अगर हम सही मूल्य वापस करने के लिए स्वैप करके इसे ठीक करते हैं, तो यह हमारे मौजूदा ग्राहकों के लिए कितनी बुरी तरह गड़बड़ कर सकता है? या इसे दूसरे तरीके से रखने के लिए, क्या आप कई अलग-अलग HTTP क्लाइंट पुस्तकालयों से इस तरह के बदलाव को देखते हुए घातक त्रुटियों को फेंकने की उम्मीद करेंगे?

हम यह तय करने की कोशिश कर रहे हैं कि क्या यह एक बदलाव है जिसे हम अभी आगे बढ़ सकते हैं और इसे बहुत अधिक पसीना बहाए बिना बना सकते हैं, या हमें सावधानीपूर्वक सभी उपयोगकर्ताओं को ईमेल करना चाहिए और बीच में एक बहु-वर्ष की अवधी अवधि ... या कुछ और की घोषणा करनी चाहिए।

यह शायद इस बात पर थोड़ा निर्भर करता है कि HTTP क्लाइंट किस तरह के उपयोग में हैं, इसलिए मैंने उपयोगकर्ता एजेंटों पर एक नज़र डाली। उत्तर: बहुत सारे अलग! यहाँ शीर्ष लोगों में से कुछ हैं:

"okhttp / 3.2.0", "अजगर-अनुरोध / 2.10.0", "रूबी", "अजगर-अनुरोध / 2.7.0", "मोज़िला / 5.0", "जावा / 1.8.0_91", "अजगर-अनुरोध / 2.4.3 "," okhttp / 3.3.0 "," Lucee "," Dalvik / 2.1.0 "," Google-HTTP-Java-Client / 1.21.0 "," PHP_appname "," NativeHost "," Java /1.7.0_67 "," Apache-HttpClient / UNAVAILABLE "," डाल्विक / 1.6.0 "," वेब-स्निफर / 1.1.0 "," अनरिस्ट-ओब्जेक्ट / 1.1 "

विभिन्न विभिन्न मोबाइल और सर्वर साइड लैंग्वेज लाइब्रेरी। ज्यादातर ब्राउज़र जावास्क्रिप्ट चलाने वाले नहीं हैं, लेकिन उनमें से कुछ भी।

ज्यादातर लोग यह नहीं देखते हैं कि सामग्री-प्रकार गलत है, लेकिन हर अब और फिर एक नया समर्थन अनुरोध इस मुद्दे के बारे में शिकायत करता है, इसलिए हम इसे ठीक करना चाहेंगे।


4
मुझे लगता है कि गलत सामग्री-प्रकार के हेडर के साथ सही ढंग से काम करने वाले ग्राहक एक बार सही सेट करने के बाद काम करना बंद नहीं करेंगे, लेकिन आप जानते हैं कि वे मान्यताओं के बारे में क्या कहते हैं। इसलिए परीक्षण करें, अपने उपयोगकर्ता आधार में अपने परिवर्तनों को अग्रिम रूप से संचारित करें और / या कुछ अतिरिक्त तर्क में निर्मित करें कि यदि एक निश्चित ग्राहक टूट जाता है, तो आप उस विशेष ग्राहक का पता लगा सकते हैं और गलत सामग्री प्रकार हेडर लौटा सकते हैं (या रिवर्स कर सकते हैं, वापस लौटा सकते हैं। उन ग्राहकों के लिए सही है जो समर्थन टिकट उत्पन्न करते हैं और वर्तमान उपयोगकर्ताओं / उपयोगकर्ता-एजेंटों के लिए सब कुछ समान रखते हैं)।
HBruijn

5
अनिवार्य xkcd: xkcd.com/1172
njzk2

क्या आप अपना एपीआई संस्करण नहीं बना रहे हैं?
माइकल हैम्पटन

हमारे पास पूरे एपीआई के लिए केवल एक प्रमुख संस्करण संख्या है जिसे हम केवल कुछ वर्षों में टकराते हुए देखेंगे जब हम कुछ बड़े पुनर्गठन करेंगे। उस बिंदु पर हम निश्चित रूप से इस मुद्दे को ठीक करेंगे, लेकिन ... लगता है कि हम ऐसा कभी नहीं कर सकते। यह उन संस्करण संख्याओं में से एक है।
हैरी वुड

जवाबों:


30

यह हमारे मौजूदा ग्राहकों के लिए कितनी बुरी तरह से गड़बड़ कर सकता है?

यह पूरी तरह से उनके युद्धपोतों को डुबो सकता है यदि उनके पास लिखित कोड है जो इस सामग्री-प्रकार पर निर्भर करता है जो गलत है।

मैं पुस्तकालयों से त्रुटियों को फेंकने की उम्मीद नहीं करूंगा, लेकिन मुझे उम्मीद है कि कुछ मामलों में गलत पुस्तकालयों ने गलत MIME प्रकार को संभालने के लिए अपने व्यवहार को ओवरराइड किया है।

यदि आपके API के पास अनुरोध क्षेत्र में कहीं संस्करण / संशोधन मूल्य है, तो उसे बढ़ाएं, और नए संस्करण में सही प्रकार लौटाएं लेकिन पुराने संस्करणों में गलत प्रकार लौटाते रहें। यदि आपके पास ऐसा कोई अनुरोध फ़ील्ड नहीं है, तो अब एक जोड़ने का एक अच्छा समय है।


6
+1 पहले से ही एक अच्छे हाइपरबोले के लिए
HB15ijn

4
अक्सर आपके पास कोई विकल्प नहीं होता है। ग्राहकों को "अपडेट या छुट्टी" देने का अल्टीमेटम बाद में तय कर सकता है, सिद्धांत में अच्छा, व्यवहार में बुरा। पुराने संस्करण को समय के साथ सेवानिवृत्त किया जा सकता है।
अल्जी

3
+1 vor अनुरोधों को पूरा करता है, हालांकि आप आगे की जानकारी के लिए en.wikipedia.org/wiki/Software_versioning देखना चाहते हैं।
SBoss

7
@InstonEwert: बेशक यह सार्थक है। लोग निर्दिष्ट करते हैं कि वे किस एपीआई संस्करण का उपयोग करना चाहते हैं, तो उनका कार्यक्रम अनायास आपके एपीआई को अपडेट करने और उनके कार्यक्रम को अपडेट करने के बीच समय पर दहन नहीं करता है। यदि आप ऐसा नहीं करते हैं, तो जब आप अपना इंटरफ़ेस बदलते हैं, तो आप अपने ग्राहकों के कोड की प्रत्येक वर्तमान और ऐतिहासिक रिलीज़ को स्वचालित रूप से तोड़ देते हैं । और यह एक सेवा चलाने का एक भयानक तरीका है।
मोनिका

1
यह एक बहुत अच्छे बिंदु की तरह लगता है: "मुझे उम्मीद है कि कुछ मामलों में सख्त पुस्तकालयों ने गलत माइम-प्रकार को संभालने के लिए अपने व्यवहार को ओवरराइड किया है" मेरा कूबड़ (पूरे प्रश्न के उत्तर के रूप में) यह है कि ग्राहक का विशाल बहुमत पुस्तकालय इसके साथ ठीक होंगे, लेकिन यह एक चिंता का विषय है। कुछ ग्राहकों ने इसके चारों ओर सक्रिय रूप से काम किया हो सकता है, और स्वैपिंग फिर उनके लिए इसे तोड़ देगा। मुझे आश्चर्य है कि कितना हुआ है।
हैरी वुड

11

क्या आप इस तरह के बदलाव को देखते हुए कई अलग-अलग HTTP क्लाइंट पुस्तकालयों से घातक त्रुटियों को फेंकने की उम्मीद करेंगे?

नहीं। मैं जिस हर HTTP क्लाइंट लाइब्रेरी से परिचित हूं, वह तब तक सामग्री-प्रकार के हेडर को अनदेखा कर देती है, जब तक कि प्रोग्रामर विशेष रूप से उस हेडर को नहीं पढ़ता है और उसके साथ कुछ करता है। मैं एक पुस्तकालय की कल्पना कर सकता हूँ जहाँ सामग्री-प्रकार: अनुप्रयोग / json स्वचालित रूप से एक json parser को शामिल करने का कारण बनता है, लेकिन मुझे किसी भी मामले का पता नहीं है जहाँ वास्तव में ऐसा होता है।

ज्यादातर लोग यह नहीं देखते हैं कि सामग्री-प्रकार गलत है, लेकिन हर अब और फिर एक नया समर्थन अनुरोध इस मुद्दे के बारे में शिकायत करता है, इसलिए हम इसे ठीक करना चाहेंगे।

उन्होंने गलत हेडर कैसे देखा? यह देखने लायक हो सकता है, क्योंकि अगर गलत हेडर वास्तव में उन्हें समस्या पैदा कर रहा था, तो वे स्पष्ट रूप से इसे अनदेखा नहीं कर रहे थे, और अगर यह ठीक हो जाता है, तो उन्हें समस्या हो सकती है।



यदि आप jQuery का उपयोग $.ajaxकरते हैं और dataType:विकल्प निर्दिष्ट नहीं करते हैं , तो यह Content-typeशीर्ष लेख से प्रतिक्रिया प्रकार को संक्रमित करता है । तो अगर यह है application/json, तो यह स्वचालित रूप से इसे कॉल करने वाले को पास करने से पहले पार्स कर देगा।
बर्मार

6

अपने सभी ग्राहकों से साइन-ऑफ प्राप्त किए बिना बताना बहुत कठिन है। मैं आपके एपीआई को v.Next में अपग्रेड करने के लिए निम्नलिखित दो दृष्टिकोणों में से एक लेने का सुझाव दूंगा।

  1. मौजूदा API बढ़ाएँ। अपने API में एक क्वेरी स्ट्रिंग या कुछ अन्य चर जोड़ें जो v.Next का उपयोग करने का संकेत देता है। उस चर का उपयोग करने वाले सभी अनुरोधों के लिए, अपडेट की गई सामग्री-प्रकार का उपयोग करें।
  2. अपने वर्तमान एपीआई के साथ समानांतर में अपने एपीआई के एक मचान या पूर्व उत्पादन उदाहरण चलाएँ। यह उत्पादन के समान होना चाहिए। यहां तक ​​कि एक ही बैक-एंड का उपयोग करते हुए। यद्यपि यह v.Next के लिए प्रस्तावित परिवर्तन होगा।

या तो परिदृश्य में, अपने ग्राहकों से उन बदलावों के लिए संवाद करें जिन्हें आप करना चाहते हैं और कटओवर तिथि / समय को लक्षित करें। कोई सेवा व्यवधान न हो, यह सुनिश्चित करने के लिए लक्ष्य तिथि से पहले अच्छी तरह से परीक्षण करने के लिए उन्हें प्रोत्साहित करें।

सुनिश्चित करें कि आपके पास v.Next में किए गए परिवर्तनों का विवरण देने वाला एक समर्पित पृष्ठ है। यह आपके क्लाइंट को भेजे गए संचार में शामिल होना चाहिए। यदि आपने मौजूदा ग्राहकों के साथ किसी भी सुधार पर चर्चा की है, तो उन्हें इस पृष्ठ पर शामिल करें।

अंत में, अपने ग्राहकों के साथ अधिक संवाद करने और उन्हें स्पैम करने के बीच की रेखा को फैलाएं। इन सूचनाओं को आसानी से अनदेखा किया जा सकता है क्योंकि अधिक तात्कालिक / अत्यावश्यक प्राथमिकताएँ सामने आती हैं।

FWIW, अगर चीजें वर्तमान में काम कर रही हैं तो मैं इसके बारे में बहुत ज्यादा चिंता नहीं करूंगा। यदि उदाहरण के लिए आप पाते हैं कि यह एक महत्वपूर्ण सुरक्षा भेद्यता का कारण बनता है तो यह इस बदलाव को बाहर लाने का एक बड़ा कारण होगा। अन्यथा मैं इस बदलाव को शामिल करने के लिए कुछ और दबाव का इंतजार करूंगा।


धन्यवाद। यह ऐसा उत्तर नहीं है जिसे मैं सुनना चाहता था, लेकिन शायद आप सही हैं। हमें बस बहुत सावधानी से बदलाव लाने की जरूरत है। हालांकि "यह बताना बहुत कठिन है"? मुझे लगता है कि मैं उम्मीद कर रहा था कि कुछ लोगों को इस विशेष प्रकार के सामग्री-प्रकार हेडर परिवर्तन के संभावित प्रभाव का अनुभव होगा (सावधानी से संस्करण बनाने के बारे में अधिक सामान्य बिंदुओं को छोड़कर)
हैरी वुड

5

यहाँ एक पुस्तकालय (अच्छी तरह से, एकल आदेश) का एक उदाहरण है जो इसे तोड़ देगा:

cmdlet Invoke-RestMethodJSON के साथ अलग कार्य करता है। यदि अनुरोध का परिणाम JSON, XML, या ATOM / RSS है (और मुझे लगता है कि यह हेडर पर आधारित है), तो यह इसे पार्स / डिसेरिअलाइज़ करता है और देशी ऑब्जेक्ट्स को लौटाता है, अन्यथा यह कच्चा डेटा लौटाता है।

तो मौजूदा कोड को एक स्ट्रिंग (शायद इसे पास करके ConvertFrom-Json) से निपटने के लिए लिखा जाएगा , और सभी अचानक असफल हो जाएंगे।


blogs.technet.microsoft.com/heyscriptingguy/2013/10/21/… हेडर को देखने वाले सिद्धांत की पुष्टि करता है।
विंस्टन इवर्ट

-2

मैंने दो परिणाम देखे हैं:

  1. कुछ क्लाइंट लाइब्रेरीज़ प्रतिक्रिया को ठीक से संसाधित नहीं करेंगे। उदाहरण के लिए, प्रतिक्रिया जौन या एक सरणी के बजाय एक स्ट्रिंग लौटाती है।
  2. संपीड़न हमेशा लागू नहीं किया जाता है।

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