2013-03-20 1 views
5

私は、MaleResponseMessageまたはFemaleResponseMessageのいずれかを返すことができる必要がある方法をgoogleが指摘できました。など複数の応答メッセージを使用したGoogleクラウドエンドポイントメソッド

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

でスーパーメッセージクラスを宣言するためのオプションは、もちろんありますように指定する方法はあり、たとえば、PersonResponseMessageMaleResponseMessageまたはFemaleResponseMessageのいずれかをラップします。しかし、上記のスニペットに類似したものがありますか?

EDIT:

は自分の提案を実装しようとすると、私が捕まってしまいました。 2つのメッセージタイプが共通して持つ唯一のものは、要求です。PersonRequestの場合、まったく同じ要求フィールド(追加のブール値female=true/false)があります。 MaleResponseMessageFemaleResponseMessageには共通するフィールドはありません。だから私は、私は応答のために

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

をチェック@bossylobsterショー、として、1つのエンドポイント法を使用しています、私は私が???をチェックするかわからないです

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

あなたの質問について私が好きなのは、あなたが実際にあなたのものを知っているようだということです。あなたはこの問題に立ち往生しています。 :) @bossylobsterや他の誰かが助けてくれることはないが、とにかくそこに行けば、最終的な解決策を分かち合いましょう。 – learner

+0

@Katedral Pillon、あなたは 'messages.Message'サブクラスが何をしているのか誤解しています。彼らはあなたがプロトコルバッファコンテナ定義を作成するためにそこにあるので、静的フィールドだけをリストすることができ、条件付き 'if'ステートメントは許可されません。 – bossylobster

答えて

2

2つの異なるエンドポイント方法を使用できます。

3

残念ながら、 1つの応答と1つの要求スキーマを持つことができます。これは、GoogleのAPIインフラストラクチャに登録されており、要求の速度と効率性を提供するスキーマが厳格であるためです。

あなたの最善の策は、男性と女性のそれぞれに必要なフィールドを1つのモデルクラスにまとめて、独自の検証を行うことです。

可能な解決策は、あなたの実際の方法

male_responsefemale_responseは、男性と女性に対応する PersonMessageのインスタンスを作成する方法です
@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 

、次にようになります。

+0

コードスニペットに感謝します。私の特に問題は、 'MaleResponseMessage'と' FemaleResponseMessage'に共通のフィールドがないことです。詳細は私の編集をご覧ください。どうもありがとう。 –

+0

以下の2つのアプローチを試してみることができます:1、@bossylobsterで指定されたオプションを使用し、PersonResponseのような共通の応答メッセージを作成します。現在、ジェンダーに基づいて実際の回答を送信する際には、このジェンダーの必須フィールドにのみ値を割り当て、他のジェンダーの場合は空欄または他のフィールドに0を設定します。2、またはMaleResponseとFemaleResponseに同じタイプのフィールド(Messagefieldなど)と等しい数(たとえば5)がある場合は、ジェネリックフィールドの一般メッセージを使用し、選択した性別に基づいて値を割り当てます。 –

関連する問題