2013-03-20 16 views
5

Ho un metodo google potrebbe enpoint che devo essere in grado di restituire uno MaleResponseMessage o uno FemaleResponseMessage. C'è un modo per specificare che ad esempio conmetodo endpoint cloud google con più messaggi di risposta

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

V'è, naturalmente, la possibilità di dichiarare una classe di super-messaggio, per esempio, PersonResponseMessage per avvolgere sia MaleResponseMessage o FemaleResponseMessage. Ma c'è qualcosa di simile allo snippet sopra?

EDIT:

Cercando di implementare la mia proposta, mi sono bloccato. L'unica cosa che i due tipi di messaggi hanno in comune è la richiesta: gli stessi campi di richiesta (con un booleano aggiuntivo female=true/false) per PersonRequest. MaleResponseMessage e FemaleResponseMessage non hanno alcun campo in comune. Quindi io sto usando un metodo endpoint, come dimostra @bossylobster, dove ho controllare

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

Per la risposta, ho bisogno di qualcosa come

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

Non sono sicuro di cosa controllare ??? per. Innanzitutto, ho pensato a isinstance o type. Ma come lo farei? Funzionerebbe il sotto?

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

Quello che mi piace della tua domanda è che sembra che tu sappia davvero le tue cose. Sei solo bloccato su questo problema. :) Ricordati di condividere la tua soluzione finale se @bossylobster o qualcun altro non è in grado di aiutarti ma ci arrivi comunque. – learner

+0

@Katedral Pillon, stai fraintendendo cosa stanno facendo le sottoclassi di 'messages.Message'. Sono lì per voi per creare una definizione del contenitore del buffer del protocollo, in modo da poter elencare solo i campi statici, non sono consentite istruzioni "if" condizionali. – bossylobster

risposta

2

È possibile utilizzare due diversi metodi di endpoint.

3

Purtroppo no. È possibile avere solo una risposta e uno schema di richiesta; questo perché sono registrati con l'infrastruttura API di Google e avere uno schema rigoroso è ciò che fornisce la velocità e l'efficienza delle richieste.

La soluzione migliore sarebbe combinare i campi necessari per ogni maschio e femmina in una singola classe di modello e fare la propria convalida.

Una possibile soluzione potrebbe sembrare

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 

e poi nel metodo attuale

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

dove male_response e female_response sono metodi che creano istanze di PersonMessage corrispondenti a maschio e femmina.

+0

Grazie mille per lo snippet di codice. Il mio problema particolare è che 'MaleResponseMessage' e' FemaleResponseMessage' non hanno campi in comune. Si prega di consultare la mia modifica per maggiori dettagli. Grazie molto. –

+0

Puoi provare a seguire 2 approcci: 1, usa l'opzione data da @bossylobster e crea un messaggio di risposta comune come PersonResponse che ha tutti i campi richiesti per la femmina e tutti i campi richiesti per il maschio. Ora, mentre invii la risposta effettiva, in base al sesso, assegna valori solo ai campi obbligatori per questo genere e metti in bianco o 0 negli altri campi per l'altro sesso.2, Oppure se il tuo MaleResponse e FemaleResponse hanno campi dello stesso tipo (come Messagefield) e in numeri uguali (diciamo 5), quindi usa un messaggio generale quali campi generici e assegna valori basati sul sesso scelto. –

Problemi correlati