2013-03-20 58 views
5

我有一個谷歌可能enpoint方法,我需要能夠返回MaleResponseMessageFemaleResponseMessage。是否有指定例如與谷歌雲端點方法與多個響應消息

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

當然有聲明的超級郵件類的選項的方式,比方說,PersonResponseMessage包裹要麼MaleResponseMessageFemaleResponseMessage。但是有沒有類似於上面的代碼片段?

編輯:

試圖執行我自己的建議,我被卡住了。這兩種消息類型唯一共同的就是請求:對於PersonRequest,完全相同的請求字段(其他布爾值爲female=true/false)。 MaleResponseMessageFemaleResponseMessage沒有共同的字段。所以我用一個端點法,如@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) 

我不知道該怎麼檢查???的。首先,我想過isinstancetype。但我該怎麼做?以下工作?

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

我喜歡你的問題是你似乎真的知道你的東西。你只是停留在這個問題上。 :)請記住分享您的最終解決方案,如果@bossylobster或其他人無法提供幫助,但無論如何你都能到達那裏。 – learner 2013-03-20 18:20:11

+0

@Katedral Pillon,你誤解了'messages.Message'子類正在做什麼。他們在那裏爲你創建一個協議緩衝區容器定義,所以你只能列出靜態字段,不允許有條件的'if'語句。 – bossylobster 2013-03-22 20:48:28

回答

2

您可以使用兩種不同的端點方法。

3

不幸的是沒有。您只能有一個響應和一個請求模式;這是因爲他們在Google的API基礎架構中進行了註冊,並且具有嚴格的架構可以提供請求的速度和效率。

最好的辦法是將每個男性和女性需要的字段合併到一個模型類中,然後進行自己的驗證。

一個可能的解決方案可能看起來像

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 

,然後在您的實際方法

@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.') 

其中male_responsefemale_response是其創建對應於男性和女性的PersonMessage實例的方法。

+0

非常感謝代碼片段。我特別的問題是'MaleResponseMessage'和'FemaleResponseMessage'沒有共同的字段。請參閱我的編輯瞭解更多詳情。非常感謝。 – 2013-03-20 18:15:50

+0

您可以嘗試以下兩種方法:1,使用@bossylobster給出的選項並創建一個常見的響應消息,如PersonResponse,其中包含女性所需的所有字段以及男性需要的所有字段。現在,在發送基於性別的實際響應時,將值僅指定給此性別的必需字段,並將空白或0指定給其他字段的其他字段。2,否則,如果您的MaleResponse和FemaleResponse具有相同類型的字段(如消息字段)並且數目相同(例如5),則使用一般消息通用字段並根據所選性別分配值。 – 2013-04-23 09:55:29