RESTful API में उपयोगकर्ता अनुमतियों का स्तर


23

मान लीजिए कि मेरे पास एक कंपनी है जो इंटरनेट पर सबसे प्यारी बिल्लियों को रैंक करती है।

मैं एक संसाधन/cats/ प्रदान करता हूं जिस पर नवीनतम, सबसे प्यारे आराध्य बिल्लियों के साथ उपयोगकर्ता प्रदान करता है।

उपयोगकर्ता या तो केवल शीर्ष 3 बिल्लियाँ प्राप्त कर सकते हैं यदि उन्होंने बिलकुल भी भुगतान नहीं किया है या पंजीकृत नहीं है। शीर्ष 10 बिल्लियाँ यदि उन्होंने 337 डॉलर का भुगतान किया है और लॉग इन किया है, और शीर्ष 100 बिल्लियाँ यदि उन्होंने 1337 डॉलर का भुगतान किया है और लॉग इन हैं। अनुरोध करते समय मेरे पास एक 'उपयोगकर्ता पहचानकर्ता' है।

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

संसाधन को सीमित करने के लिए सबसे अच्छा अभ्यास क्या है क्योंकि उपभोक्ता के पास पर्याप्त निजीकरण नहीं है और इसे सीमित करना है क्योंकि उपभोक्ता के पास क्या है?

क्लाइंट को कैसे पता चलेगा कि वे अपनी रैंकिंग अपग्रेड कर सकते हैं? यही है, उन्हें केवल एक सीमित संसाधन मिला क्योंकि उनके पास अनुमतियां नहीं हैं। यहां सबसे अच्छा अभ्यास क्या है?

ध्यान दें, यह वास्तविक मामले का सकल सरलीकरण है। इसके अलावा, बस स्पष्ट करने के लिए - पढ़ने की सराहना की है।


अद्यतन करें:

यहां वे विकल्प दिए गए हैं जिन पर हमने विचार किया है:

  • उपयोगकर्ता की अनुमति ऑब्जेक्ट्स को एक बार क्लाइंट पर संग्रहीत करना, केवल इसके लिए क्वेरी करना जब खाता लॉगिन या अपग्रेड किया जाता है।
  • nullJSON में मानों को पास करना यह दर्शाता है कि मौजूद है, लेकिन एक वास्तविक कुछ भी स्थानांतरित नहीं किया गया था। तो 3 बिल्लियों वाले उपयोगकर्ता के लिए 10 बिल्लियाँ हो सकती हैं["Garfield","Sylvester","Puss in Boots",null*7]
  • संसाधन अनुमति जोड़ी पास करना {cats:["Whiskers","Fluffy","Socks"],authCount:3}

मैं सबसे सही तरीके से सबसे प्यारे बिल्लियों को वितरित करने के लिए यह सही समय पर करना चाहता हूं और हम चाहेंगे और हम चाहेंगे


4
अब मैं सुंदर बिल्लियों की तस्वीरें देखना चाहता हूँ
कैरी केंडल

मुझे नहीं मिला। यदि आप कहीं भी 'उपयोगकर्ता स्तर' संग्रहीत नहीं करते हैं, तो आप अंतर नहीं कर सकते। ऐसा लगता है कि आपके पास सर्वर पर संग्रहीत कोई भी उपयोगकर्ता जानकारी नहीं है, इसलिए आप इसके साथ अपने उपयोगकर्ता स्तर को संग्रहीत नहीं कर सकते।
जान डॉगजेन

@JanDoggen मेरे पास सर्वर पर उपयोगकर्ता स्तर है (क्लाइंट सर्वर को पहचानकर्ता को बताता है)।
बेंजामिन ग्रुएनबाम

मदद? मुझे 1337 संदर्भ नहीं मिलता है?
मार्जन वेनेमा

जवाबों:


18

मैं कहूंगा कि यह आपके दर्शकों पर निर्भर करता है।

नो-देव

यदि आपके दर्शक एक डेवलपर नहीं हैं, तो मैं निम्नलिखित तरीके से जाऊंगा:

मान लीजिए कि आप JSON को उदाहरण के लिए वापस करते हैं।

GET /cats HTTP/1.1

{
    "cats": [
        "Can I haz cheeseburger",
        "If it fits, I sits",
        "It's caturday!"
    ],
    "permissions": {
        "level": "free",
        "information": "You have access to 3 cats. Upgrade to ... to get 10 cats!"
    }
}

या कुछ इसी तरह।

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

देव

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

यहाँ एक उदाहरण है:

GET /cats HTTP/1.1

X-Account: anonymous
X-Account-Possible-Upgrades: 2
X-Account-Limit: 3

फिर, इन हेडर का स्पष्ट अर्थ प्रदान करें। जब वे इन कस्टम हेडर को देखेंगे, तो अधिकांश डेवलपर्स सीधे डॉक्यूमेंटेशन के लिए जाएंगे, खासकर यदि वे एक सीमा देख रहे हों। आप आगे भी जा सकते हैं और हेडर में लिंक दिखा सकते हैं। या आप मूल्य निर्धारण पृष्ठ के लिए एक लिंक दिखा सकते हैं।

X-Account-Doc: http://your/doc

लेकिन फिर, कई डेवलपर्स नहीं जानते कि HTTP कैसे काम करता है।

तो यह आपकी कॉल है

एक अधिक सही है, दूसरा अधिक सुलभ है।

विविध

आपके प्रश्न से संबंधित कुछ अन्य विविध चीजें:


1
हाँ, यह पूर्ण समझ में आता है, हालांकि एक साइड नोट के रूप में मुझे HTTP हेडर में जाने वाली कुछ मौखिक (ent / orize) जानकारी मिलती है, यह एक उपयुक्त तरीका है क्योंकि यह प्रभावी रूप से मेटाडेटा है।
जिमी होफा जूल

@JimmyHoffa यह वास्तव में मेटाडेटा है, और मेरा पहला विचार HTTP हेडर का उपयोग करना था। हालाँकि, इस मामले में, HTTP शीर्ष लेख ग्राहक के लिए पर्याप्त दृश्यता प्रदान नहीं करते हैं, और विपणन संदेशों के लिए आवश्यक ग्रैन्युलैरिटी। (इस विवरण को जोड़ने का उत्तर संपादित किया।)
फ्लोरियन मार्गाइन

@ जिमीहॉफा कैसे? 402 इस मामले में नहीं करेंगे। आपकी क्या सलाह है?
बेंजामिन ग्रुएनबाम

@BenjaminGruenbaum मैंने प्रतिक्रिया कोड नहीं कहा, मैंने हेडर कहा; आप मेटाडेटा के लिए इच्छित सभी कस्टम हेडर जोड़ सकते हैं, यह एक बुद्धिमान एपीआई से सभी प्रतिक्रियाओं के लिए बुद्धिमान होगा बस हेडर में एक उपयोगकर्ता की भूमिका है UserRole = level1या जो भी आप इसे कॉल करना चाहते हैं बस यह सुनिश्चित करने के लिए कि उपभोक्ता हमेशा जागरूक रहें किसी भी डेटा को वे प्राप्त करते हैं, और यह सभी प्रतिक्रियाओं के अनुरूप है, जहां वापस आने वाले डेटा मॉडल एक अनुरोध से दूसरे में भिन्न होंगे, उपभोक्ता हमेशा अपनी भूमिका की उसी तरह जांच कर सकते हैं।
जिमी होफा जूल

1
@BenjaminGruenbaum मैंने पूरी तरह से उत्तर को फिर से लिखा है।
फ्लोरियन मार्गाइन

4

क्लाइंट को कैसे पता चलेगा कि वे अपनी रैंकिंग अपग्रेड कर सकते हैं?

जो क्लाइंट पर निर्भर करता है। आम तौर पर आप इस तरह की जानकारी को एक हाइपरटेक्स्ट मैसेज (उर्फ एचटीएमएल) के रूप में आरईएसटी पद्धति की प्रतिक्रिया दे सकते हैं। हालाँकि यह केवल तभी समझ में आता है जब REST API का उपयोग HTML क्लाइंट के साथ किया जाता है।

XML और JSON के लिए समान है।


संपादित करें: आप अपने खाता-प्रकार / उपयोगकर्ता-योजनाओं के विपणन के साथ एक एपीआई (इस संक्षिप्त विवरण का विस्तार) का उपयोग करके भ्रमित कर सकते हैं। मैं इसे नहीं मिलाऊंगा, क्योंकि यह हमेशा गड़बड़ हो जाता है (व्यावसायिक निर्णयों को सॉफ़्टवेयर में परिवर्तनों की तुलना में तेज़ी से परिवर्तनों की आवश्यकता हो सकती है क्योंकि इन परिवर्तनों के कारण विभिन्न प्रतिक्रियाओं को समय पर हल करने में सक्षम हैं)।

इसके बजाय अपने उपयोगकर्ताओं को एक अलग चैनल के माध्यम से बताएं, जैसे कि समाचार पत्र के साथ उनके लाभ क्या हैं।

यह विशेष रूप से अच्छी तरह से काम करता है जब सेवा में साइन अप करने वाला व्यक्ति वह नहीं है जो एपीआई के खिलाफ प्रोग्रामिंग कर रहा है। उदाहरण के लिए:

जॉर्ज (जो 36 प्यार करने वाले बिल्ली के बच्चे की उम्र में एक गर्व से समलैंगिक लड़का है) प्यारा-cats-4-me.com तक पहुंच प्राप्त करता है और अपने 16 वर्षीय पति (जो स्क्रिप्टिंग कंप्यूटर सिस्टम इंक। लिनक्स के साथ अच्छी तरह से बनाता है) को बनाने के लिए कहता है। डिजिटल साइनेज एप्लिकेशन अपार्टमेंट में दीवार पर अच्छी छोटी प्यारी बिल्ली के बच्चे को प्रदर्शित करता है।

तो जो आदमी वास्तव में मजेदार प्रोग्रामिंग कर रहा है, वह सूचना का सबसे सीधा-सीधा पता नहीं है।

वैकल्पिक रूप से लॉगिन और एक उपयोगकर्ता-जानकारी विधि के जवाब में, सभी विवरण प्रदान करें।

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

अन्यथा, उन्हें अधिक क्वेरी करने की अनुमति दें और यदि उनके अधिकार पर्याप्त नहीं हैं, तो विफलता की सूचना दें। लेकिन फिर, यह एक उपयोगकर्ता के अनुकूल सॉफ्टवेयर नहीं है।


1
@ रैकेट: क्या आपको कोई समस्या है जब लड़कियों के पास घर में पैसा है और लड़कों को बताएं कि क्या करना है?
हकर्रे

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