2013-03-20 11 views
5

मेरे पास एक Google यह तरीका बता सकता है कि मुझे MaleResponseMessage या FemaleResponseMessage वापस करने में सक्षम होना चाहिए। वहाँ किएकाधिक प्रतिक्रिया संदेश के साथ Google क्लाउड एंडपॉइंट विधि

@endpoints.method(message_types.VoidMessage, [MaleResponseMessage, FemaleResponseMessage]) 

जैसे के साथ वहाँ निश्चित रूप से एक सुपर संदेश वर्ग घोषित करने का विकल्प है निर्दिष्ट करने के लिए एक रास्ता है, कहते हैं, PersonResponseMessage या तो MaleResponseMessage या FemaleResponseMessage रैप करने के लिए। लेकिन क्या उपरोक्त स्निपेट के समान कुछ है?

संपादित करें:

अपने ही प्रस्ताव को लागू करने की कोशिश कर रहा है, मैं अटक गई। दो संदेश प्रकारों में एकमात्र चीज आम है: अनुरोध: PersonRequest के लिए सटीक वही अनुरोध फ़ील्ड (अतिरिक्त बूलियन female=true/false के साथ)। MaleResponseMessage और FemaleResponseMessage में कोई फ़ील्ड आम नहीं है। तो मैं एक endpoint विधि का उपयोग कर रहा हूँ, @bossylobster शो, जहां मैं

if request.female : # request.female == True 
    return get_female(etc, etc) 
else: # request.female == False // implies male 
    return get_male(etc,etc) 

जाँच प्रतिक्रिया के लिए के रूप में, मैं की तरह

class PersonResponse(messages.Message): 
    if ??? : 
    item = messages.MessageField(MaleResponseMessage,1) 
    else: 
     item = messages.MessageField(FemaleResponseMessage,1) 

कुछ मैं क्या के लिए ??? जाँच करने के लिए यकीन नहीं है की जरूरत है। सबसे पहले, मैंने isinstance या type के बारे में सोचा। लेकिन मैं यह कैसे करूँगा? नीचे काम करेंगे?

class PersonResponse(messages.Message): 
    if type(Message()) == MaleResponseMessage : 
    item = messages.MessageField(MaleResponseMessage,1) 
    else: 
     item = messages.MessageField(FemaleResponseMessage,1) 
+0

मुझे आपके प्रश्न के बारे में क्या पसंद है यह है कि आप वास्तव में अपनी सामग्री को जानते हैं। आप इस मुद्दे पर फंस गए हैं। :) अपने अंतिम समाधान को साझा करना याद रखें अगर @ बॉसिलोबस्टर या कोई और मदद करने में सक्षम नहीं है लेकिन आप वैसे भी वहां पहुंचते हैं। – learner

+0

@ केटर्रल पिल्लॉन, आप गलत तरीके से क्या कर रहे हैं 'संदेश। संदेश' उपclasses कर रहे हैं। वे आपके लिए प्रोटोकॉल बफर कंटेनर परिभाषा बनाने के लिए हैं, इसलिए आप केवल स्थिर फ़ील्ड सूचीबद्ध कर सकते हैं, कोई सशर्त 'if' कथन की अनुमति नहीं है। – bossylobster

उत्तर

2

आप दो अलग-अलग एंडपॉइंट विधियों का उपयोग कर सकते हैं।

3

दुर्भाग्य से नहीं। आपके पास केवल एक प्रतिक्रिया हो सकती है और एक अनुरोध स्कीमा हो सकता है; ऐसा इसलिए है क्योंकि वे Google के एपीआई इंफ्रास्ट्रक्चर के साथ पंजीकृत हैं और सख्त स्कीमा है जो अनुरोधों की गति और दक्षता प्रदान करता है।

आपकी सर्वश्रेष्ठ शर्त प्रत्येक नर और मादा के लिए आवश्यक फ़ील्ड को एक मॉडल श्रेणी में जोड़ना और अपनी खुद की सत्यापन करना होगा।

सम्भावित समाधान अपने वास्तविक विधि

@endpoints.method(GenderRequest, PersonMessage, ...) 
    def my_method(self, request): 
     if request.gender == Gender.MALE: 
      return male_response(request) 
     elif request.gender == Gender.FEMALE: 
      return female_response(request) 
     else: 
      # This should never occur since gender is required 
      raise endpoints.BadRequestException('Gender not set.') 

में तरह

from protorpc import messages 

class Gender(messages.Enum): 
    MALE = 0 
    FEMALE = 1 

class GenderRequest(messages.Enum): 
    gender = messages.EnumField(Gender, 1, required=True) 

class PersonResponse(messages.Message): 
    gender = messages.EnumField(Gender, 1) 
    # shared fields 
    # female specific fields 
    # male specific fields 

देखो और फिर जहां male_response और female_response तरीकों जो पुरुष और महिला के लिए इसी PersonMessage का उदाहरण बना रहे हैं हो सकता है।

+0

कोड स्निपेट के लिए बहुत धन्यवाद। मेरी विशेष समस्या यह है कि 'MaleResponseMessage' और' FemaleResponseMessage' में कोई फ़ील्ड सामान्य नहीं है। अधिक जानकारी के लिए कृपया मेरा संपादन देखें। बहुत धन्यवाद। –

+0

आप 2 दृष्टिकोणों का पालन करने का प्रयास कर सकते हैं: 1, @ बॉसिलोबस्टर द्वारा दिए गए विकल्प का उपयोग करें और एक सामान्य प्रतिक्रिया संदेश बनाएं जैसे PersonResponse जिसमें मादा के लिए आवश्यक सभी फ़ील्ड और नर के लिए आवश्यक सभी फ़ील्ड हैं। अब लिंग के आधार पर वास्तविक प्रतिक्रिया भेजते समय, केवल इस लिंग के लिए आवश्यक फ़ील्ड के लिए मूल्य असाइन करें और अन्य लिंग के लिए अन्य फ़ील्ड में रिक्त या 0 डालें।2, अन्यथा यदि आपके MaleResponse और FemaleResponse में समान प्रकार के फ़ील्ड हैं (जैसे संदेशक्षेत्र) और समान संख्याओं में (5 कहें), तो सामान्य संदेश का उपयोग करें जो सामान्य फ़ील्ड और चुने गए लिंग के आधार पर मान असाइन करें। –

संबंधित मुद्दे