2013-03-20 34 views
5

Tôi có phương pháp có thể xác định được google mà tôi cần để có thể trả về số MaleResponseMessage hoặc FemaleResponseMessage. Có cách nào để xác định rằng chẳng hạn như vớiphương thức điểm cuối đám mây của google với nhiều thông báo phản hồi

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

Có tất nhiên tùy chọn khai báo một lớp thông báo siêu, nói, PersonResponseMessage quấn hoặc MaleResponseMessage hoặc FemaleResponseMessage. Nhưng có cái gì đó tương tự như đoạn trên?

EDIT:

Cố gắng triển khai đề xuất của riêng tôi, tôi bị kẹt. Điều duy nhất mà hai loại thông báo có điểm chung là yêu cầu: các trường yêu cầu chính xác giống nhau (với boolean bổ sung female=true/false) cho PersonRequest. Các MaleResponseMessageFemaleResponseMessage không có trường chung. Vì vậy, tôi đang sử dụng một phương pháp thiết bị đầu cuối, như chương trình @bossylobster, nơi tôi kiểm tra

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

Đối với câu trả lời, tôi cần một cái gì đó giống như

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

Tôi không chắc chắn những gì để kiểm tra ??? cho. Trước tiên, tôi nghĩ về isinstance hoặc type. Nhưng tôi sẽ làm thế nào? Công việc dưới đây có được không?

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

Điều tôi thích về câu hỏi của bạn là bạn dường như thực sự biết nội dung của mình. Bạn chỉ bị mắc kẹt về vấn đề này. :) Hãy nhớ chia sẻ giải pháp cuối cùng của bạn nếu @bossylobster hoặc một người nào khác không thể giúp bạn nhưng bạn vẫn đạt được điều đó. – learner

+0

@Katedral Pillon, bạn đang hiểu nhầm các lớp con 'messages.Message' đang làm gì. Chúng có sẵn cho bạn để tạo một định nghĩa vùng chứa bộ đệm giao thức, vì vậy bạn chỉ có thể liệt kê các trường tĩnh, không cho phép các câu lệnh if' có điều kiện. – bossylobster

Trả lời

2

Bạn có thể sử dụng hai phương pháp điểm cuối khác nhau.

3

Thật không may là không. Bạn chỉ có thể có một đáp ứng và một lược đồ yêu cầu; điều này là do chúng được đăng ký với cơ sở hạ tầng API của Google và có một lược đồ nghiêm ngặt là những gì cung cấp tốc độ và hiệu quả của các yêu cầu.

Đặt cược tốt nhất của bạn sẽ là kết hợp các trường cần thiết cho mỗi nam và nữ thành một lớp mô hình đơn và thực hiện xác thực của riêng bạn.

Một giải pháp khả thi có thể trông giống như

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 

và sau đó trong phương pháp thực tế của bạn

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

nơi male_responsefemale_response là phương pháp mà tạo ra các trường hợp PersonMessage tương ứng với nam và nữ.

+0

Cảm ơn rất nhiều vì đoạn mã. Vấn đề cụ thể của tôi là 'MaleResponseMessage' và' FemaleResponseMessage' không có trường chung. Vui lòng xem chỉnh sửa của tôi để biết thêm chi tiết. Cảm ơn nhiều. –

+0

Bạn có thể thử theo 2 cách tiếp cận: 1, Sử dụng tùy chọn do @bossylobster đưa ra và tạo một thông báo phản hồi chung như PersonResponse có tất cả các trường bắt buộc cho nữ và tất cả các trường bắt buộc cho nam. Bây giờ trong khi gửi phản hồi thực tế, dựa trên giới tính, chỉ gán giá trị cho các trường bắt buộc cho giới tính này và để trống hoặc 0 trong các trường khác cho giới tính khác.2, Hoặc nếu MaleResponse và FemaleResponse của bạn có các trường cùng loại (như Messagefield) và với số lượng bằng nhau (nói 5), sau đó sử dụng một thông báo chung chung và gán giá trị dựa trên giới tính đã chọn. –

Các vấn đề liên quan