2013-03-20 14 views
5

Mam metodę Google, która może wskazywać, że muszę mieć możliwość zwrócenia numeru MaleResponseMessage lub FemaleResponseMessage. Czy istnieje sposób, aby określić, że tak jak w przypadkugoogle metoda punktu końcowego w chmurze z komunikatem wielokrotnej odpowiedzi

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

Istnieje oczywiście możliwość deklarowania klasie Super wiadomość, powiedzmy, PersonResponseMessage zawinąć albo MaleResponseMessage lub FemaleResponseMessage. Ale czy jest coś podobnego do powyższego fragmentu?

EDIT:

Próbuje realizować własną propozycję, utknąłem. Jedyną rzeczą, która ma dwa typy komunikatów, jest żądanie: dokładnie te same pola żądania (z dodatkowym boolean female=true/false) dla PersonRequest. Pola MaleResponseMessage i FemaleResponseMessage nie mają wspólnego. Więc używam jedną metodę końcowego, jak @bossylobster pokazach, gdzie mogę sprawdzić

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

na odpowiedź, muszę coś takiego

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

nie jestem pewien co do sprawdzenia ??? dla. Najpierw pomyślałem o isinstance lub type. Ale jak miałbym to zrobić? Czy poniżej będzie działać?

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

To, co podoba mi się w twoim pytaniu, to fakt, że znasz swoje rzeczy. Po prostu utknąłeś w tej kwestii. :) Pamiętaj, aby udostępnić swoje ostateczne rozwiązanie, jeśli @bossylobster lub ktoś inny nie jest w stanie pomóc, ale dostaniesz się tam. – learner

+0

@ Katedral Pillon, nie rozumiesz, co robią podklasy 'messages.Message'. Są tam, aby utworzyć definicję kontenera bufora protokołu, więc można wyświetlać tylko pola statyczne, nie są dozwolone warunkowe wyrażenia "jeśli". – bossylobster

Odpowiedz

2

Można użyć dwóch różnych metod punktów końcowych.

3

Niestety nie. Możesz mieć tylko jedną odpowiedź i jeden schemat żądania; dzieje się tak dlatego, że są one zarejestrowane w infrastrukturze interfejsu API Google, a ścisły schemat zapewnia szybkość i wydajność żądań.

Najlepszym rozwiązaniem byłoby połączenie pól wymaganych dla każdego mężczyzny i kobiety w jedną klasę modelu i wykonanie własnej weryfikacji.

Możliwym rozwiązaniem może wyglądać

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 

, a następnie w sposób rzeczywisty

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

gdzie male_response i female_response są sposoby, które tworzą wystąpienia PersonMessage odpowiadające samców i samic.

+0

Wielkie dzięki za fragment kodu. Mój szczególny problem polega na tym, że "MaleResponseMessage" i "FemaleResponseMessage" nie mają wspólnych obszarów. Zobacz moją edycję po więcej szczegółów. Wielkie dzięki. –

+0

Możesz spróbować następujących 2 podejść: 1, Użyj opcji podanej przez @bossylobster i utwórz wspólny komunikat odpowiedzi, taki jak PersonResponse, który ma wszystkie pola wymagane dla kobiet i wszystkie pola wymagane dla mężczyzny. Teraz, przesyłając rzeczywistą odpowiedź, w oparciu o płeć, przypisz wartości tylko do wymaganych pól dla tej płci i umieść puste lub 0 w innych polach dla innej płci.2, Albo jeśli twoje MaleResponse i FemaleResponse mają pola tego samego typu (jak Messagefield) i w równych ilościach (powiedzmy 5), wtedy użyj ogólnej wiadomości, która generuje pola i przypisz wartości w oparciu o wybraną płeć. –

Powiązane problemy